scene switch and fixes
0.2.2 - feat: quick scene switch with a button in `node_editor > view` - fix: re-arrange frames tiny offset - fix: renumering ignored selection - ui: gp dopesheet > send multiple layers buttonmain
parent
07e5046bef
commit
ac7de45311
|
@ -9,6 +9,13 @@ OR always duplicate (safe but heavy scenes...)
|
||||||
if duplicate, need to "connect" with namespace ('_duprender') or something
|
if duplicate, need to "connect" with namespace ('_duprender') or something
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
0.2.2
|
||||||
|
|
||||||
|
- feat: quick scene switch with a button in `node_editor > view`
|
||||||
|
- fix: re-arrange frames tiny offset
|
||||||
|
- fix: renumering ignored selection
|
||||||
|
- ui: gp dopesheet > send multiple layers button
|
||||||
|
|
||||||
0.2.1
|
0.2.1
|
||||||
|
|
||||||
- feat: renumbering with keep existing values
|
- feat: renumbering with keep existing values
|
||||||
|
|
|
@ -29,7 +29,7 @@ class GPEXP_OT_number_outputs(bpy.types.Operator):
|
||||||
for fo in nodes:
|
for fo in nodes:
|
||||||
if fo.type != 'OUTPUT_FILE':
|
if fo.type != 'OUTPUT_FILE':
|
||||||
continue
|
continue
|
||||||
if self.mode == 'SELECT' and not fo.select:
|
if self.mode == 'SELECTED' and not fo.select:
|
||||||
continue
|
continue
|
||||||
print(f'numbering {fo.name}')
|
print(f'numbering {fo.name}')
|
||||||
ct += 1
|
ct += 1
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import bpy
|
||||||
|
|
||||||
|
|
||||||
|
class GPEXP_OT_render_scene_switch(bpy.types.Operator):
|
||||||
|
bl_idname = "gp.render_scene_switch"
|
||||||
|
bl_label = "Render Scene Switch"
|
||||||
|
bl_description = "Switch between render"
|
||||||
|
bl_options = {"REGISTER"}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return True
|
||||||
|
|
||||||
|
# mode : bpy.props.StringProperty(default='NORMAL', options={'SKIP_SAVE'})
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
scenes = bpy.data.scenes
|
||||||
|
if len(scenes) < 2:
|
||||||
|
self.report({'ERROR'},'No other scene to go to')
|
||||||
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
if context.scene.name == 'Render':
|
||||||
|
scn = scenes.get('Scene')
|
||||||
|
if not scn: # get the next available scene
|
||||||
|
self.report({'WARNING'},'No scene named "Scene"')
|
||||||
|
slist = [s.name for s in scenes]
|
||||||
|
scn = scenes[(slist.index(bpy.context.scene.name) + 1) % len(scenes)]
|
||||||
|
|
||||||
|
else:
|
||||||
|
scn = scenes.get('Render')
|
||||||
|
if not scn:
|
||||||
|
self.report({'ERROR'},'No "Render" scene yet')
|
||||||
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
|
||||||
|
self.report({'INFO'},f'Switched to scene "{scn.name}"')
|
||||||
|
bpy.context.window.scene = scn
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
classes=(
|
||||||
|
GPEXP_OT_render_scene_switch,
|
||||||
|
)
|
||||||
|
|
||||||
|
def register():
|
||||||
|
for cls in classes:
|
||||||
|
bpy.utils.register_class(cls)
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
for cls in reversed(classes):
|
||||||
|
bpy.utils.unregister_class(cls)
|
|
@ -2,7 +2,7 @@ bl_info = {
|
||||||
"name": "GP exporter",
|
"name": "GP exporter",
|
||||||
"description": "Organise export of gp layers through compositor output",
|
"description": "Organise export of gp layers through compositor output",
|
||||||
"author": "Samuel Bernou",
|
"author": "Samuel Bernou",
|
||||||
"version": (0, 2, 1),
|
"version": (0, 2, 2),
|
||||||
"blender": (2, 93, 0),
|
"blender": (2, 93, 0),
|
||||||
"location": "View3D",
|
"location": "View3D",
|
||||||
"warning": "",
|
"warning": "",
|
||||||
|
@ -17,6 +17,7 @@ from . import OP_clean
|
||||||
from . import OP_connect_toggle
|
from . import OP_connect_toggle
|
||||||
from . import OP_manage_outputs
|
from . import OP_manage_outputs
|
||||||
from . import OP_number_outputs
|
from . import OP_number_outputs
|
||||||
|
from . import OP_scene_switch
|
||||||
from . import ui
|
from . import ui
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
|
@ -32,6 +33,7 @@ def register():
|
||||||
OP_merge_layers.register()
|
OP_merge_layers.register()
|
||||||
OP_manage_outputs.register()
|
OP_manage_outputs.register()
|
||||||
OP_number_outputs.register()
|
OP_number_outputs.register()
|
||||||
|
OP_scene_switch.register()
|
||||||
ui.register()
|
ui.register()
|
||||||
# bpy.types.Scene.pgroup_name = bpy.props.PointerProperty(type = PROJ_PGT_settings)
|
# bpy.types.Scene.pgroup_name = bpy.props.PointerProperty(type = PROJ_PGT_settings)
|
||||||
|
|
||||||
|
@ -40,6 +42,7 @@ def unregister():
|
||||||
return
|
return
|
||||||
|
|
||||||
ui.unregister()
|
ui.unregister()
|
||||||
|
OP_scene_switch.unregister()
|
||||||
OP_number_outputs.unregister()
|
OP_number_outputs.unregister()
|
||||||
OP_manage_outputs.unregister()
|
OP_manage_outputs.unregister()
|
||||||
OP_merge_layers.unregister()
|
OP_merge_layers.unregister()
|
||||||
|
|
2
fn.py
2
fn.py
|
@ -201,7 +201,7 @@ def rearrange_frames(node_tree):
|
||||||
## f[0] : frame
|
## f[0] : frame
|
||||||
|
|
||||||
## move frame by offset needed (delta between real_loc and "fake" loc , minus offset)
|
## move frame by offset needed (delta between real_loc and "fake" loc , minus offset)
|
||||||
f[0].location.y = (f[1].y - f[0].location.y) - top - offset
|
f[0].location.y = (f[1].y - f[0].location.y) - top - offset + 40 # + 40 to avoid offset when recalculating from 0 top
|
||||||
# f[0].location.y = f[1].y - top - offset
|
# f[0].location.y = f[1].y - top - offset
|
||||||
offset += f[2] + 300 # gap
|
offset += f[2] + 300 # gap
|
||||||
|
|
||||||
|
|
28
ui.py
28
ui.py
|
@ -11,12 +11,14 @@ class GPEXP_PT_gp_node_ui(Panel):
|
||||||
bl_label = "Gpencil Render Manager"
|
bl_label = "Gpencil Render Manager"
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.operator('gp.render_scene_switch', icon='SCENE_DATA', text='Switch Scene')
|
||||||
|
|
||||||
if not context.scene.use_nodes or not context.scene.node_tree:
|
if not context.scene.use_nodes or not context.scene.node_tree:
|
||||||
return
|
return
|
||||||
|
|
||||||
# TODO : add advanced bool checkbox to hide some options from the user
|
# TODO : add advanced bool checkbox to hide some options from the user
|
||||||
|
|
||||||
layout = self.layout
|
|
||||||
col = layout.column(align=True)
|
col = layout.column(align=True)
|
||||||
ct = len([n for n in context.scene.node_tree.nodes if n.type == 'R_LAYERS' and n.select])
|
ct = len([n for n in context.scene.node_tree.nodes if n.type == 'R_LAYERS' and n.select])
|
||||||
txt = f'Merge {ct} Layer Nodes'
|
txt = f'Merge {ct} Layer Nodes'
|
||||||
|
@ -44,8 +46,14 @@ class GPEXP_PT_gp_node_ui(Panel):
|
||||||
col.operator('gp.clean_compo_tree', icon='BRUSHES_ALL', text='Clean Nodes') # NODE_CORNER
|
col.operator('gp.clean_compo_tree', icon='BRUSHES_ALL', text='Clean Nodes') # NODE_CORNER
|
||||||
|
|
||||||
col.separator()
|
col.separator()
|
||||||
col.operator('gp.number_outputs', icon='LINENUMBERS_ON', text='Renumber Selected outputs').mode = 'SELECTED'
|
|
||||||
# col.operator('gp.number_outputs', icon='LINENUMBERS_ON', text='Renumber outputs').mode = 'ALL'
|
## (re)number exports
|
||||||
|
ct = len([n for n in context.scene.node_tree.nodes if n.type == 'OUTPUT_FILE' and n.select])
|
||||||
|
txt = f'Renumber {ct} Selected outputs'
|
||||||
|
subcol = col.column()
|
||||||
|
subcol.enabled = bool(ct)
|
||||||
|
subcol.operator('gp.number_outputs', icon='LINENUMBERS_ON', text=txt).mode = 'SELECTED'
|
||||||
|
# col.operator('gp.number_outputs', icon='LINENUMBERS_ON', text='Renumber all outputs').mode = 'ALL'
|
||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
@ -75,12 +83,20 @@ class GPEXP_PT_gp_dopesheet_ui(Panel):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.label(text=context.object.name)
|
layout.label(text=context.object.name)
|
||||||
|
|
||||||
|
## On layers
|
||||||
|
if context.object and context.object.type == 'GPENCIL':
|
||||||
|
txt = f'{len([l for l in context.object.data.layers if l.select])} Layer(s) To Render'
|
||||||
|
else:
|
||||||
|
txt = 'Layer To Render'
|
||||||
|
layout.operator('gp.add_layer_to_render', icon='RENDERLAYERS', text=txt)
|
||||||
|
|
||||||
|
# merge (only accessible if multiple layers selected)
|
||||||
|
row = layout.row()
|
||||||
ct = len([l for l in context.object.data.layers if l.select])
|
ct = len([l for l in context.object.data.layers if l.select])
|
||||||
txt = f'Merge {ct} layers'
|
txt = f'Merge {ct} layers'
|
||||||
|
|
||||||
# merge layers from dopesheet
|
# merge layers from dopesheet
|
||||||
layout.operator('gp.merge_selected_dopesheet_layers', text=txt, )
|
row.operator('gp.merge_selected_dopesheet_layers', text=txt, )
|
||||||
layout.enabled= ct > 1
|
row.enabled= ct > 1
|
||||||
|
|
||||||
def manager_ui(self, context):
|
def manager_ui(self, context):
|
||||||
'''appended to DATA_PT_gpencil_layers'''
|
'''appended to DATA_PT_gpencil_layers'''
|
||||||
|
|
Loading…
Reference in New Issue