diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 0d2bc7a63d..3a1d0a74d0 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -161,6 +161,7 @@ class SwitchRepresentation(bpy.types.Operator): ifc_definition_id: bpy.props.IntProperty() should_reload: bpy.props.BoolProperty() disable_opening_subtractions: bpy.props.BoolProperty() + should_switch_all_meshes: bpy.props.BoolProperty() def execute(self, context): self.element_obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object @@ -172,11 +173,17 @@ class SwitchRepresentation(bpy.types.Operator): mesh = bpy.data.meshes.get(self.mesh_name) if mesh: - self.element_obj.data.user_remap(mesh) + self.switch_mesh(mesh) if not mesh or self.should_reload: self.pull_mesh_from_ifc() return {"FINISHED"} + def switch_mesh(self, mesh): + if self.should_switch_all_meshes or self.file.by_id(self.oprops.ifc_definition_id).is_a("IfcTypeProduct"): + self.element_obj.data.user_remap(mesh) + else: + self.element_obj.data = mesh + def get_mesh_name(self): representation = self.resolve_mapped_representation(self.file.by_id(self.ifc_definition_id)) return "{}/{}".format(self.context_of_items.id(), representation.id()) @@ -206,7 +213,7 @@ class SwitchRepresentation(bpy.types.Operator): mesh = ifc_importer.create_mesh(element, shape) mesh.name = self.mesh_name mesh.BIMMeshProperties.ifc_definition_id = self.ifc_definition_id - self.element_obj.data.user_remap(mesh) + self.switch_mesh(mesh) material_creator = import_ifc.MaterialCreator(ifc_import_settings, ifc_importer) material_creator.load_existing_materials() material_creator.create(element, self.element_obj, mesh) @@ -368,7 +375,9 @@ class UpdateParametricRepresentation(bpy.types.Operator): props = obj.data.BIMMeshProperties parameter = props.ifc_parameters[self.index] element = IfcStore.get_file().by_id(parameter.step_id)[parameter.index] = parameter.value - bpy.ops.bim.switch_representation(ifc_definition_id=props.ifc_definition_id, should_reload=True) + bpy.ops.bim.switch_representation( + ifc_definition_id=props.ifc_definition_id, should_reload=True, should_switch_all_meshes=True + ) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py index 936aeffd9a..83f48fa6d0 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -40,7 +40,9 @@ class BIM_PT_representations(Panel): row.label(text=representation["ContextOfItems"]["ContextIdentifier"]) row.label(text=representation["ContextOfItems"]["TargetView"]) row.label(text=representation["RepresentationType"]) - op = row.operator("bim.switch_representation", icon="OUTLINER_DATA_MESH", text="") + op = row.operator( + "bim.switch_representation", icon="OUTLINER_DATA_MESH", text="", should_switch_all_meshes=True + ) op.should_reload = True op.ifc_definition_id = ifc_definition_id op.disable_opening_subtractions = False @@ -70,11 +72,15 @@ class BIM_PT_mesh(Panel): props = context.active_object.data.BIMMeshProperties row = layout.row(align=True) - op = row.operator("bim.switch_representation", text="Bake Voids", icon="SELECT_SUBTRACT") + op = row.operator( + "bim.switch_representation", text="Bake Voids", icon="SELECT_SUBTRACT", should_switch_all_meshes=True + ) op.should_reload = True op.ifc_definition_id = props.ifc_definition_id op.disable_opening_subtractions = False - op = row.operator("bim.switch_representation", text="Dynamic Voids", icon="SELECT_INTERSECT") + op = row.operator( + "bim.switch_representation", text="Dynamic Voids", icon="SELECT_INTERSECT", should_switch_all_meshes=True + ) op.should_reload = True op.ifc_definition_id = props.ifc_definition_id op.disable_opening_subtractions = True diff --git a/src/blenderbim/blenderbim/bim/module/model/column.py b/src/blenderbim/blenderbim/bim/module/model/column.py index 9adf87eb59..deacf754e5 100644 --- a/src/blenderbim/blenderbim/bim/module/model/column.py +++ b/src/blenderbim/blenderbim/bim/module/model/column.py @@ -120,7 +120,9 @@ class DumbColumnGenerator: profile_set_usage=profile_set_usage.id(), ) representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") - bpy.ops.bim.switch_representation(obj=obj.name, ifc_definition_id=representation.id(), should_reload=True) + bpy.ops.bim.switch_representation( + obj=obj.name, ifc_definition_id=representation.id(), should_reload=True, should_switch_all_meshes=True + ) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbColumn"}) MaterialData.load(self.file) @@ -165,4 +167,6 @@ class DumbColumnRegenerator: return representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if representation: - bpy.ops.bim.switch_representation(obj=obj.name, ifc_definition_id=representation.id(), should_reload=True) + bpy.ops.bim.switch_representation( + obj=obj.name, ifc_definition_id=representation.id(), should_reload=True, should_switch_all_meshes=True + ) diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index af51797a0c..3e84c223ee 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -98,6 +98,7 @@ def generate_box(usecase_path, ifc_file, settings): **{"product": product, "representation": new_box} ) + def regenerate_profile_usage(usecase_path, ifc_file, settings): elements = [] if ifc_file.schema == "IFC2X3": @@ -117,4 +118,6 @@ def regenerate_profile_usage(usecase_path, ifc_file, settings): continue representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if representation: - bpy.ops.bim.switch_representation(obj=obj.name, ifc_definition_id=representation.id(), should_reload=True) + bpy.ops.bim.switch_representation( + obj=obj.name, ifc_definition_id=representation.id(), should_reload=True, should_switch_all_meshes=True + ) diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index 7e3c6a4450..7016be6f74 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -22,7 +22,9 @@ class AssignType(bpy.types.Operator): self.file = IfcStore.get_file() relating_type = self.relating_type or int(context.active_object.BIMTypeProperties.relating_type) related_objects = ( - [bpy.data.objects.get(self.related_object)] if self.related_object else bpy.context.selected_objects + [bpy.data.objects.get(self.related_object)] + if self.related_object + else bpy.context.selected_objects or [bpy.context.active_object] ) for related_object in related_objects: oprops = related_object.BIMObjectProperties @@ -39,15 +41,19 @@ class AssignType(bpy.types.Operator): MaterialData.load(IfcStore.get_file(), oprops.ifc_definition_id) representation_ids = GeometryData.products[oprops.ifc_definition_id] if not representation_ids: - pass # TODO: clear geometry? Make void? Make none type? + pass # TODO: clear geometry? Make void? Make none type? has_switched = False for representation_id in representation_ids: representation = GeometryData.representations[representation_id] if representation["ContextOfItems"]["ContextIdentifier"] == "Body": - bpy.ops.bim.switch_representation(obj=related_object.name, ifc_definition_id=representation_id) + bpy.ops.bim.switch_representation( + obj=related_object.name, ifc_definition_id=representation_id, should_switch_all_meshes=False + ) has_switched = True if not has_switched and representation_ids: - bpy.ops.bim.switch_representation(obj=related_object.name, ifc_definition_id=representation_id) + bpy.ops.bim.switch_representation( + obj=related_object.name, ifc_definition_id=representation_id, should_switch_all_meshes=False + ) bpy.ops.bim.disable_editing_type(obj=related_object.name) MaterialData.load(self.file)