expre-gen/blender/3.4/scripts/addons/storypencil/scene_tools.py
2025-10-17 09:47:23 +08:00

174 lines
5.5 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
import bpy
import os
from bpy.types import (
Operator,
)
# -------------------------------------------------------------
# Add a new scene and set to new strip
#
# -------------------------------------------------------------
class STORYPENCIL_OT_NewScene(Operator):
bl_idname = "storypencil.new_scene"
bl_label = "New Scene"
bl_description = "Create a new scene base on template scene"
bl_options = {'REGISTER', 'UNDO'}
scene_name: bpy.props.StringProperty(default="Scene")
# ------------------------------
# Poll
# ------------------------------
@classmethod
def poll(cls, context):
scene = context.scene
scene_base = scene.storypencil_base_scene
if scene_base is not None and scene_base.name in bpy.data.scenes:
return True
return False
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
def draw(self, context):
layout = self.layout
col = layout.column()
col.prop(self, "scene_name", text="Scene Name")
def format_to3(self, value):
return f"{value:03}"
# ------------------------------
# Execute button action
# ------------------------------
def execute(self, context):
scene_prv = context.scene
cfra_prv = scene_prv.frame_current
scene_base = scene_prv.storypencil_base_scene
# Set context to base scene and duplicate
context.window.scene = scene_base
bpy.ops.scene.new(type='FULL_COPY')
scene_new = context.window.scene
new_name = scene_prv.storypencil_name_prefix + \
self.scene_name + scene_prv.storypencil_name_suffix
id = 0
while new_name in bpy.data.scenes:
id += 1
new_name = scene_prv.storypencil_name_prefix + self.scene_name + \
scene_prv.storypencil_name_suffix + '.' + self.format_to3(id)
scene_new.name = new_name
# Set duration of new scene
scene_new.frame_end = scene_new.frame_start + \
scene_prv.storypencil_scene_duration - 1
# Back to original scene
context.window.scene = scene_prv
scene_prv.frame_current = cfra_prv
bpy.ops.sequencer.scene_strip_add(
frame_start=cfra_prv, scene=scene_new.name)
scene_new.update_tag()
scene_prv.update_tag()
return {"FINISHED"}
def draw_new_scene(self, context):
"""Add menu options."""
self.layout.operator_context = 'INVOKE_REGION_WIN'
row = self.layout.row(align=True)
row.operator(STORYPENCIL_OT_NewScene.bl_idname, text="New Template Scene")
def setup_storyboard(self, context):
"""Add Setup menu option."""
# For security, check if this is the default template.
is_gpencil = context.active_object and context.active_object.name == 'Stroke'
if is_gpencil and context.workspace.name in ('2D Animation', '2D Full Canvas') and context.scene.name == 'Scene':
if "Video Editing" not in bpy.data.workspaces:
row = self.layout.row(align=True)
row.separator()
row = self.layout.row(align=True)
row.operator(STORYPENCIL_OT_Setup.bl_idname,
text="Setup Storyboard Session")
# -------------------------------------------------------------
# Setup all environment
#
# -------------------------------------------------------------
class STORYPENCIL_OT_Setup(Operator):
bl_idname = "storypencil.setup"
bl_label = "Setup"
bl_description = "Configure all settings for a storyboard session"
bl_options = {'REGISTER', 'UNDO'}
# ------------------------------
# Poll
# ------------------------------
@classmethod
def poll(cls, context):
return True
def get_workspace(self, type):
for wrk in bpy.data.workspaces:
if wrk.name == type:
return wrk
return None
# ------------------------------
# Execute button action
# ------------------------------
def execute(self, context):
scene_base = context.scene
# Create Workspace
templatepath = None
if "Video Editing" not in bpy.data.workspaces:
template_path = None
for path in bpy.utils.app_template_paths():
template_path = path
filepath = os.path.join(
template_path, "Video_Editing", "startup.blend")
bpy.ops.workspace.append_activate(
idname="Video Editing", filepath=filepath)
# Create New scene
bpy.ops.scene.new()
scene_edit = context.scene
scene_edit.name = 'Edit'
# Rename original base scene
scene_base.name = 'Base'
# Setup Edit scene settings
scene_edit.storypencil_main_workspace = self.get_workspace(
"Video Editing")
scene_edit.storypencil_main_scene = scene_edit
scene_edit.storypencil_base_scene = scene_base
scene_edit.storypencil_edit_workspace = self.get_workspace(
"2D Animation")
# Add a new strip (need set the area context)
context.window.scene = scene_edit
area_prv = context.area.ui_type
context.area.ui_type = 'SEQUENCE_EDITOR'
prv_frame = scene_edit.frame_current
scene_edit.frame_current = scene_edit.frame_start
bpy.ops.storypencil.new_scene()
context.area.ui_type = area_prv
scene_edit.frame_current = prv_frame
scene_edit.update_tag()
bpy.ops.sequencer.reload()
return {"FINISHED"}