mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user