Fixed adding opening to meshes of all occurences for non material based representations

Mentioned in #3817
This commit is contained in:
Andrej730
2023-10-06 15:08:48 +05:00
parent 33536957d8
commit b9a9abd30d
2 changed files with 23 additions and 12 deletions
@@ -160,7 +160,10 @@ class FilledOpeningGenerator:
for voided_obj in voided_objs:
if voided_obj.data:
representation = tool.Ifc.get().by_id(voided_obj.data.BIMMeshProperties.ifc_definition_id)
voided_element = tool.Ifc.get_entity(voided_obj)
context = tool.Geometry.get_active_representation_context(voided_obj)
representation = tool.Geometry.get_representation_by_context(voided_element, context)
blenderbim.core.geometry.switch_representation(
tool.Ifc,
tool.Geometry,
+19 -11
View File
@@ -103,24 +103,32 @@ def switch_representation(
if not geometry.does_representation_id_exist(representation_id):
return
representation = geometry.resolve_mapped_representation(representation)
existing_data = geometry.get_representation_data(representation)
entity = ifc.get_entity(obj)
if should_reload or not existing_data:
data = geometry.import_representation(obj, representation, apply_openings=apply_openings)
geometry.rename_object(data, geometry.get_representation_name(representation))
geometry.link(representation, data)
# doesn't resolve mapped representations in case if it's going to have openings
# otherwise we would also add openings to the type and other occurences mesh data
has_openings = apply_openings and entity.HasOpenings
if not has_openings:
representation = geometry.resolve_mapped_representation(representation)
old_repr_data = geometry.get_representation_data(representation)
if should_reload or not old_repr_data:
new_repr_data = geometry.import_representation(obj, representation, apply_openings=apply_openings)
geometry.rename_object(new_repr_data, geometry.get_representation_name(representation))
geometry.link(representation, new_repr_data)
else:
data = existing_data
new_repr_data = old_repr_data
geometry.change_object_data(obj, data, is_global=is_global)
geometry.change_object_data(obj, new_repr_data, is_global=is_global and not has_openings)
geometry.record_object_materials(obj)
if should_reload and existing_data:
geometry.delete_data(existing_data)
# we assume that all the occurences and the type have the same representation context active
# so geometry.delete_data cannot remove the data that's still used by some other object
if should_reload and old_repr_data:
geometry.delete_data(old_repr_data)
geometry.clear_modifiers(obj)
geometry.clear_cache(ifc.get_entity(obj))
geometry.clear_cache(entity)
def get_representation_ifc_parameters(geometry, obj=None, should_sync_changes_first=False):