Fix #4 export transformation to AE with export helper

1.8.8

- added: Add `export transformation to AE` in export menu:
 - export camera
 - export objects transformation
 - export exposition (object, GPencil keys, etc)
main
pullusb 2024-10-15 15:07:11 +02:00
parent 5c69bd0185
commit 09eca87060
3 changed files with 45 additions and 40 deletions

View File

@ -14,6 +14,13 @@ Activate / deactivate layer opacity according to prefix
Activate / deactivate all masks using MA layers
-->
1.8.8
- added: Add `export transformation to AE` in export menu:
- export camera
- export objects transformation
- export exposition (object, GPencil keys, etc)
1.8.7
- changed: Layer `channel_colors` have _value component_ clamped to 0.65 when transfered to compo node to limit color flashyness (eye care update)

View File

@ -154,16 +154,12 @@ def export_ae_transforms(directory, selection=None, camera=None, exposition=True
rig_transforms = [tuple(round(x, 5) for v in b.matrix for x in v) for b in item.id_data.pose.bones]
is_animated = rig_transforms != animation.get(name)
animation[name] = rig_transforms
elif isinstance(item, bpy.types.GreasePencil):
elif item.type == 'GPENCIL': # isinstance(item.data, bpy.types.GreasePencil):
name = item.name
co_3d = item.matrix_world.to_translation()
## Check if there is keys on any layer
is_animated = False
## append with is_animated flag to True
for l in item.data.layers:
is_animated = next((True for f in l.frames if l.frame_number == i), False)
if is_animated:
break
## Check if there is a GP-scene at scene-frame (i) on any visible layer
is_animated = i in [f.frame_number for l in item.data.layers for f in l.frames if not l.hide]
animation[name] = co_3d
else:
name = item.name
co_3d = item.matrix_world.to_translation()
@ -235,11 +231,6 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
description="Export only objects from the active collection (and its children)",
default=False,
)
# collection: StringProperty(
# name="Source Collection",
# description="Export only objects from this collection (and its children)",
# default="",
# )
object_types: EnumProperty(
name="Object Types",
options={'ENUM_FLAG'},
@ -257,18 +248,13 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
exposition: BoolProperty(
name='Exposition',
description='Export the exposition of the keys',
default=False
)
use_grease_pencil_keys: BoolProperty(
name='Grease Pencil Keys',
description='Consider grease pencil keys for animated exposition',
default=True
)
use_object_keys: BoolProperty(
name='Object Keys',
description='Consider object transform keys for animated exposition',
default=True
)
# use_object_keys: BoolProperty(
# name='Object Keys',
# description='Consider object transform keys for animated exposition',
# default=True
# )
use_active_camera: BoolProperty(
name='Active Camera',
description='Export active camera keys',
@ -276,7 +262,6 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
)
data_lang: EnumProperty(
name="AE Language",
# options={'ENUM_FLAG'},
items=(('FR', "Français", ""),
('EN', "Anglais", ""),
),
@ -293,6 +278,13 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
default={'txt'},
)
# def invoke(self, context, event):
# if event.ctrl:
# print('copy individual') # or separate operators
#
# return {'FINISHED'}
# return super().invoke(context, event)
# prefix ? (ensure file is prefixed at export), but weird in the the context of an export field
def draw(self, context):
@ -313,19 +305,25 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
object_types=self.object_types
)
for o in objects_selection:
print(o.name)
# return {"FINISHED"}
## Find directory
output_path = Path(self.filepath)
if not output_path.is_dir():
output_path = output_path.parent
print('Output directory: ', output_path)
print('output_path: ', output_path)
cam = None
if self.use_active_camera and context.scene.camera:
cam = context.scene.camera
if cam and cam in objects_selection:
## Remove active camera from objects
objects_selection.pop(objects_selection.index(cam))
print('Export AE transform from objects:')
for o in objects_selection:
print('- ', o.name)
export_ae_transforms(directory=output_path,
selection=objects_selection,
camera=cam,
@ -334,11 +332,10 @@ class GPEXP_OT_export_anim_to_ae(bpy.types.Operator, ExportHelper):
fr=self.data_lang == 'FR',
export_format=self.file_format)
self.report({'INFO'}, f'File saved here: {self.filepath}')
self.report({'INFO'}, f'File(s) saved in folder: {output_path}')
return {"FINISHED"}
def get_object_selection(use_selection=False, use_visible=False, use_active_collection=False, object_types=None):
context = bpy.context
## determine selection based on filters4
@ -383,10 +380,11 @@ def get_object_selection(use_selection=False, use_visible=False, use_active_coll
def export_main(layout, operator, is_file_browser):
layout.prop(operator, 'exposition')
layout.prop(operator, 'use_grease_pencil_keys')
layout.prop(operator, 'use_object_keys')
layout.prop(operator, 'use_active_camera')
col = layout.column()
col.prop(operator, 'exposition')
# col.prop(operator, 'use_grease_pencil_keys')
# col.prop(operator, 'use_object_keys')
col.prop(operator, 'use_active_camera')
## Format (language and file)
layout.prop(operator, 'data_lang', expand=True)
@ -628,14 +626,14 @@ class GPEXP_PT_extra_gprender_func(bpy.types.Panel):
col.operator("gp.export_keys_to_ae")
col.operator("gp.export_cam_keys_to_ae")
# def overcan_shift_fix_ui(self, context):
# layout = self.layout
# layout.operator("gp.fix_overscan_shift")
def export_ae_anim_menu(self, context):
self.layout.operator('gp.export_anim_to_ae', text='After Effects Keyframe Data (.txt|.json)')
row = self.layout.row(align=False)
row.operator('gp.export_anim_to_ae', text='After Effects Keyframe Data (.txt/.json)')
# row.operator('gp.export_anim_to_ae', text='', icon='COPYDOWN')
classes=(

View File

@ -2,7 +2,7 @@ bl_info = {
"name": "GP Render",
"description": "Organise export of gp layers through compositor output",
"author": "Samuel Bernou",
"version": (1, 8, 7),
"version": (1, 8, 8),
"blender": (3, 0, 0),
"location": "View3D",
"warning": "",