Skip to content

Commit f02ee8a

Browse files
authored
Weekly updates (#5)
* restructure to support additional file formats * update for dim3 template * rename simloader to bseq * minor fix * add notes * use blender driver system to control frames * small update with frame driver * disbale the function when not in object mode * small fix * rewrite edit * add global settings for refresh
1 parent 7c090ec commit f02ee8a

File tree

9 files changed

+98
-47
lines changed

9 files changed

+98
-47
lines changed

bseq/__init__.py

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,18 @@
1-
from .operators import BSEQ_OT_load, BSEQ_OT_edit, BSEQ_OT_resetpt, BSEQ_OT_resetmesh, BSEQ_OT_resetins,BSEQ_OT_set_as_split_norm,BSEQ_OT_remove_split_norm,BSEQ_OT_disable_selected,BSEQ_OT_enable_selected,BSEQ_OT_refresh_seq
2-
from .properties import BSEQ_scene_property, BSEQ_obj_property,BSEQ_mesh_property
1+
from bseq.utils import refresh_obj
2+
from .operators import BSEQ_OT_load, BSEQ_OT_edit, BSEQ_OT_resetpt, BSEQ_OT_resetmesh, BSEQ_OT_resetins, BSEQ_OT_set_as_split_norm, BSEQ_OT_remove_split_norm, BSEQ_OT_disable_selected, BSEQ_OT_enable_selected, BSEQ_OT_refresh_seq
3+
from .properties import BSEQ_scene_property, BSEQ_obj_property, BSEQ_mesh_property
34
from .panels import BSEQ_UL_Obj_List, BSEQ_List_Panel, BSEQ_Settings, BSEQ_Import, BSEQ_Templates, BSEQ_UL_Att_List, draw_template
45
from .messenger import subscribe_to_selected, unsubscribe_to_selected
56
import bpy
67
from bpy.app.handlers import persistent
78
from .importer import update_obj
8-
from datetime import datetime
9-
10-
11-
def print_information(scene):
12-
if not bpy.context.scene.BSEQ.print:
13-
return
14-
now = datetime.now()
15-
path = bpy.context.scene.render.filepath
16-
path = bpy.path.abspath(path)
17-
filepath = path + '/bseq_' + now.strftime("%Y-%m-%d_%H-%M")
18-
with open(filepath, 'w') as file:
19-
file.write("Render Time: {}\n".format(now.strftime("%Y-%m-%d_%H-%M")))
20-
file.write("bseq Objects in the scene:\n\n")
21-
for obj in bpy.data.objects:
22-
bseq_prop = obj.BSEQ
23-
if bseq_prop.init:
24-
file.write("Object name: {}\n".format(obj.name))
25-
file.write("Is it being animated: {}\n".format(bseq_prop.enabled))
26-
file.write("Filepath: {}\n".format(bseq_prop.pattern))
27-
file.write("Is it relative path: {}\n".format(bseq_prop.use_relative))
28-
file.write("\n\n")
9+
from .globals import *
2910

3011

3112
@persistent
3213
def BSEQ_initialize(scene):
3314
if update_obj not in bpy.app.handlers.frame_change_post:
15+
bpy.app.handlers.frame_change_post.append(auto_refresh)
3416
bpy.app.handlers.frame_change_post.append(update_obj)
3517
subscribe_to_selected()
3618
if print_information not in bpy.app.handlers.render_init:

bseq/callback.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,7 @@ def update_selected_obj_num(self, context):
4848

4949

5050
def poll_material(self, material):
51-
return not material.is_grease_pencil
51+
return not material.is_grease_pencil
52+
53+
def poll_edit_obj(self, object):
54+
return object.BSEQ.init

bseq/globals.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# here are the implementations of global settings
2+
3+
import bpy
4+
from datetime import datetime
5+
import os
6+
from .utils import refresh_obj
7+
8+
def print_information(scene):
9+
if not bpy.context.scene.BSEQ.print:
10+
return
11+
now = datetime.now()
12+
path = bpy.context.scene.render.filepath
13+
path = bpy.path.abspath(path)
14+
if not os.path.isdir(path):
15+
# by default, path is '/tmp', and it does not exist on windows system
16+
return
17+
filepath = path + '/bseq_' + now.strftime("%Y-%m-%d_%H-%M")
18+
with open(filepath, 'w') as file:
19+
file.write("Render Time: {}\n".format(now.strftime("%Y-%m-%d_%H-%M")))
20+
file.write("bseq Objects in the scene:\n\n")
21+
for obj in bpy.data.objects:
22+
bseq_prop = obj.BSEQ
23+
if bseq_prop.init:
24+
file.write("Object name: {}\n".format(obj.name))
25+
file.write("Is it being animated: {}\n".format(bseq_prop.enabled))
26+
file.write("Filepath: {}\n".format(bseq_prop.pattern))
27+
file.write("Is it relative path: {}\n".format(bseq_prop.use_relative))
28+
file.write("\n\n")
29+
30+
31+
def auto_refresh(scene, depsgraph=None):
32+
if not bpy.context.scene.BSEQ.auto_refresh:
33+
return
34+
for obj in bpy.data.objects:
35+
if obj.BSEQ.init == False:
36+
continue
37+
if obj.BSEQ.enabled == False:
38+
continue
39+
if obj.mode != "OBJECT":
40+
continue
41+
refresh_obj(obj)

bseq/importer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ def create_obj(fileseq, use_relaitve, transform_matrix=Matrix([[1, 0, 0, 0], [0,
164164
object.BSEQ.init = True
165165
object.BSEQ.enabled = enabled
166166
object.matrix_world = transform_matrix
167+
driver = object.driver_add("BSEQ.frame")
168+
driver.driver.expression = 'frame'
167169
if enabled:
168170
update_mesh(meshio_mesh, object.data)
169171
bpy.context.collection.objects.link(object)
@@ -172,16 +174,16 @@ def create_obj(fileseq, use_relaitve, transform_matrix=Matrix([[1, 0, 0, 0], [0,
172174

173175

174176
def update_obj(scene, depsgraph=None):
175-
# TODO if bpy in edit mode, then return
176-
177-
current_frame = bpy.context.scene.frame_current
178177

179178
for obj in bpy.data.objects:
180179
if obj.BSEQ.init == False:
181180
continue
182181
if obj.BSEQ.enabled == False:
183182
continue
183+
if obj.mode != "OBJECT":
184+
continue
184185

186+
current_frame = obj.BSEQ.frame
185187
meshio_mesh = None
186188
pattern = obj.BSEQ.pattern
187189
if obj.BSEQ.use_relative:

bseq/messenger.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def selected_callback():
1010
bpy.context.scene.BSEQ.selected_obj_deselectall_flag = False
1111
bpy.context.scene.BSEQ.selected_obj_num = idx
1212
bpy.context.scene.BSEQ.selected_obj_deselectall_flag = True
13-
13+
if bpy.context.active_object.BSEQ.init:
14+
bpy.context.scene.BSEQ.edit_obj = bpy.context.active_object
1415

1516
def subscribe_to_selected():
1617
import bseq

bseq/operators.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import fileseq
33
from .messenger import *
44
import traceback
5-
from .utils import show_message_box
5+
from .utils import refresh_obj, show_message_box
66
from .importer import create_obj
77
import numpy as np
88

@@ -79,10 +79,12 @@ def execute(self, context):
7979
return {"CANCELLED"}
8080

8181
sim_loader = context.scene.BSEQ
82+
83+
# logic here
8284
# it seems quite simple task, no need to create a function(for now)
83-
if sim_loader.selected_obj_num >= len(bpy.data.objects):
85+
obj = sim_loader.edit_obj
86+
if not obj:
8487
return {"CANCELLED"}
85-
obj = bpy.data.objects[sim_loader.selected_obj_num]
8688
if importer_prop.relative:
8789
obj.BSEQ.pattern = bpy.path.relpath(str(fs))
8890
else:
@@ -110,7 +112,7 @@ def execute(self, context):
110112
gn = obj.modifiers.new("BSEQ_GeometryNodse", "NODES")
111113
# change starting from blender 3.2
112114
# https://developer.blender.org/rB08b4b657b64f
113-
if bpy.app.version >= (3,2,0):
115+
if bpy.app.version >= (3, 2, 0):
114116
bpy.ops.node.new_geometry_node_group_assign()
115117
gn.node_group.nodes.new('GeometryNodeMeshToPoints')
116118
set_material = gn.node_group.nodes.new('GeometryNodeSetMaterial')
@@ -145,7 +147,7 @@ def execute(self, context):
145147
gn = obj.modifiers.new("BSEQ_GeometryNodse", "NODES")
146148
# change starting from blender 3.2
147149
# https://developer.blender.org/rB08b4b657b64f
148-
if bpy.app.version >= (3,2,0):
150+
if bpy.app.version >= (3, 2, 0):
149151
bpy.ops.node.new_geometry_node_group_assign()
150152
bpy.ops.object.modifier_move_to_index(modifier=gn.name, index=0)
151153
return {"FINISHED"}
@@ -170,7 +172,7 @@ def execute(self, context):
170172
gn = obj.modifiers.new("BSEQ_GeometryNodse", "NODES")
171173
# change starting from blender 3.2
172174
# https://developer.blender.org/rB08b4b657b64f
173-
if bpy.app.version >= (3,2,0):
175+
if bpy.app.version >= (3, 2, 0):
174176
bpy.ops.node.new_geometry_node_group_assign()
175177
nodes = gn.node_group.nodes
176178
links = gn.node_group.links
@@ -268,15 +270,6 @@ class BSEQ_OT_refresh_seq(bpy.types.Operator):
268270
def execute(self, context):
269271
scene = context.scene
270272
obj = bpy.data.objects[scene.BSEQ.selected_obj_num]
271-
272-
fs = obj.BSEQ.pattern
273-
if obj.BSEQ.use_relative:
274-
fs = bpy.path.abspath(fs)
275-
fs = fileseq.findSequenceOnDisk(fs)
276-
fs = fileseq.findSequenceOnDisk(fs.dirname() + fs.basename() + "@" + fs.extension())
277-
fs = str(fs)
278-
if obj.BSEQ.use_relative:
279-
fs = bpy.path.relpath(fs)
280-
obj.BSEQ.pattern = fs
273+
refresh_obj(obj)
281274

282275
return {"FINISHED"}

bseq/panels.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ def draw_item(self, context, layout, data, item, icon, active_data, active_propn
2626
row.prop(item, "name", text='Name ', emboss=False)
2727
if item.BSEQ.enabled:
2828
row.prop(item.BSEQ, "enabled", text = "ENABLED", icon="PLAY")
29+
row.prop(item.BSEQ, "frame", text = "Current Frame:")
2930
else:
3031
row.prop(item.BSEQ, "enabled", text = "DISABLED", icon="PAUSE")
32+
row.label(text = "Animation Stopped")
3133
else:
3234
# actually, I guess this line of code won't be executed?
3335
layout.label(text="", translate=False, icon_value=icon)
@@ -71,8 +73,6 @@ def draw(self, context):
7173
row = layout.row()
7274
row.operator("bseq.enableselected", text="Enable Selected")
7375
row.operator("bseq.disableselected", text="Disable Selected")
74-
row = layout.row()
75-
row.operator("sequence.edit", text="Edit Path")
7676
row.operator("bseq.refresh", text="Refresh")
7777

7878

@@ -193,6 +193,11 @@ def draw(self, context):
193193
col2.prop(importer_prop, "relative", text="")
194194

195195
layout.operator("sequence.load")
196+
split = layout.split()
197+
col1 = split.column()
198+
col2 = split.column()
199+
col1.prop_search(importer_prop, 'edit_obj', bpy.data, 'objects', text="")
200+
col2.operator("sequence.edit")
196201

197202
layout.label(text="Global Settings")
198203
box = layout.box()
@@ -203,6 +208,8 @@ def draw(self, context):
203208

204209
col1.label(text="Print Sequence Information on Render")
205210
col2.prop(importer_prop, "print", text="")
211+
col1.label(text="Auto refresh all the sequence every frame")
212+
col2.prop(importer_prop, "auto_refresh", text="")
206213

207214

208215
class BSEQ_Templates(bpy.types.Menu):

bseq/properties.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,19 @@ class BSEQ_scene_property(bpy.types.PropertyGroup):
3232
poll=poll_material,
3333
)
3434

35+
edit_obj: bpy.props.PointerProperty(
36+
type=bpy.types.Object,
37+
poll=poll_edit_obj,
38+
)
39+
3540
print: bpy.props.BoolProperty(name='print',
3641
description="whether or not to print additional information when rendering",
3742
default=True)
3843

44+
auto_refresh: bpy.props.BoolProperty(name='auto refresh',
45+
description="whether or not to auto refresh all the sequence every frame",
46+
default=False)
47+
3948

4049
class BSEQ_obj_property(bpy.types.PropertyGroup):
4150
init: bpy.props.BoolProperty(default=False)
@@ -45,6 +54,7 @@ class BSEQ_obj_property(bpy.types.PropertyGroup):
4554
script_name: bpy.props.StringProperty()
4655
use_relative: bpy.props.BoolProperty(default=False)
4756
pattern: bpy.props.StringProperty()
57+
frame: bpy.props.IntProperty()
4858

4959

5060
# set this property for mesh, not object (maybe change later?)

bseq/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import bpy
2-
2+
import fileseq
33

44
def show_message_box(message="", title="Message Box", icon="INFO"):
55
'''
@@ -24,3 +24,15 @@ def stop_animation():
2424
# if playing animation, then stop it, otherwise it will keep showing message box
2525
bpy.ops.screen.animation_cancel()
2626

27+
28+
29+
def refresh_obj(obj):
30+
fs = obj.BSEQ.pattern
31+
if obj.BSEQ.use_relative:
32+
fs = bpy.path.abspath(fs)
33+
fs = fileseq.findSequenceOnDisk(fs)
34+
fs = fileseq.findSequenceOnDisk(fs.dirname() + fs.basename() + "@" + fs.extension())
35+
fs = str(fs)
36+
if obj.BSEQ.use_relative:
37+
fs = bpy.path.relpath(fs)
38+
obj.BSEQ.pattern = fs

0 commit comments

Comments
 (0)