export xlsx
This commit is contained in:
+89
-21
@@ -55,7 +55,7 @@ from vse_toolbox.sequencer_utils import (
|
||||
)
|
||||
|
||||
from vse_toolbox.bl_utils import get_addon_prefs, get_scene_settings, get_strip_settings
|
||||
from vse_toolbox.file_utils import install_module, norm_name, norm_str
|
||||
from vse_toolbox.file_utils import install_module, norm_name, norm_str, open_file
|
||||
|
||||
|
||||
class VSETB_OT_tracker_connect(Operator):
|
||||
@@ -83,16 +83,27 @@ class VSETB_OT_tracker_connect(Operator):
|
||||
return {"CANCELLED"}
|
||||
|
||||
|
||||
def get_custom_name_items(self, context):
|
||||
settings = get_scene_settings()
|
||||
project = settings.active_project
|
||||
return [(m.field_name, m.name, '') for m in project.metadata_types if m.entity_type=='ASSET']
|
||||
|
||||
class VSETB_OT_export_spreadsheet(Operator):
|
||||
bl_idname = "vse_toolbox.export_spreadsheet"
|
||||
bl_label = "Export Spreadsheet"
|
||||
bl_description = "Export Shot data in a table as a csv or an xlsl"
|
||||
bl_options = {"REGISTER", "UNDO"}
|
||||
|
||||
format : EnumProperty(items=[(i, i, '') for i in ('CSV', 'XLSL')])
|
||||
format : EnumProperty(items=[(i, i, '') for i in ('CSV', 'XLSX')])
|
||||
separator : StringProperty(default='\\n')
|
||||
delimiter : StringProperty(default=';')
|
||||
export_path : StringProperty(default='//export')
|
||||
use_custom_name : BoolProperty(default=False)
|
||||
custom_name : EnumProperty(items=get_custom_name_items,
|
||||
description='Use a custom name for asset using a metadata value')
|
||||
|
||||
open_folder : BoolProperty(default=False)
|
||||
show_settings : BoolProperty(default=False)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
@@ -122,13 +133,26 @@ class VSETB_OT_export_spreadsheet(Operator):
|
||||
col = layout.column()
|
||||
col.use_property_split = True
|
||||
|
||||
col.prop(self, "separator", expand=True, text='Separator')
|
||||
row = col.row(align=True)
|
||||
row = col.row(align=True, heading='Custom Name')
|
||||
#row.use_property_split = True
|
||||
row.prop(self, 'use_custom_name', text='')
|
||||
sub = row.row(align=True)
|
||||
sub.enabled = self.use_custom_name
|
||||
sub.prop(self, 'custom_name', text='')
|
||||
|
||||
col.separator()
|
||||
|
||||
row = col.row(align=False)
|
||||
row.prop(self, "format", expand=True, text='Format')
|
||||
if self.format == 'CSV':
|
||||
col.prop(self, "delimiter", expand=True, text='Delimiter')
|
||||
row.prop(self, 'show_settings', text='', icon='PREFERENCES')
|
||||
if self.show_settings:
|
||||
col.prop(self, "separator", expand=True, text='Separator')
|
||||
if self.format == 'CSV':
|
||||
col.prop(self, "delimiter", expand=True, text='Delimiter')
|
||||
|
||||
col.prop(self, 'export_path')
|
||||
col.separator()
|
||||
col.prop(self, 'open_folder', text='Open Folder')
|
||||
col.prop(self, 'export_path', text='Export Path')
|
||||
|
||||
def execute(self, context):
|
||||
#self.report({'ERROR'}, f'Export not implemented yet.')
|
||||
@@ -143,11 +167,30 @@ class VSETB_OT_export_spreadsheet(Operator):
|
||||
# Header
|
||||
rows.append([cell.export_name for cell in cells])
|
||||
|
||||
separator = self.separator.replace('\\n', '\n').replace('\\t', '\t').replace('\\r', '\r')
|
||||
delimiter = self.delimiter.replace('\\n', '\n').replace('\\t', '\t').replace('\\r', '\r')
|
||||
|
||||
for strip in get_strips('Shots'):
|
||||
row = []
|
||||
for cell in cells:
|
||||
if cell.is_metadata:
|
||||
if cell.type == "METADATA":
|
||||
row += [getattr(strip.vsetb_strip_settings.metadata, cell.field_name)]
|
||||
elif cell.type == "ASSET_TYPE":
|
||||
asset_castings = []
|
||||
for asset_casting in strip.vsetb_strip_settings.casting:
|
||||
asset = asset_casting.asset
|
||||
if not asset.asset_type == cell.name:
|
||||
continue
|
||||
|
||||
if self.use_custom_name:
|
||||
if asset.get('metadata', {}).get(self.custom_name):
|
||||
asset_castings.append(asset['metadata'][self.custom_name])
|
||||
else:
|
||||
self.report({'ERROR'}, f'The asset {asset.tracker_name} has no data {self.custom_name}')
|
||||
else:
|
||||
asset_castings.append(asset.tracker_name)
|
||||
|
||||
row += [separator.join(asset_castings)]
|
||||
elif cell.field_name == 'EPISODE':
|
||||
row += [settings.active_episode.name]
|
||||
elif cell.field_name == 'SEQUENCE':
|
||||
@@ -188,14 +231,36 @@ class VSETB_OT_export_spreadsheet(Operator):
|
||||
#2023_04_11_kitsu_boris_ep01_shots
|
||||
export_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
print('Writing .csv file to', export_path)
|
||||
with open(str(export_path), 'w', newline='\n', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
for row in rows:
|
||||
writer.writerow(row)
|
||||
if self.format == 'CSV':
|
||||
print('Writing .csv file to', export_path)
|
||||
with open(str(export_path), 'w', newline='\n', encoding='utf-8') as f:
|
||||
writer = csv.writer(f, delimiter=self.delimiter)
|
||||
for row in rows:
|
||||
writer.writerow(row)
|
||||
|
||||
#if show_in_explorer:
|
||||
# open_file(filepath, select=True)
|
||||
elif self.format == 'XLSX':
|
||||
try:
|
||||
import openpyxl
|
||||
except ModuleNotFoundError():
|
||||
self.report({'INFO'}, 'Installing openpyxl')
|
||||
openpyxl = install_module('openpyxl')
|
||||
|
||||
from openpyxl import Workbook
|
||||
|
||||
workbook = Workbook()
|
||||
worksheet = workbook.active
|
||||
for row in rows:
|
||||
worksheet.append(row)
|
||||
|
||||
for col in worksheet.columns:
|
||||
letter = col[0].column_letter
|
||||
worksheet.column_dimensions[letter].auto_size = True
|
||||
|
||||
# Save the file
|
||||
workbook.save(str(export_path))
|
||||
|
||||
if self.open_folder:
|
||||
open_file(export_path, select=True)
|
||||
|
||||
|
||||
return {"FINISHED"}
|
||||
@@ -230,7 +295,8 @@ class VSETB_OT_upload_to_tracker(Operator):
|
||||
status : EnumProperty(items=get_task_status_items)
|
||||
comment : StringProperty()
|
||||
add_preview : BoolProperty(default=True)
|
||||
preview_mode : EnumProperty(items=[(m, m.title().replace('_', ' '), '') for m in ('ONLY_NEW', 'REPLACE', 'ADD')])
|
||||
preview_mode : EnumProperty(items=[(m, m.title().replace('_', ' '), '')
|
||||
for m in ('ONLY_NEW', 'REPLACE', 'ADD')])
|
||||
set_main_preview : BoolProperty(default=True)
|
||||
casting : BoolProperty(default=True)
|
||||
custom_data : BoolProperty(default=True)
|
||||
@@ -525,9 +591,8 @@ class VSETB_OT_load_assets(Operator):
|
||||
asset.id = asset_data['id']
|
||||
asset.asset_type = asset_data['asset_type']
|
||||
|
||||
datas = asset_data.get('data', {})
|
||||
for key, values in datas.items():
|
||||
asset[key] = values
|
||||
#for key, value in asset_data.get('data', {}).items():
|
||||
asset['metadata'] = asset_data.get('data', {})
|
||||
|
||||
preview_id = asset_data.get('preview_file_id')
|
||||
if preview_id:
|
||||
@@ -575,12 +640,13 @@ class VSETB_OT_load_projects(Operator):
|
||||
episode.name = episode_data['name']
|
||||
episode.id = episode_data['id']
|
||||
|
||||
for metadata_data in tracker.get_shots_metadata(project_data):
|
||||
pprint(metadata_data)
|
||||
for metadata_data in tracker.get_metadata_types(project_data):
|
||||
#pprint(metadata_data)
|
||||
metadata_type = project.metadata_types.add()
|
||||
metadata_type.name = metadata_data['name']
|
||||
metadata_type.field_name = metadata_data['field_name']
|
||||
metadata_type['choices'] = metadata_data['choices']
|
||||
metadata_type['entity_type'] = metadata_data['entity_type'].upper()
|
||||
|
||||
for status_data in tracker.get_task_statuses(project_data):
|
||||
#print(metadata_data)
|
||||
@@ -611,6 +677,8 @@ class VSETB_OT_load_projects(Operator):
|
||||
|
||||
#bpy.ops.vse_toolbox.load_assets()
|
||||
|
||||
self.report({"INFO"}, 'Successfully Load Tracker Projects')
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user