diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 97b14b9334..77241afef5 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -118,7 +118,7 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_material" bl_label = "Add Material" bl_options = {"REGISTER", "UNDO"} - obj: bpy.props.StringProperty() + obj: bpy.props.StringProperty(name="Material Name") name: bpy.props.StringProperty(default="Default") def invoke(self, context, event): diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 0681664800..44b5168bf4 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -113,6 +113,10 @@ class CreateProject(bpy.types.Operator): if tool.Blender.is_default_scene(): for obj in bpy.data.objects: bpy.data.objects.remove(obj) + for mesh in bpy.data.meshes: + bpy.data.meshes.remove(mesh) + for mat in bpy.data.materials: + bpy.data.materials.remove(mat) core.create_project(tool.Ifc, tool.Project, schema=props.export_schema, template=template) tool.Blender.register_toolbar() diff --git a/src/blenderbim/blenderbim/bim/module/root/operator.py b/src/blenderbim/blenderbim/bim/module/root/operator.py index fdeb0d9c34..ed1985c5bd 100644 --- a/src/blenderbim/blenderbim/bim/module/root/operator.py +++ b/src/blenderbim/blenderbim/bim/module/root/operator.py @@ -215,7 +215,7 @@ class UnlinkObject(bpy.types.Operator): bl_idname = "bim.unlink_object" bl_label = "Unlink Object" bl_options = {"REGISTER", "UNDO"} - obj: bpy.props.StringProperty() + obj: bpy.props.StringProperty(name="Object Name") should_delete: bpy.props.BoolProperty(name="Delete IFC Element", default=True) def execute(self, context): @@ -227,6 +227,7 @@ class UnlinkObject(bpy.types.Operator): else: objects = context.selected_objects + objects: list[bpy.types.Object] for obj in objects: was_active_object = obj == context.active_object @@ -242,6 +243,27 @@ class UnlinkObject(bpy.types.Operator): if obj.data: obj_copy.data = obj.data.copy() + # prevent unlinking materials that might be used elsewhere + replacements: dict[bpy.types.Material, bpy.types.Material] = dict() + for material_slot in obj_copy.material_slots: + material = material_slot.material + if material is None: + continue + + if material in replacements: + material_replacement = replacements[material] + + # no need to copy non-ifc materials as unlinking won't do anything to them + elif tool.Ifc.get_entity(material) is None and tool.Style.get_style(material) is None: + replacements[material] = material + continue + + else: + material_replacement = material.copy() + replacements[material] = material_replacement + + material_slot.material = material_replacement + tool.Geometry.delete_ifc_object(obj) obj = obj_copy diff --git a/src/blenderbim/test/bim/feature/root.feature b/src/blenderbim/test/bim/feature/root.feature index ea2a032a27..14a47a6666 100644 --- a/src/blenderbim/test/bim/feature/root.feature +++ b/src/blenderbim/test/bim/feature/root.feature @@ -24,7 +24,7 @@ Scenario: Unlink object And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" And I press "bim.assign_class" - And I press "bim.add_material" + And I press "bim.add_style()" When I press "bim.unlink_object(obj='IfcWall/Cube')" Then the object "Cube" is not an IFC element And the material "Material" is an IFC style