diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py b/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py index 2db9dc7..521eaba 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py @@ -13,6 +13,7 @@ import bpy +from .export_active import SCENE_OT_Tree_Clipper_Export_Active from .operators_export import ( SCENE_OT_Tree_Clipper_Export_Cache, SCENE_OT_Tree_Clipper_Export_Modal, @@ -46,10 +47,22 @@ SCENE_OT_Tree_Clipper_Import_File_Prepare, SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare, SCENE_PT_Tree_Clipper_Panel, + SCENE_OT_Tree_Clipper_Export_Active, TreeClipperPreferences, ] +def draw_export_active(self, _context): + self.layout.operator(SCENE_OT_Tree_Clipper_Export_Active.bl_idname) + + +def draw_import(self, _context): + self.layout.operator( + SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.bl_idname, + text="Import Tree Clipper", + ) + + def register() -> None: print("Registering Tree Clipper") for cls in classes: @@ -58,9 +71,13 @@ def register() -> None: bpy.types.Scene.tree_clipper_external_import_items = bpy.props.PointerProperty( # ty: ignore[unresolved-attribute] type=Tree_Clipper_External_Import_Items ) + bpy.types.NODE_MT_context_menu.append(draw_import) + bpy.types.NODE_MT_context_menu.append(draw_export_active) def unregister() -> None: + bpy.types.NODE_MT_context_menu.remove(draw_export_active) + bpy.types.NODE_MT_context_menu.remove(draw_import) del bpy.types.Scene.tree_clipper_external_import_items # ty: ignore[unresolved-attribute] for cls in reversed(classes): bpy.utils.unregister_class(cls) diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py b/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py new file mode 100644 index 0000000..0c3e942 --- /dev/null +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py @@ -0,0 +1,36 @@ +import bpy + + +class SCENE_OT_Tree_Clipper_Export_Active(bpy.types.Operator): + bl_label = "Export Tree Clipper" + bl_idname = "scene.tree_clipper_export_active" + bl_description = ( + "Export the selected and active node group as a Tree Clipper string." + ) + + @classmethod + def poll(cls, context: bpy.types.Context) -> bool: + node = context.active_node + return ( + node is not None + and isinstance( + node, + bpy.types.CompositorNodeGroup + | bpy.types.GeometryNodeGroup + | bpy.types.ShaderNodeGroup + | bpy.types.TextureNodeGroup, + ) + and node.node_tree is not None + ) + + def execute(self, context: bpy.types.Context) -> None: # ty:ignore[invalid-method-override] + assert isinstance(context.space_data, bpy.types.SpaceNodeEditor) + assert context.active_node is not None + assert context.active_node.node_tree is not None # ty:ignore[unresolved-attribute] + + bpy.ops.scene.tree_clipper_export_prepare( # ty:ignore[unresolved-attribute] + "INVOKE_DEFAULT", + is_material=False, + name=context.active_node.node_tree.name, # ty:ignore[unresolved-attribute] + ) + return {"FINISHED"} # ty:ignore[invalid-return-type]