copy metadata
parent
ef4f8f527b
commit
5884d278da
|
@ -10,7 +10,12 @@ def get_scene_settings():
|
||||||
|
|
||||||
def get_strip_settings():
|
def get_strip_settings():
|
||||||
scn = bpy.context.scene
|
scn = bpy.context.scene
|
||||||
return scn.sequence_editor.active_strip.vsetb_strip_settings
|
strip = bpy.context.active_sequence_strip
|
||||||
|
|
||||||
|
if not strip:
|
||||||
|
return
|
||||||
|
|
||||||
|
return strip.vsetb_strip_settings
|
||||||
|
|
||||||
def get_bl_cmd(blender=None, background=False, focus=True, blendfile=None, script=None, **kargs):
|
def get_bl_cmd(blender=None, background=False, focus=True, blendfile=None, script=None, **kargs):
|
||||||
cmd = [str(blender)] if blender else [bpy.app.binary_path]
|
cmd = [str(blender)] if blender else [bpy.app.binary_path]
|
||||||
|
|
|
@ -57,6 +57,34 @@ class VSETB_OT_tracker_connect(Operator):
|
||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
|
||||||
|
class VSETB_OT_copy_metadata(Operator):
|
||||||
|
bl_idname = "vse_toolbox.copy_metadata"
|
||||||
|
bl_label = "Copy metadata to selected"
|
||||||
|
bl_description = "Copy Metadata to selected strips"
|
||||||
|
|
||||||
|
metadata : StringProperty()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return context.selected_sequences and context.active_sequence_strip
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
prefs = get_addon_prefs()
|
||||||
|
settings = get_scene_settings()
|
||||||
|
|
||||||
|
metadata = self.metadata.lower()
|
||||||
|
|
||||||
|
active_strip = context.active_sequence_strip
|
||||||
|
metadata_value = getattr(active_strip.vsetb_strip_settings.metadata, metadata)
|
||||||
|
|
||||||
|
for strip in context.selected_sequences:
|
||||||
|
if strip == context.active_sequence_strip:
|
||||||
|
continue
|
||||||
|
|
||||||
|
setattr(strip.vsetb_strip_settings.metadata, metadata, metadata_value)
|
||||||
|
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
class VSETB_OT_export_spreadsheet(Operator):
|
class VSETB_OT_export_spreadsheet(Operator):
|
||||||
bl_idname = "vse_toolbox.export_spreadsheet"
|
bl_idname = "vse_toolbox.export_spreadsheet"
|
||||||
bl_label = "Export Spreadsheet"
|
bl_label = "Export Spreadsheet"
|
||||||
|
@ -1218,16 +1246,18 @@ class VSETB_OT_paste_casting(Operator):
|
||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|
||||||
casting_datas = json.loads(CASTING_BUFFER.read_text())
|
casting_datas = json.loads(CASTING_BUFFER.read_text())
|
||||||
for casting_item in casting_datas:
|
|
||||||
|
|
||||||
|
|
||||||
for strip in context.selected_sequences:
|
for strip in context.selected_sequences:
|
||||||
strip_settings = strip.vsetb_strip_settings
|
strip_settings = strip.vsetb_strip_settings
|
||||||
|
for casting_data in casting_datas:
|
||||||
if strip_settings.casting.get(casting_item['name']):
|
|
||||||
continue
|
|
||||||
|
|
||||||
item = strip.vsetb_strip_settings.casting.add()
|
item = strip.vsetb_strip_settings.casting.add()
|
||||||
for k, v in casting_item.items():
|
|
||||||
setattr(item, k, v)
|
item.name = casting_data['name']
|
||||||
|
item.id = casting_data['id']
|
||||||
|
item['_name'] = casting_data['_name']
|
||||||
|
|
||||||
strip_settings.casting.update()
|
strip_settings.casting.update()
|
||||||
|
|
||||||
|
@ -1376,7 +1406,8 @@ classes = (
|
||||||
VSETB_OT_tracker_connect,
|
VSETB_OT_tracker_connect,
|
||||||
VSETB_OT_set_stamps,
|
VSETB_OT_set_stamps,
|
||||||
VSETB_OT_upload_to_tracker,
|
VSETB_OT_upload_to_tracker,
|
||||||
VSETB_OT_show_waveform
|
VSETB_OT_show_waveform,
|
||||||
|
VSETB_OT_copy_metadata
|
||||||
)
|
)
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
|
26
panels.py
26
panels.py
|
@ -272,12 +272,13 @@ class VSETB_PT_metadata(VSETB_main, Panel):
|
||||||
if not project:
|
if not project:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
layout.prop(strip_settings, 'description', text='DESCRIPTION')
|
layout.prop(strip_settings, 'description', text='DESCRIPTION')
|
||||||
|
|
||||||
#col = layout.column()
|
#col = layout.column()
|
||||||
for metadata_type in project.metadata_types:
|
for metadata_type in project.metadata_types:
|
||||||
if metadata_type.entity_type == 'SHOT':
|
if metadata_type.entity_type == 'SHOT':
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=False)
|
||||||
metadata_key = metadata_type.field_name
|
metadata_key = metadata_type.field_name
|
||||||
if metadata_type.choices:
|
if metadata_type.choices:
|
||||||
metadata_value = getattr(strip_settings.metadata, metadata_key)
|
metadata_value = getattr(strip_settings.metadata, metadata_key)
|
||||||
|
@ -294,6 +295,25 @@ class VSETB_PT_metadata(VSETB_main, Panel):
|
||||||
else:
|
else:
|
||||||
row.prop(strip_settings.metadata, metadata_key, text=metadata_key.upper())
|
row.prop(strip_settings.metadata, metadata_key, text=metadata_key.upper())
|
||||||
|
|
||||||
|
#row.operator('vse_toolbox.copy_metadata', icon='PASTEDOWN', text='', emboss=False).metadata = metadata_key
|
||||||
|
|
||||||
|
def context_menu_prop(self, context):
|
||||||
|
if not hasattr(context, 'button_prop') or context.space_data.type != 'SEQUENCE_EDITOR':
|
||||||
|
return
|
||||||
|
|
||||||
|
settings = get_strip_settings()
|
||||||
|
if not settings:
|
||||||
|
return
|
||||||
|
|
||||||
|
button_prop = context.button_prop
|
||||||
|
if button_prop not in settings.metadata.bl_rna.properties.values():
|
||||||
|
return
|
||||||
|
|
||||||
|
layout = self.layout
|
||||||
|
layout.separator()
|
||||||
|
layout.operator('vse_toolbox.copy_metadata', icon='PASTEDOWN', text='Copy metadata to selected').metadata = button_prop.name
|
||||||
|
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
VSETB_PT_main,
|
VSETB_PT_main,
|
||||||
VSETB_PT_imports,
|
VSETB_PT_imports,
|
||||||
|
@ -308,6 +328,10 @@ def register():
|
||||||
for cls in classes:
|
for cls in classes:
|
||||||
bpy.utils.register_class(cls)
|
bpy.utils.register_class(cls)
|
||||||
|
|
||||||
|
bpy.types.UI_MT_button_context_menu.append(context_menu_prop)
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
for cls in reversed(classes):
|
for cls in reversed(classes):
|
||||||
bpy.utils.unregister_class(cls)
|
bpy.utils.unregister_class(cls)
|
||||||
|
|
||||||
|
bpy.types.UI_MT_button_context_menu.remove(context_menu_prop)
|
|
@ -62,6 +62,7 @@ def get_tracker_items(self, context):
|
||||||
class CollectionPropertyGroup(PropertyGroup):
|
class CollectionPropertyGroup(PropertyGroup):
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return (v for v in self.values())
|
return (v for v in self.values())
|
||||||
|
|
||||||
def props(self):
|
def props(self):
|
||||||
return [p for p in self.bl_rna.properties if p.identifier not in ('rna_type', 'name')]
|
return [p for p in self.bl_rna.properties if p.identifier not in ('rna_type', 'name')]
|
||||||
|
|
||||||
|
@ -118,6 +119,12 @@ class AssetCasting(PropertyGroup):
|
||||||
project = settings.active_project
|
project = settings.active_project
|
||||||
return project.assets.get(self.id)
|
return project.assets.get(self.id)
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
return {'id': self.id,
|
||||||
|
'instance': self.instance,
|
||||||
|
'name': self.asset.name if self.asset else None,
|
||||||
|
'_name': self.get('_name')
|
||||||
|
}
|
||||||
|
|
||||||
class SpreadsheetCell(PropertyGroup):
|
class SpreadsheetCell(PropertyGroup):
|
||||||
export_name : StringProperty()
|
export_name : StringProperty()
|
||||||
|
|
Loading…
Reference in New Issue