diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index e470b3e3ac..d51ba058a1 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -68,6 +68,14 @@ def update_door_modifier_representation(context, obj): }, } + def get_active_representation_context(obj): + active_representation = tool.Geometry.get_active_representation(obj) + if active_representation: + return active_representation.ContextOfItems + return ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") + + previously_active_context = get_active_representation_context(obj) + # ELEVATION_VIEW representation profile = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Profile", "ELEVATION_VIEW") if profile: @@ -78,6 +86,7 @@ def update_door_modifier_representation(context, obj): tool.Model.replace_object_ifc_representation(profile, obj, elevation_representation) # MODEL_VIEW representation + # (Model/Body defined only BEFORE Plan/Body to prevent #2744) body = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") representation_data["context"] = body model_representation = ifcopenshell.api.run("geometry.add_door_representation", ifc_file, **representation_data) @@ -113,14 +122,34 @@ def update_door_modifier_representation(context, obj): ) tool.Model.replace_object_ifc_representation(plan_annotation, obj, plan_representation) - if plan_body or plan_annotation: - # adding switch representation at the end instead of changing order of representations - # to prevent #2744 - core.switch_representation( + # adding switch representation at the end instead of changing order of representations + # to prevent #2744 + if get_active_representation_context(obj) != previously_active_context: + previously_active_representation = ifcopenshell.util.representation.get_representation( + element, + previously_active_context.ContextType, + previously_active_context.ContextIdentifier, + previously_active_context.TargetView, + ) + + if not previously_active_representation: + # we assume there is no representation because it was + # Plan/Annotation/PLAN_VIEW + previously_active_context = ifcopenshell.util.representation.get_context( + ifc_file, "Plan", "Body", "PLAN_VIEW" + ) + previously_active_representation = ifcopenshell.util.representation.get_representation( + element, + previously_active_context.ContextType, + previously_active_context.ContextIdentifier, + previously_active_context.TargetView, + ) + + blenderbim.core.geometry.switch_representation( tool.Ifc, tool.Geometry, obj=obj, - representation=model_representation, + representation=previously_active_representation, should_reload=True, is_global=True, should_sync_changes_first=True, diff --git a/src/blenderbim/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py index 24499ee6b6..fe934693ac 100644 --- a/src/blenderbim/blenderbim/bim/module/model/window.py +++ b/src/blenderbim/blenderbim/bim/module/model/window.py @@ -116,6 +116,14 @@ def update_window_modifier_representation(context, obj): } representation_data["panel_properties"].append(panel_data) + def get_active_representation_context(obj): + active_representation = tool.Geometry.get_active_representation(obj) + if active_representation: + return active_representation.ContextOfItems + return ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") + + previously_active_context = get_active_representation_context(obj) + # ELEVATION_VIEW representation profile = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Profile", "ELEVATION_VIEW") if profile: @@ -126,6 +134,7 @@ def update_window_modifier_representation(context, obj): tool.Model.replace_object_ifc_representation(profile, obj, elevation_representation) # MODEL_VIEW representation + # (Model/Body defined only BEFORE Plan/Body to prevent #2744) body = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") representation_data["context"] = body model_representation = ifcopenshell.api.run("geometry.add_window_representation", ifc_file, **representation_data) @@ -140,13 +149,20 @@ def update_window_modifier_representation(context, obj): ) tool.Model.replace_object_ifc_representation(plan, obj, plan_representation) - # adding switch representation at the end instead of changing order of representations - # to prevent #2744 + # adding switch representation at the end instead of changing order of representations + # to prevent #2744 + if get_active_representation_context(obj) != previously_active_context: + previously_active_representation = ifcopenshell.util.representation.get_representation( + element, + previously_active_context.ContextType, + previously_active_context.ContextIdentifier, + previously_active_context.TargetView, + ) blenderbim.core.geometry.switch_representation( tool.Ifc, tool.Geometry, obj=obj, - representation=model_representation, + representation=previously_active_representation, should_reload=True, is_global=True, should_sync_changes_first=True,