diff --git a/io_scene_fbx/__init__.py b/io_scene_fbx/__init__.py index 9a7527bc0..9a657d85b 100644 --- a/io_scene_fbx/__init__.py +++ b/io_scene_fbx/__init__.py @@ -315,6 +315,11 @@ class ExportFBX(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="", + ) global_scale: FloatProperty( name="Scale", description="Scale all data (Some importers do not support scaled armatures!)", @@ -557,8 +562,11 @@ class ExportFBX(bpy.types.Operator, ExportHelper): layout.use_property_split = True layout.use_property_decorate = False # No animation. - export_main(layout, self) - export_panel_include(layout, self) + # Are we inside the File browser + is_file_browser = context.space_data.type == 'FILE_BROWSER' + + export_main(layout, self, is_file_browser) + export_panel_include(layout, self, is_file_browser) export_panel_transform(layout, self) export_panel_geometry(layout, self) export_panel_armature(layout, self) @@ -589,27 +597,29 @@ class ExportFBX(bpy.types.Operator, ExportHelper): return export_fbx_bin.save(self, context, **keywords) -def export_main(layout, operator): +def export_main(layout, operator, is_file_browser): row = layout.row(align=True) row.prop(operator, "path_mode") sub = row.row(align=True) sub.enabled = (operator.path_mode == 'COPY') sub.prop(operator, "embed_textures", text="", icon='PACKAGE' if operator.embed_textures else 'UGLYPACKAGE') - row = layout.row(align=True) - row.prop(operator, "batch_mode") - sub = row.row(align=True) - sub.prop(operator, "use_batch_own_dir", text="", icon='NEWFOLDER') + if is_file_browser: + row = layout.row(align=True) + row.prop(operator, "batch_mode") + sub = row.row(align=True) + sub.prop(operator, "use_batch_own_dir", text="", icon='NEWFOLDER') -def export_panel_include(layout, operator): +def export_panel_include(layout, operator, is_file_browser): header, body = layout.panel("FBX_export_include", default_closed=False) header.label(text="Include") if body: sublayout = body.column(heading="Limit to") sublayout.enabled = (operator.batch_mode == 'OFF') - sublayout.prop(operator, "use_selection") - sublayout.prop(operator, "use_visible") - sublayout.prop(operator, "use_active_collection") + if is_file_browser: + sublayout.prop(operator, "use_selection") + sublayout.prop(operator, "use_visible") + sublayout.prop(operator, "use_active_collection") body.column().prop(operator, "object_types") body.prop(operator, "use_custom_props") @@ -681,6 +691,7 @@ class IO_FH_fbx(bpy.types.FileHandler): bl_idname = "IO_FH_fbx" bl_label = "FBX" bl_import_operator = "import_scene.fbx" + bl_export_operator = "export_scene.fbx" bl_file_extensions = ".fbx" @classmethod diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py index 148d45f76..b1b30440f 100644 --- a/io_scene_fbx/export_fbx_bin.py +++ b/io_scene_fbx/export_fbx_bin.py @@ -3586,6 +3586,7 @@ def save(operator, context, use_selection=False, use_visible=False, use_active_collection=False, + collection="", batch_mode='OFF', use_batch_own_dir=False, **kwargs @@ -3606,13 +3607,23 @@ def save(operator, context, if batch_mode == 'OFF': kwargs_mod = kwargs.copy() + + source_collection = None if use_active_collection: - if use_selection: - ctx_objects = tuple(obj - for obj in context.view_layer.active_layer_collection.collection.all_objects - if obj.select_get()) + source_collection = context.view_layer.active_layer_collection.collection + elif collection: + local_collection = bpy.data.collections.get((collection, None)) + if local_collection: + source_collection = local_collection else: - ctx_objects = context.view_layer.active_layer_collection.collection.all_objects + operator.report({'ERROR'}, "Collection '%s' was not found" % collection) + return {'CANCELLED'} + + if source_collection: + if use_selection: + ctx_objects = tuple(obj for obj in source_collection.all_objects if obj.select_get()) + else: + ctx_objects = source_collection.all_objects else: if use_selection: ctx_objects = context.selected_objects