From 1f68464d467f723f351c540f3171668efc27f109 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 20 Dec 2024 19:39:28 +0500 Subject: [PATCH] Bonsai Attribute to support copying it's name to clipboard #5892 Example - https://i.imgur.com/Jf1jofZ.png --- src/bonsai/bonsai/bim/__init__.py | 1 + src/bonsai/bonsai/bim/operator.py | 13 +++++++++++++ src/bonsai/bonsai/bim/ui.py | 8 ++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/bonsai/bonsai/bim/__init__.py b/src/bonsai/bonsai/bim/__init__.py index 4a60f49845..88ad4bb364 100644 --- a/src/bonsai/bonsai/bim/__init__.py +++ b/src/bonsai/bonsai/bim/__init__.py @@ -105,6 +105,7 @@ classes = [ operator.ClippingPlaneCutWithCappings, operator.CloseBlendWarning, operator.CloseError, + operator.CopyTextToClipboard, operator.EditBlenderCollection, operator.FileAssociate, operator.FileUnassociate, diff --git a/src/bonsai/bonsai/bim/operator.py b/src/bonsai/bonsai/bim/operator.py index d23e856d49..09120e5187 100644 --- a/src/bonsai/bonsai/bim/operator.py +++ b/src/bonsai/bonsai/bim/operator.py @@ -1143,3 +1143,16 @@ class RevertClippingPlaneCut(bpy.types.Operator): if replaced_mesh: obj.data = replaced_mesh tool.Blender.remove_data_block(mesh, do_unlink=False) + + +class CopyTextToClipboard(bpy.types.Operator): + bl_idname = "bim.copy_text_to_clipboard" + bl_label = "Copy Text To Clipboard" + bl_description = "Copy text to clipboard." + bl_options = set() + + text: bpy.props.StringProperty(options={"SKIP_SAVE"}) + + def execute(self, context): + context.window_manager.clipboard = self.text + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py index 3b77ce2e8e..69d2f8fb64 100644 --- a/src/bonsai/bonsai/bim/ui.py +++ b/src/bonsai/bonsai/bim/ui.py @@ -1122,7 +1122,7 @@ def draw_statusbar(self, context): self.layout.label(text=text) -def draw_custom_context_menu(self, context): +def draw_custom_context_menu(self: bpy.types.Menu, context: bpy.types.Context) -> None: # https://blender.stackexchange.com/a/275555/86891 if ( not hasattr(context, "button_pointer") @@ -1150,12 +1150,16 @@ def draw_custom_context_menu(self, context): url = doc.get("spec_url", "") else: # It's a custom property set. No URL available url = "" + attr_name = attr.name if description: layout.separator() op_description = layout.operator("bim.show_description", text="IFC Description", icon="INFO") - op_description.attr_name = getattr(context.button_pointer, "name", "") + op_description.attr_name = attr_name op_description.description = description op_description.url = url + if attr_name: + op = layout.operator("bim.copy_text_to_clipboard", text="Copy Attribute Name", icon="COPYDOWN") + op.text = attr_name else: # Ugly but we can't know which type of data is under the cursor so we test everything until it clicks try: