Fix tests, clean up file creating empty project

To fix tests changed bim.unlink_object not to unlink original blender materials as they might be used elsewhere.
This commit is contained in:
Andrej730
2024-03-26 15:59:23 +05:00
parent 6d6c9e19b9
commit 6acdadba75
4 changed files with 29 additions and 3 deletions
@@ -118,7 +118,7 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_material" bl_idname = "bim.add_material"
bl_label = "Add Material" bl_label = "Add Material"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty(name="Material Name")
name: bpy.props.StringProperty(default="Default") name: bpy.props.StringProperty(default="Default")
def invoke(self, context, event): def invoke(self, context, event):
@@ -113,6 +113,10 @@ class CreateProject(bpy.types.Operator):
if tool.Blender.is_default_scene(): if tool.Blender.is_default_scene():
for obj in bpy.data.objects: for obj in bpy.data.objects:
bpy.data.objects.remove(obj) 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) core.create_project(tool.Ifc, tool.Project, schema=props.export_schema, template=template)
tool.Blender.register_toolbar() tool.Blender.register_toolbar()
@@ -215,7 +215,7 @@ class UnlinkObject(bpy.types.Operator):
bl_idname = "bim.unlink_object" bl_idname = "bim.unlink_object"
bl_label = "Unlink Object" bl_label = "Unlink Object"
bl_options = {"REGISTER", "UNDO"} 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) should_delete: bpy.props.BoolProperty(name="Delete IFC Element", default=True)
def execute(self, context): def execute(self, context):
@@ -227,6 +227,7 @@ class UnlinkObject(bpy.types.Operator):
else: else:
objects = context.selected_objects objects = context.selected_objects
objects: list[bpy.types.Object]
for obj in objects: for obj in objects:
was_active_object = obj == context.active_object was_active_object = obj == context.active_object
@@ -242,6 +243,27 @@ class UnlinkObject(bpy.types.Operator):
if obj.data: if obj.data:
obj_copy.data = obj.data.copy() 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) tool.Geometry.delete_ifc_object(obj)
obj = obj_copy obj = obj_copy
+1 -1
View File
@@ -24,7 +24,7 @@ Scenario: Unlink object
And I set "scene.BIMRootProperties.ifc_product" to "IfcElement" And I set "scene.BIMRootProperties.ifc_product" to "IfcElement"
And I set "scene.BIMRootProperties.ifc_class" to "IfcWall" And I set "scene.BIMRootProperties.ifc_class" to "IfcWall"
And I press "bim.assign_class" 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')" When I press "bim.unlink_object(obj='IfcWall/Cube')"
Then the object "Cube" is not an IFC element Then the object "Cube" is not an IFC element
And the material "Material" is an IFC style And the material "Material" is an IFC style