From 277e53d5ac1f9514a31d4b9fd9ac1d7a049e36d5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 10 Jun 2024 18:07:01 +1000 Subject: [PATCH] General cleanup of collection code in covering tool and dead arguments. It seems there is a lot of copy paste going on here. There needs to be a more detailed review once the v0.8.0 blob is more stable because right now I cannot fully test - it's hard to say if create_shape fails due to our bug or due to v0.8.0 not yet being stable. I'll revisit this later. --- .../bim/module/boundary/operator.py | 12 +- .../bim/module/covering/workspace.py | 135 ++++-------------- .../blenderbim/bim/module/model/covering.py | 131 +++++------------ .../blenderbim/bim/module/model/door.py | 2 - .../blenderbim/bim/module/model/profile.py | 11 +- src/blenderbim/blenderbim/core/covering.py | 87 ++++++----- src/blenderbim/blenderbim/core/spatial.py | 4 - src/blenderbim/blenderbim/core/tool.py | 1 - src/blenderbim/blenderbim/tool/spatial.py | 20 +-- 9 files changed, 121 insertions(+), 282 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/boundary/operator.py b/src/blenderbim/blenderbim/bim/module/boundary/operator.py index fd984b5118..3375f02639 100644 --- a/src/blenderbim/blenderbim/bim/module/boundary/operator.py +++ b/src/blenderbim/blenderbim/bim/module/boundary/operator.py @@ -629,24 +629,18 @@ class AddBoundary(bpy.types.Operator, tool.Ifc.Operator): # TODO : refactor to be able to generate all boundaries for selected space automatically or with an option def msg(self, context): - self.layout.label(text="NO ACTIVE STOREY") + self.layout.label(text="Please set an active container to detect space boundaries from.") element = tool.Ifc.get_entity(objs[0]) if element.is_a("IfcSpace"): relating_space = element relating_space_obj = objs[0] - collection = context.view_layer.active_layer_collection.collection - collection_obj = bpy.data.objects.get(collection.name) - if not collection_obj: - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - spatial_element = tool.Ifc.get_entity(collection_obj) - if not spatial_element: + if not (container := tool.Root.get_default_container()): bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") return - for subelement in ifcopenshell.util.element.get_decomposition(spatial_element): + for subelement in ifcopenshell.util.element.get_decomposition(container): if not ( subelement.is_a("IfcWall") or subelement.is_a("IfcSlab") or subelement.is_a("IfcVirtualElement") ): diff --git a/src/blenderbim/blenderbim/bim/module/covering/workspace.py b/src/blenderbim/blenderbim/bim/module/covering/workspace.py index d71d04f3fb..bb7b4f8883 100644 --- a/src/blenderbim/blenderbim/bim/module/covering/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/covering/workspace.py @@ -35,6 +35,7 @@ class Operator: blenderbim.bim.handler.refresh_ui_data() return {"FINISHED"} + class CoveringTool(WorkSpaceTool): bl_space_type = "VIEW_3D" bl_context_mode = "OBJECT" @@ -53,18 +54,19 @@ class CoveringTool(WorkSpaceTool): def draw_settings(cls, context, layout, ws_tool): CoveringToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type) + def add_layout_hotkey(layout, text, hotkey, description): args = ["covering", layout, text, hotkey, description] tool.Blender.add_layout_hotkey_operator(*args) + class CoveringToolUI: @classmethod - def draw(cls, context, layout, ifc_element_type = None): + def draw(cls, context, layout, ifc_element_type=None): cls.layout = layout cls.props = context.scene.BIMModelProperties cls.covering_props = context.scene.BIMCoveringProperties - row = cls.layout.row(align=True) if not tool.Ifc.get(): row.label(text="No IFC Project", icon="ERROR") @@ -82,8 +84,6 @@ class CoveringToolUI: cls.draw_default_interface() - - @classmethod def draw_header_interface(cls): cls.draw_type_selection_interface() @@ -95,122 +95,35 @@ class CoveringToolUI: row = cls.layout.row(align=True) row.prop(data=cls.covering_props, property="ceiling_height", text="Ceiling Height") if AuthoringData.data["ifc_classes"]: - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) - collection = bpy.context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj - - relating_type_id = int(cls.props.relating_type_id) - type_material_usage = ifcopenshell.util.element.get_material(tool.Ifc.get().by_id(relating_type_id)).is_a() - -# PLEASE KEEP COMMENTS AS A REMINDER -# elif element and bpy.context.selected_objects and element.is_a("IfcSpace"): -# op. = row.operator("bim.add_istance_flooring_from_spaces"): - -# if (type_material_usage == "IfcMaterialLayerSet" and -# not bpy.context.selected_objects): -# row = cls.layout.row(align=True) -# row.label(text="", icon="EVENT_SHIFT") -# row.label(text="", icon="EVENT_A") -# if tool.Ifc.get_entity(collection_obj): -# if AuthoringData.data["predefined_type"] == "FLOORING": -# op = row.operator("bim.add_instance_flooring_covering_from_cursor") -# elif AuthoringData.data["predefined_type"] == "CEILING": -# op = row.operator("bim.add_instance_ceiling_covering_from_cursor") -# else: -# op = row.operator("bim.add_constr_type_instance", text="Add") -# op.from_invoke = True -# if cls.props.relating_type_id.isnumeric(): -# op.relating_type_id = int(cls.props.relating_type_id) -# -# else: -# op = row.operator("bim.add_constr_type_instance", text="Add") -# op.from_invoke = True -# if cls.props.relating_type_id.isnumeric(): -# op.relating_type_id = int(cls.props.relating_type_id) -# -# elif (AuthoringData.data["predefined_type"] == "FLOORING" and -# type_material_usage == "IfcMaterialLayerSet" and -# element and -# bpy.context.selected_objects and -# element.is_a("IfcWall")): -# row = cls.layout.row(align=True) -# row.label(text="", icon="EVENT_SHIFT") -# row.label(text="", icon="EVENT_A") -# op = row.operator("bim.add_instance_flooring_coverings_from_walls") -# -# elif (AuthoringData.data["predefined_type"] == "CEILING" and -# type_material_usage == "IfcMaterialLayerSet" and -# element and -# bpy.context.selected_objects and -# element.is_a("IfcWall")): -# row = cls.layout.row(align=True) -# row.label(text="", icon="EVENT_SHIFT") -# row.label(text="", icon="EVENT_A") -# op = row.operator("bim.add_instance_ceiling_coverings_from_walls") -# -# elif (element and -# bpy.context.selected_objects and -# element.is_a("IfcCovering") and -## AuthoringData.data["predefined_type"] == "FLOORING" and -# AuthoringData.data["active_material_usage"] == "LAYER3"): -# row = cls.layout.row(align=True) -# row.label(text="", icon="EVENT_SHIFT") -# row.label(text="", icon="EVENT_G") -# op = row.operator("bim.regen_selected_covering_object") - + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + row.operator("bim.add_constr_type_instance", text="Add") row = cls.layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_constr_type_instance", text="Add") + row.operator("bim.add_instance_flooring_covering_from_cursor") row = cls.layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_flooring_covering_from_cursor") + row.operator("bim.add_instance_ceiling_covering_from_cursor") row = cls.layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_ceiling_covering_from_cursor") + row.operator("bim.add_instance_flooring_coverings_from_walls") row = cls.layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_flooring_coverings_from_walls") - - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_ceiling_coverings_from_walls") + row.operator("bim.add_instance_ceiling_coverings_from_walls") row = cls.layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_G") - op = row.operator("bim.regen_selected_covering_object") - -# elif AuthoringData.data["predefined_type"] == "CEILING": -# row = cls.layout.row(align=True) -# row.prop(data=cls.props, property="ceiling_height", text="ceiling height") -# if element and bpy.context.selected_objects and element.is_a("IfcWall"): -# op = row.operator("bim.add_instance_ceiling_coverings_from_walls") -# elif element and bpy.context.selected_objects and element.is_a("IfcSpace"): -# op. = row.operator("bim.add_istance_flooring_from_spaces"): -# else: -# op = row.operator("bim.add_instance_ceiling_from_cursor") -# op = row.operator("bim.add_constr_type_instance", text="Add") -# op.from_invoke = True -# if cls.props.relating_type_id.isnumeric(): -# op.relating_type_id = int(cls.props.relating_type_id) -# else: -# row = cls.layout.row(align=True) -# row.label(text="", icon="EVENT_SHIFT") -# row.label(text="", icon="EVENT_A") -# op = row.operator("bim.add_constr_type_instance", text="Add") -# op.from_invoke = True -# if cls.props.relating_type_id.isnumeric(): -# op.relating_type_id = int(cls.props.relating_type_id) + row.operator("bim.regen_selected_covering_object") @classmethod def draw_type_selection_interface(cls): @@ -256,7 +169,7 @@ class Hotkey(bpy.types.Operator, Operator): return operator.description or "" def _execute(self, context): -# self.props = context.scene.BIMCoveringProperties + # self.props = context.scene.BIMCoveringProperties getattr(self, f"hotkey_{self.hotkey}")() def invoke(self, context, event): @@ -270,20 +183,19 @@ class Hotkey(bpy.types.Operator, Operator): def hotkey_S_A(self): active_obj = bpy.context.active_object element = tool.Ifc.get_entity(active_obj) - collection = bpy.context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj + container = tool.Root.get_default_container() if AuthoringData.data["predefined_type"] == "FLOORING": if element and bpy.context.selected_objects and element.is_a("IfcWall"): bpy.ops.bim.add_instance_flooring_coverings_from_walls() - elif tool.Ifc.get_entity(collection_obj): + elif container: bpy.ops.bim.add_instance_flooring_covering_from_cursor() else: bpy.ops.bim.add_constr_type_instance() elif AuthoringData.data["predefined_type"] == "CEILING": if element and bpy.context.selected_objects and element.is_a("IfcWall"): bpy.ops.bim.add_instance_ceiling_coverings_from_walls() - elif tool.Ifc.get_entity(collection_obj): + elif container: bpy.ops.bim.add_instance_ceiling_covering_from_cursor() else: bpy.ops.bim.add_constr_type_instance() @@ -293,9 +205,10 @@ class Hotkey(bpy.types.Operator, Operator): def hotkey_S_G(self): active_obj = bpy.context.active_object element = tool.Ifc.get_entity(active_obj) - if (element and - bpy.context.selected_objects and - element.is_a("IfcCovering") and - AuthoringData.data["active_material_usage"] == "LAYER3"): - bpy.ops.bim.regen_selected_covering_object() - + if ( + element + and bpy.context.selected_objects + and element.is_a("IfcCovering") + and AuthoringData.data["active_material_usage"] == "LAYER3" + ): + bpy.ops.bim.regen_selected_covering_object() diff --git a/src/blenderbim/blenderbim/bim/module/model/covering.py b/src/blenderbim/blenderbim/bim/module/model/covering.py index c5791e9c13..efd1c47467 100644 --- a/src/blenderbim/blenderbim/bim/module/model/covering.py +++ b/src/blenderbim/blenderbim/bim/module/model/covering.py @@ -22,6 +22,7 @@ import ifcopenshell import blenderbim.tool as tool import blenderbim.core.covering as core + class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_instance_flooring_covering_from_cursor" bl_label = "Add Flooring From Cursor" @@ -30,28 +31,16 @@ class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operato @classmethod def poll(cls, context): - collection = context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) - return tool.Ifc.get_entity(collection_obj) and relating_type == "FLOORING" + return relating_type == "FLOORING" def _execute(self, context): + try: + core.add_instance_flooring_covering_from_cursor(tool.Ifc, tool.Root, tool.Spatial) + except core.NoDefaultContainer: + return self.report({"ERROR"}, "Please set a default container to create the covering in.") - def msg(self, context): - self.layout.label(text="NO ACTIVE STOREY") - - collection = context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj - if not collection_obj: - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - spatial_element = tool.Ifc.get_entity(collection_obj) - if not spatial_element: - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - - core.add_instance_flooring_covering_from_cursor(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry) class AddInstanceCeilingCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_instance_ceiling_covering_from_cursor" @@ -61,28 +50,16 @@ class AddInstanceCeilingCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator @classmethod def poll(cls, context): - collection = context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) - return tool.Ifc.get_entity(collection_obj) and relating_type == "CEILING" + return relating_type == "CEILING" def _execute(self, context): + try: + core.add_instance_ceiling_covering_from_cursor(tool.Ifc, tool.Root, tool.Covering, tool.Spatial) + except core.NoDefaultContainer: + return self.report({"ERROR"}, "Please set a default container to create the covering in.") - def msg(self, context): - self.layout.label(text="NO ACTIVE STOREY") - - collection = context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj - if not collection_obj: - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - spatial_element = tool.Ifc.get_entity(collection_obj) - if not spatial_element: - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - - core.add_instance_ceiling_covering_from_cursor(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry, tool.Covering) class RegenSelectedCoveringObject(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.regen_selected_covering_object" @@ -92,39 +69,31 @@ class RegenSelectedCoveringObject(bpy.types.Operator, tool.Ifc.Operator): @classmethod def poll(cls, context): - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) + element = tool.Ifc.get_entity(bpy.context.active_object) return element and element.is_a("IfcCovering") def _execute(self, context): - - def msg(self, context): - self.layout.label(text="NO ACTIVE STOREY") - - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) - if not element.is_a("IfcCovering"): - bpy.context.window_manager.popup_menu(msg, title="Error", icon="ERROR") - return - - core.regen_selected_covering_object(tool.Ifc, tool.Spatial, tool.Model, tool.Type, tool.Geometry) + try: + core.regen_selected_covering_object(tool.Root, tool.Spatial) + except core.NoDefaultContainer: + return self.report({"ERROR"}, "Please set a default container to create the covering in.") class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_instance_flooring_coverings_from_walls" bl_label = "Add Flooring From Walls" bl_options = {"REGISTER", "UNDO"} - bl_description = "Add instance flooring coverings from selected walls. The active object must be a wall and layered vertically" + bl_description = ( + "Add instance flooring coverings from selected walls. The active object must be a wall and layered vertically" + ) @classmethod def poll(cls, context): - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) + element = tool.Ifc.get_entity(bpy.context.active_object) relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) - if element: - if element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": - return context.selected_objects and relating_type == "FLOORING" + if element and element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": + return context.selected_objects and relating_type == "FLOORING" def _execute(self, context): # This only works based on a 2D plan only considering the standard @@ -132,40 +101,27 @@ class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operato # In order to run, the active object must be a wall and # there must be selected walls - active_obj = bpy.context.active_object - if not active_obj: - self.report({"ERROR"}, "No active object. Please select a wall") - return + try: + core.add_instance_flooring_coverings_from_walls(tool.Root, tool.Spatial) + except core.NoDefaultContainer: + return self.report({"ERROR"}, "Please set a default container to create the covering in.") - element = tool.Ifc.get_entity(active_obj) - if element and not element.is_a("IfcWall"): - return self.report({"ERROR"}, "The active object is not a wall. Please select a wall.") - - container = ifcopenshell.util.element.get_container(element) - if not container: - self.report({"ERROR"}, "The wall is not contained.") - - if not bpy.context.selected_objects: - self.report({"ERROR"}, "No selected objects found. Please select walls.") - return - - core.add_instance_flooring_coverings_from_walls(tool.Ifc, tool.Spatial, tool.Collector, tool.Geometry) class AddInstanceCeilingCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_instance_ceiling_coverings_from_walls" bl_label = "Add Ceiling From Walls" bl_options = {"REGISTER", "UNDO"} - bl_description = "Add instance ceiling coverings from selected walls. The active object must be a wall and layered vertically" + bl_description = ( + "Add instance ceiling coverings from selected walls. The active object must be a wall and layered vertically" + ) @classmethod def poll(cls, context): - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) + element = tool.Ifc.get_entity(bpy.context.active_object) relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) - if element: - if element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": - return context.selected_objects and relating_type == "CEILING" + if element and element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": + return context.selected_objects and relating_type == "CEILING" def _execute(self, context): # This only works based on a 2D plan only considering the standard @@ -173,22 +129,7 @@ class AddInstanceCeilingCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator # In order to run, the active object must be a wall and # there must be selected walls - active_obj = bpy.context.active_object - if not active_obj: - self.report({"ERROR"}, "No active object. Please select a wall") - return - - element = tool.Ifc.get_entity(active_obj) - if element and not element.is_a("IfcWall"): - return self.report({"ERROR"}, "The active object is not a wall. Please select a wall.") - - container = ifcopenshell.util.element.get_container(element) - if not container: - self.report({"ERROR"}, "The wall is not contained.") - - if not bpy.context.selected_objects: - self.report({"ERROR"}, "No selected objects found. Please select walls.") - return - - core.add_instance_ceiling_coverings_from_walls(tool.Ifc, tool.Spatial, tool.Collector, tool.Geometry, tool.Covering) - + try: + core.add_instance_ceiling_coverings_from_walls(tool.Root, tool.Spatial, tool.Covering) + except core.NoDefaultContainer: + return self.report({"ERROR"}, "Please set a default container to create the covering in.") diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index c7f4ca32f4..e971a5015d 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -508,8 +508,6 @@ class BIM_OT_add_door(bpy.types.Operator, tool.Ifc.Operator): mesh = bpy.data.meshes.new("IfcDoor") obj = bpy.data.objects.new("IfcDoor", mesh) obj.location = spawn_location - collection = context.view_layer.active_layer_collection.collection - collection.objects.link(obj) element = blenderbim.core.root.assign_class( tool.Ifc, tool.Collector, tool.Root, obj=obj, ifc_class="IfcDoor", should_add_representation=False diff --git a/src/blenderbim/blenderbim/bim/module/model/profile.py b/src/blenderbim/blenderbim/bim/module/model/profile.py index a23749d051..bec513544e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/profile.py +++ b/src/blenderbim/blenderbim/bim/module/model/profile.py @@ -57,8 +57,10 @@ class DumbProfileGenerator: self.body_context = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW") self.axis_context = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Axis", "GRAPH_VIEW") props = bpy.context.scene.BIMModelProperties - self.collection = bpy.context.view_layer.active_layer_collection.collection - self.collection_obj = self.collection.BIMCollectionProperties.obj + self.container = None + if container := tool.Root.get_default_container(): + self.container = container + self.container_obj = tool.Ifc.get_object(container) self.depth = props.extrusion_depth self.rotation = 0 self.location = Vector((0, 0, 0)) @@ -83,9 +85,8 @@ class DumbProfileGenerator: ): matrix_world = Matrix.Rotation(pi / 2, 4, "Z") @ Matrix.Rotation(pi / 2, 4, "X") @ matrix_world matrix_world.translation = self.location - if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id: - matrix_world.translation.z = self.collection_obj.location.z - self.collection.objects.link(obj) + if self.container_obj: + matrix_world.translation.z = self.container_obj.location.z element = blenderbim.core.root.assign_class( tool.Ifc, diff --git a/src/blenderbim/blenderbim/core/covering.py b/src/blenderbim/blenderbim/core/covering.py index a182ed57b9..fd85fa4aed 100644 --- a/src/blenderbim/blenderbim/core/covering.py +++ b/src/blenderbim/blenderbim/core/covering.py @@ -16,10 +16,13 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . -def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geometry): + +def add_instance_flooring_covering_from_cursor(ifc, root, spatial): + if not root.get_default_container(): + raise NoDefaultContainer() + active_obj = spatial.get_active_obj() selected_objects = spatial.get_selected_objects() - element = None relating_type_id = spatial.get_relating_type_id() relating_type = None @@ -30,8 +33,6 @@ def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geomet if selected_objects and active_obj: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_active_obj(active_obj) - element = ifc.get_entity(active_obj) - else: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor() @@ -42,25 +43,28 @@ def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geomet bm = spatial.get_bmesh_from_polygon(space_polygon, h=0) name = "Covering" - mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm) + mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) obj = spatial.get_named_obj_from_mesh(name, mesh) spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) - spatial.traslate_obj_to_z_location(obj, z) - spatial.link_obj_to_active_collection(obj) + spatial.translate_obj_to_z_location(obj, z) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices = points) + spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(ifc, geometry, obj, body) + print(obj, body) + spatial.regen_obj_representation(obj, body) + + +def add_instance_ceiling_covering_from_cursor(ifc, root, covering, spatial): + if not root.get_default_container(): + raise NoDefaultContainer() -def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometry, covering): active_obj = spatial.get_active_obj() selected_objects = spatial.get_selected_objects() - element = None relating_type_id = spatial.get_relating_type_id() relating_type = None @@ -71,8 +75,6 @@ def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometr if selected_objects and active_obj: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_active_obj(active_obj) - element = ifc.get_entity(active_obj) - else: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor() ceiling_height = covering.get_z_from_ceiling_height() @@ -84,29 +86,30 @@ def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometr bm = spatial.get_bmesh_from_polygon(space_polygon, h=0) name = "Covering" - mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm) + mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) obj = spatial.get_named_obj_from_mesh(name, mesh) spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) - spatial.traslate_obj_to_z_location(obj, z+ceiling_height) - spatial.link_obj_to_active_collection(obj) + spatial.translate_obj_to_z_location(obj, z + ceiling_height) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices = points) + spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(ifc, geometry, obj, body) + spatial.regen_obj_representation(obj, body) -def regen_selected_covering_object(ifc, spatial, model, Type, geometry): +def regen_selected_covering_object(root, spatial): + if not root.get_default_container(): + raise NoDefaultContainer() + active_obj = spatial.get_active_obj() selected_objects = spatial.get_selected_objects() if selected_objects and active_obj: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_active_obj(active_obj) - element = ifc.get_entity(active_obj) space_polygon = spatial.get_space_polygon_from_context_visible_objects(x, y) @@ -116,19 +119,23 @@ def regen_selected_covering_object(ifc, spatial, model, Type, geometry): bm = spatial.get_bmesh_from_polygon(space_polygon, h=0) name = "Aux" - mesh = spatial.get_named_mesh_from_bmesh(name = name, bmesh = bm) + mesh = spatial.get_named_mesh_from_bmesh(name=name, bmesh=bm) mesh = spatial.get_transformed_mesh_from_local_to_global(mesh) obj = spatial.get_named_obj_from_mesh(name, mesh) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) - spatial.assign_swept_area_outer_curve_from_2d_vertices(active_obj, vertices = points) + spatial.assign_swept_area_outer_curve_from_2d_vertices(active_obj, vertices=points) body = spatial.get_body_representation(active_obj) - spatial.regen_obj_representation(ifc, geometry, active_obj, body) + spatial.regen_obj_representation(active_obj, body) + + +# TODO CHECK IF IT IS POSSIBLE TO CREATE ONLY ONE CORE FUNCTION FOR _FROM_WALLS +def add_instance_flooring_coverings_from_walls(root, spatial): + if not root.get_default_container(): + raise NoDefaultContainer() -#TODO CHECK IF IT IS POSSIBLE TO CREATE ONLY ONE CORE FUNCTION FOR _FROM_WALLS -def add_instance_flooring_coverings_from_walls(ifc, spatial, collector, geometry): z = spatial.get_active_obj_z() union = spatial.get_union_shape_from_selected_objects() for i, linear_ring in enumerate(union.interiors): @@ -136,23 +143,25 @@ def add_instance_flooring_coverings_from_walls(ifc, spatial, collector, geometry bm = spatial.get_bmesh_from_polygon(poly, h=0) name = "Covering" + str(i) - obj = spatial.get_named_obj_from_bmesh(name, bmesh = bm) + obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) spatial.set_obj_origin_to_bboxcenter(obj) - spatial.traslate_obj_to_z_location(obj, z) - spatial.link_obj_to_active_collection(obj) + spatial.translate_obj_to_z_location(obj, z) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - spatial.assign_container_to_obj(obj) - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices = points) + spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(ifc, geometry, obj, body) + spatial.regen_obj_representation(obj, body) + + +def add_instance_ceiling_coverings_from_walls(root, spatial, covering): + if not root.get_default_container(): + raise NoDefaultContainer() -def add_instance_ceiling_coverings_from_walls(ifc, spatial, collector, geometry, covering): z = covering.get_z_from_ceiling_height() + spatial.get_active_obj_z() union = spatial.get_union_shape_from_selected_objects() for i, linear_ring in enumerate(union.interiors): @@ -160,18 +169,20 @@ def add_instance_ceiling_coverings_from_walls(ifc, spatial, collector, geometry, bm = spatial.get_bmesh_from_polygon(poly, h=0) name = "Covering" + str(i) - obj = spatial.get_named_obj_from_bmesh(name, bmesh = bm) + obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) spatial.set_obj_origin_to_bboxcenter(obj) - spatial.traslate_obj_to_z_location(obj, z) - spatial.link_obj_to_active_collection(obj) + spatial.translate_obj_to_z_location(obj, z) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) spatial.assign_type_to_obj(obj) - spatial.assign_container_to_obj(obj) - spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices = points) + spatial.assign_swept_area_outer_curve_from_2d_vertices(obj, vertices=points) body = spatial.get_body_representation(obj) - spatial.regen_obj_representation(ifc, geometry, obj, body) + spatial.regen_obj_representation(obj, body) + + +class NoDefaultContainer(Exception): + pass diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index c529ea72bb..dcba890d7f 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -218,12 +218,8 @@ def generate_spaces_from_walls(ifc, spatial, collector): spatial.set_obj_origin_to_bboxcenter_and_zero_elevation(obj) spatial.translate_obj_to_z_location(obj, z) - - spatial.link_obj_to_active_collection(obj) spatial.assign_ifcspace_class_to_obj(obj) - spatial.assign_container_to_obj(obj) - def toggle_space_visibility(ifc, spatial): model = ifc.get() diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 8a4952eab1..4c267bb0f9 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -890,7 +890,6 @@ class Spatial: def get_active_obj_height(cls): pass def get_relating_type_id(cls): pass def translate_obj_to_z_location(cls, obj): pass - def link_obj_to_active_collection(cls, obj): pass def get_2d_vertices_from_obj(cls, obj): pass def get_scaled_2d_vertices(cls, points): pass def assign_swept_area_outer_curve_from_2d_vertices(cls, obj, vertices): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index c0d1eed801..290bfee1a5 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -707,10 +707,6 @@ class Spatial(blenderbim.core.tool.Spatial): if z != 0: obj.location = obj.location + Vector((0, 0, z)) - @classmethod - def link_obj_to_active_collection(cls, obj): - bpy.context.view_layer.active_layer_collection.collection.objects.link(obj) - @classmethod def get_2d_vertices_from_obj(cls, obj): points = [] @@ -772,20 +768,10 @@ class Spatial(blenderbim.core.tool.Spatial): blenderbim.core.type.assign_type(ifc, Type, element=element, type=relating_type) @classmethod - def assign_container_to_obj(cls, obj): - active_obj = bpy.context.active_object - element = tool.Ifc.get_entity(active_obj) - container = ifcopenshell.util.element.get_container(element) - container_obj = tool.Ifc.get_object(container) - blenderbim.core.spatial.assign_container( - tool.Ifc, tool.Collector, tool.Spatial, structure_obj=container_obj, element_obj=obj - ) - - @classmethod - def regen_obj_representation(cls, ifc, geometry, obj, body): + def regen_obj_representation(cls, obj, body): blenderbim.core.geometry.switch_representation( - ifc, - geometry, + tool.Ifc, + tool.Geometry, obj=obj, representation=body, should_reload=True,