From ec97c6498a8008c9505f40d728d595af04cc11b0 Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:05:22 +0200 Subject: [PATCH 1/3] feat: add menu functions for import and export --- .../src/tree_clipper_addon/__init__.py | 17 ++++++++ .../src/tree_clipper_addon/export_active.py | 41 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py 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..bd06686 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py @@ -31,6 +31,7 @@ ) from .panel import SCENE_PT_Tree_Clipper_Panel from .preferences import TreeClipperPreferences +from .export_active import SCENE_OT_Tree_Clipper_Export_Active classes = [ Tree_Clipper_External_Export_Item, @@ -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..f4e6d8d --- /dev/null +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py @@ -0,0 +1,41 @@ +import bpy + +from .operators_export import SCENE_OT_Tree_Clipper_Export_Prepare + +from .operators_import import ( + SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare, + SCENE_OT_Tree_Clipper_Import_File_Prepare, +) + + +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 compressed Tree Clipper string to the clipboard." + + @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] From 7123ff45d733e1c7b02266975b2b138fa37f7d0c Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:07:29 +0200 Subject: [PATCH 2/3] fix: match description to what it's doing --- .../src/tree_clipper_addon/export_active.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 index f4e6d8d..9b17249 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py @@ -11,7 +11,9 @@ 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 compressed Tree Clipper string to the clipboard." + bl_description = ( + "Export the selected and active node group as a Tree Clipper string." + ) @classmethod def poll(cls, context: bpy.types.Context) -> bool: From 056a93cbfef2f24258c5b4d1300ed3d9889e815f Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:14:59 +0200 Subject: [PATCH 3/3] tidy: ruff --- .../tree_clipper_addon/src/tree_clipper_addon/__init__.py | 2 +- .../src/tree_clipper_addon/export_active.py | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) 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 bd06686..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, @@ -31,7 +32,6 @@ ) from .panel import SCENE_PT_Tree_Clipper_Panel from .preferences import TreeClipperPreferences -from .export_active import SCENE_OT_Tree_Clipper_Export_Active classes = [ Tree_Clipper_External_Export_Item, 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 index 9b17249..0c3e942 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/export_active.py @@ -1,12 +1,5 @@ import bpy -from .operators_export import SCENE_OT_Tree_Clipper_Export_Prepare - -from .operators_import import ( - SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare, - SCENE_OT_Tree_Clipper_Import_File_Prepare, -) - class SCENE_OT_Tree_Clipper_Export_Active(bpy.types.Operator): bl_label = "Export Tree Clipper"