diff --git a/src/bonsai/bonsai/bim/helper.py b/src/bonsai/bonsai/bim/helper.py index 31be04f874..b4e3ba4f79 100644 --- a/src/bonsai/bonsai/bim/helper.py +++ b/src/bonsai/bonsai/bim/helper.py @@ -314,7 +314,7 @@ def prop_with_search( row = layout.row(align=True) row.prop(data, prop_name, **kwargs) try: - if len(get_enum_items(data, prop_name, original_operator_path=original_operator_path)) > 10: + if len(get_enum_items(data, prop_name, original_operator_path=original_operator_path)) > 0: # Magick courtesy of https://blender.stackexchange.com/a/203443/86891 row.context_pointer_set(name="data", data=data) op = row.operator("bim.enum_property_search", text="", icon="VIEWZOOM") diff --git a/src/bonsai/bonsai/bim/module/geometry/__init__.py b/src/bonsai/bonsai/bim/module/geometry/__init__.py index 61db6923c9..bba979af30 100644 --- a/src/bonsai/bonsai/bim/module/geometry/__init__.py +++ b/src/bonsai/bonsai/bim/module/geometry/__init__.py @@ -77,6 +77,7 @@ classes = ( operator.UpdateItemAttributes, operator.UpdateParametricRepresentation, operator.UpdateRepresentation, + operator.CreateInstance, prop.RepresentationItem, prop.RepresentationItemObject, prop.ShapeAspect, diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index f59467def6..0ed5c4cdd6 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -46,6 +46,7 @@ import bonsai.core.root import bonsai.core.drawing import bonsai.tool as tool import bonsai.bim.handler +from bonsai.bim.module.model.data import AuthoringData from mathutils import Vector, Matrix, Quaternion from time import time from bonsai.bim.ifc import IfcStore @@ -3432,3 +3433,38 @@ class UnassignRepresentationLayer(bpy.types.Operator, tool.Ifc.Operator): layer = ifc_file.by_id(self.layer_id) ifcopenshell.api.layer.unassign_layer(ifc_file, [representation], layer) return {"FINISHED"} + + +class CreateInstance(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.create_instance" + bl_label = "IFC Create Instance" + bl_description = "Create an instance of the type associated with the selected object" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + if not context.selected_objects or len(context.selected_objects) > 1: + self.report({"ERROR"}, "Select exactly one object to create an instance of its type") + return {"CANCELLED"} + + active_obj = context.active_object + element = tool.Ifc.get_entity(active_obj) + if not element: + self.report({"ERROR"}, "Selected object is not an IFC element") + return {"CANCELLED"} + + relating_type = ifcopenshell.util.element.get_type(element) + if not relating_type: + self.report({"ERROR"}, "Selected object has no associated type") + return {"CANCELLED"} + + try: + props = tool.Model.get_model_props() + props.ifc_class = relating_type.is_a() + props.relating_type_id = str(relating_type.id()) + except: + self.report({"ERROR"}, "You must be using the Multiobject Tool or the relevant editing tool") + return {"CANCELLED"} + + bpy.ops.bim.hotkey(hotkey="S_A") + + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/geometry/ui.py b/src/bonsai/bonsai/bim/module/geometry/ui.py index 8b7e7be43a..f814cd21d3 100644 --- a/src/bonsai/bonsai/bim/module/geometry/ui.py +++ b/src/bonsai/bonsai/bim/module/geometry/ui.py @@ -66,6 +66,12 @@ def object_menu(self, context): self.layout.menu("BIM_MT_object_set_origin", icon="PLUGIN") self.layout.menu("BIM_MT_separate", icon="PLUGIN") + # only show the create instance operator if the current tool is the BIM tool + # if context.space_data and hasattr(context.space_data, "show_object_viewport_mesh"): + # current_tool = context.workspace.tools.from_space_view3d_mode(context.mode, create=False) + # if current_tool and current_tool.idname == "bim.bim_tool": + self.layout.operator("bim.create_instance", icon="PLUGIN") + def edit_mesh_menu(self, context): self.layout.separator()