174 lines
5.5 KiB
Python
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"}
|