diff --git a/src/blenderbim/blenderbim/bim/module/model/railing.py b/src/blenderbim/blenderbim/bim/module/model/railing.py index 7382d68977..245a963f61 100644 --- a/src/blenderbim/blenderbim/bim/module/model/railing.py +++ b/src/blenderbim/blenderbim/bim/module/model/railing.py @@ -348,8 +348,7 @@ class EnableEditingRailing(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object props = obj.BIMRailingProperties - element = tool.Ifc.get_entity(obj) - data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Railing", "Data")) + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Railing")["data_dict"] data["path_data"] = json.dumps(data["path_data"]) # required since we could load pset from .ifc and BIMRailingProperties won't be set @@ -366,14 +365,13 @@ class CancelEditingRailing(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object - element = tool.Ifc.get_entity(obj) - data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Railing", "Data")) + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Railing")["data_dict"] props = obj.BIMRailingProperties # restore previous settings since editing was canceled props.set_props_kwargs_from_ifc_data(data) update_railing_modifier_bmesh(context) - + props.is_editing = False return {"FINISHED"} @@ -438,6 +436,9 @@ class EnableEditingRailingPath(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object props = obj.BIMRailingProperties + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Railing")["data_dict"] + # required since we could load pset from .ifc and BIMRoofProperties won't be set + props.set_props_kwargs_from_ifc_data(data) props.is_editing_path = True update_railing_modifier_bmesh(context) @@ -456,9 +457,24 @@ def cancel_editing_railing_path(context): ProfileDecorator.uninstall() props.is_editing_path = False - update_railing_modifier_bmesh(context) if bpy.context.active_object.mode == "EDIT": bpy.ops.object.mode_set(mode="OBJECT") + + if props.railing_type == "FRAMELESS_PANEL": + update_railing_modifier_bmesh(context) + else: + element = tool.Ifc.get_entity(obj) + body = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") + blenderbim.core.geometry.switch_representation( + tool.Ifc, + tool.Geometry, + obj=obj, + representation=body, + should_reload=True, + is_global=True, + should_sync_changes_first=False, + ) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/roof.py b/src/blenderbim/blenderbim/bim/module/model/roof.py index 8f1f3c753a..13d4b402c6 100644 --- a/src/blenderbim/blenderbim/bim/module/model/roof.py +++ b/src/blenderbim/blenderbim/bim/module/model/roof.py @@ -593,8 +593,7 @@ class EnableEditingRoof(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object props = obj.BIMRoofProperties - element = tool.Ifc.get_entity(obj) - data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Roof", "Data")) + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Roof")["data_dict"] # required since we could load pset from .ifc and BIMRoofProperties won't be set props.set_props_kwargs_from_ifc_data(data) props.is_editing = True @@ -608,8 +607,7 @@ class CancelEditingRoof(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object - element = tool.Ifc.get_entity(obj) - data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Roof", "Data")) + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Roof")["data_dict"] props = obj.BIMRoofProperties # restore previous settings since editing was canceled @@ -650,6 +648,9 @@ class EnableEditingRoofPath(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object props = obj.BIMRoofProperties + data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Roof")["data_dict"] + # required since we could load pset from .ifc and BIMRoofProperties won't be set + props.set_props_kwargs_from_ifc_data(data) props.is_editing_path = True update_roof_modifier_bmesh(context) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index 01dcde0555..b25ec4703a 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -88,7 +88,15 @@ def switch_representation( should_sync_changes_first=False, apply_openings=True, ): - """Function can switch to representation that wasn't yet assigned to that object. See #2766.""" + """Function can switch to representation that wasn't yet assigned to that object. See #2766. + + `should_sync_changes_first` - sync ifc representation with current state of `obj.data`; + + `should_reload` - reload `obj.data` from ifc representation; + + `is_global` - replace mesh data for all users of `obj.data`, not just `obj`; + + """ if should_sync_changes_first and geometry.is_edited(obj) and not geometry.is_box_representation(representation): representation_id = geometry.get_representation_id(representation) geometry.run_geometry_update_representation(obj=obj) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 3512539d35..5369741dbb 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -35,6 +35,8 @@ class Geometry(blenderbim.core.tool.Geometry): @classmethod def change_object_data(cls, obj, data, is_global=False): if is_global: + if obj.mode == "EDIT": + raise Exception("user_remap is not supported in EDIT mode") obj.data.user_remap(data) else: obj.data = data