IFC Join - fix error joining representation items (6ce4b5d)

It was trying to reaccess already removed ifc_definition_id leading to an error. Now we update id with a new item.
This commit is contained in:
Andrej730
2025-04-28 16:42:09 +05:00
parent 308d628b1e
commit 55e270c135
2 changed files with 20 additions and 9 deletions
@@ -1586,24 +1586,31 @@ class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator):
if tool.Geometry.is_meshlike_item(item):
tool.Geometry.dissolve_triangulated_edges(self.target)
item_objs = [i.obj for i in props.item_objs if i.obj]
joined_objs: list[bpy.types.Object] = []
joined_ifc_item_objs: list[bpy.types.Object] = []
for selected_obj in context.selected_editable_objects:
if selected_obj in item_objs:
if selected_obj != self.target:
tool.Geometry.dissolve_triangulated_edges(selected_obj)
joined_objs.append(selected_obj)
joined_ifc_item_objs.append(selected_obj)
else:
selected_obj.select_set(False)
bpy.ops.object.join()
tool.Geometry.edit_meshlike_item(self.target)
for joined_obj in joined_objs:
bpy.ops.object.join()
new_item = tool.Geometry.edit_meshlike_item(self.target)
for joined_obj in joined_ifc_item_objs:
tool.Geometry.delete_ifc_item(joined_obj)
items_data = [dict(i) for i in props.item_objs if i.obj]
# Refresh `item_objs`.
items_data = {i.obj: i.ifc_definition_id for i in props.item_objs if i.obj}
props.item_objs.clear()
for item_data in items_data:
props.add_item_object(item_data["obj"], ifc_file.by_id(item_data["ifc_definition_id"]))
if new_item:
items_data[self.target] = new_item.id()
for obj, ifc_id in items_data.items():
props.add_item_object(obj, ifc_file.by_id(ifc_id))
if new_item is None:
tool.Root.reload_item_decorator()
return
assert (rep_obj := props.representation_obj)
tool.Geometry.reload_representation(rep_obj)
+5 -1
View File
@@ -1872,7 +1872,10 @@ class Geometry(bonsai.core.tool.Geometry):
tool.Feature.get_boolean_props().is_editing = False
@classmethod
def edit_meshlike_item(cls, obj: bpy.types.Object) -> None:
def edit_meshlike_item(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]:
"""
:return: New IfcRepresentationItem or ``None`` if mesh hasn't changed.
"""
item = tool.Geometry.get_active_representation(obj)
assert item
assert isinstance(obj.data, (bpy.types.Curve, bpy.types.Mesh))
@@ -1902,6 +1905,7 @@ class Geometry(bonsai.core.tool.Geometry):
ifcopenshell.util.element.remove_deep2(tool.Ifc.get(), item)
tool.Ifc.link(new_item, obj.data)
cls.reload_representation(rep_obj)
return new_item
@classmethod
def split_by_loose_parts(cls, obj: bpy.types.Object) -> List[bpy.types.Mesh]: