Skip to content
Snippets Groups Projects
io_export_after_effects.py 45.7 KiB
Newer Older
  • Learn to ignore specific revisions
  •                 jsx_file.write(
                        '%s.property("%s").setValuesAtTimes([%s],[%s]);\n'
                        % (name_ae, prop, js_data['times'], obj[prop]))
                else:
                    jsx_file.write(
                        '%s.property("%s").setValue(%s);\n'
                        % (name_ae, prop, obj[prop + '_static']))
            jsx_file.write('\n')
        jsx_file.write('\n')
    
        # Create cameras
        jsx_file.write('// **************  CAMERAS  **************\n\n')
        for name_ae, obj in js_data['cameras'].items():
            # More than one camera can be selected
            jsx_file.write(
                'var %s = newComp.layers.addCamera("%s",[0,0]);\n'
                % (name_ae, name_ae))
            jsx_file.write(
                '%s.autoOrient = AutoOrientType.NO_AUTO_ORIENT;\n'
                % name_ae)
    
            # Set values of properties, add keyframes only where needed
            for prop in ("position", "orientation", "zoom"):
                if include_animation and obj[prop + '_anim']:
                    jsx_file.write(
                        '%s.property("%s").setValuesAtTimes([%s],[%s]);\n'
                        % (name_ae, prop, js_data['times'], obj[prop]))
                else:
                    jsx_file.write(
                        '%s.property("%s").setValue(%s);\n'
                        % (name_ae, prop, obj[prop + '_static']))
            jsx_file.write('\n')
        jsx_file.write('\n')
    
    
        # Exit import if no comp name given
    
        jsx_file.write('\n}else{alert ("Exit Import Blender animation data \\nNo Comp name has been chosen","EXIT")};')
    
        # Close function
        jsx_file.write("}\n\n\n")
        # Execute function. Wrap in "undo group" for easy undoing import process
        jsx_file.write('app.beginUndoGroup("Import Blender animation data");\n')
    
        jsx_file.write('compFromBlender();\n')  # Execute function
    
        jsx_file.write('app.endUndoGroup();\n\n\n')
        jsx_file.close()
    
    
        # Set current frame of animation in blender to state before export
        data['scn'].frame_set(curframe)
    
    
    
    ##########################################
    # ExportJsx class register/unregister
    ##########################################
    
    
    from bpy_extras.io_utils import ExportHelper
    
    from bpy.props import StringProperty, BoolProperty, FloatProperty
    
    
    
    class ExportJsx(bpy.types.Operator, ExportHelper):
        """Export selected cameras and objects animation to After Effects"""
        bl_idname = "export.jsx"
        bl_label = "Export to Adobe After Effects"
    
        bl_options = {'PRESET', 'UNDO'}
    
        filename_ext = ".jsx"
        filter_glob: StringProperty(default="*.jsx", options={'HIDDEN'})
    
        include_animation: BoolProperty(
                name="Animation",
                description="Animate Exported Cameras and Objects",
                default=True,
                )
        include_active_cam: BoolProperty(
                name="Active Camera",
                description="Include Active Camera",
                default=True,
                )
        include_selected_cams: BoolProperty(
                name="Selected Cameras",
                description="Add Selected Cameras",
                default=True,
                )
        include_selected_objects: BoolProperty(
                name="Selected Objects",
                description="Export Selected Objects",
                default=True,
                )
        include_cam_bundles: BoolProperty(
                name="Camera 3D Markers",
                description="Include 3D Markers of Camera Motion Solution for selected cameras",
                default=True,
                )
    
        include_image_planes: BoolProperty(
                name="Image Planes",
                description="Include image mesh objects",
                default=True,
                )
    
    #    include_ob_bundles = BoolProperty(
    #            name="Objects 3D Markers",
    #            description="Include 3D Markers of Object Motion Solution for selected cameras",
    #            default=True,
    #            )
    
        ae_size: FloatProperty(
                name="Scale",
                description="Size of AE Composition (pixels per 1 BU)",
                default=100.0,
                min=0.0,
                soft_max=10000,
                )
    
    
        def draw(self, context):
            layout = self.layout
    
            box = layout.box()
    
            box.label(text='Include Cameras and Objects')
    
            box.prop(self, 'include_active_cam')
            box.prop(self, 'include_selected_cams')
            box.prop(self, 'include_selected_objects')
    
            box.prop(self, 'include_image_planes')
            box = layout.box()
            box.prop(self, 'include_animation')
            box = layout.box()
            box.label(text='Transform')
            box.prop(self, 'ae_size')
            box = layout.box()
            box.label(text='Include Tracking Data:')
    
            box.prop(self, 'include_cam_bundles')
    #        box.prop(self, 'include_ob_bundles')
    
        @classmethod
        def poll(cls, context):
            selected = context.selected_objects
            camera = context.scene.camera
    
            return selected or camera
    
    
        def execute(self, context):
    
            data = get_comp_data(context)
            selection = get_selected(context)
            write_jsx_file(self.filepath, data, selection, self.include_animation,
                           self.include_active_cam, self.include_selected_cams,
                           self.include_selected_objects, self.include_cam_bundles,
                           self.include_image_planes, self.ae_size)
            print("\nExport to After Effects Completed")
            return {'FINISHED'}
    
        self.layout.operator(
            ExportJsx.bl_idname, text="Adobe After Effects (.jsx)")
    
    
    
    def register():
        bpy.utils.register_class(ExportJsx)
        bpy.types.TOPBAR_MT_file_export.append(menu_func)
    
    
    def unregister():
        bpy.utils.unregister_class(ExportJsx)
        bpy.types.TOPBAR_MT_file_export.remove(menu_func)
    
    
    if __name__ == "__main__":
    
    NBurn's avatar
    NBurn committed
        register()