diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index 7ef1314e74..29dcf87089 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -380,17 +380,50 @@ class DoorData: @classmethod def load(cls): cls.is_loaded = True - cls.data = {"parameters": cls.parameters()} + cls.data = {} + cls.data["parameters"] = cls.pset_data() + cls.data["general_params"] = cls.general_params() + cls.data["lining_params"] = cls.lining_params() + cls.data["panel_params"] = cls.panel_params() @classmethod - def parameters(cls): - element = tool.Ifc.get_entity(bpy.context.active_object) - if element: - psets = ifcopenshell.util.element.get_psets(element) - parameters = psets.get("BBIM_Door", None) - if parameters: - parameters["data_dict"] = json.loads(parameters.get("Data", "[]") or "[]") - return parameters + def pset_data(cls): + return tool.Model.get_modeling_bbim_pset_data(bpy.context.active_object, "BBIM_Door") + + @classmethod + def general_params(cls): + props = bpy.context.active_object.BIMDoorProperties + data = cls.data["parameters"]["data_dict"] + general_params = {} + general_props = props.get_general_kwargs() + for prop_name in general_props: + prop_readable_name, prop_value = get_prop_from_data(props, data, prop_name) + general_params[prop_readable_name] = prop_value + return general_params + + @classmethod + def lining_params(cls): + props = bpy.context.active_object.BIMDoorProperties + data = cls.data["parameters"]["data_dict"] + lining_data = data["lining_properties"] + lining_params = {} + lining_props = props.get_lining_kwargs(door_type=data["door_type"], lining_data=lining_data) + for prop_name in lining_props: + prop_readable_name, prop_value = get_prop_from_data(props, lining_data, prop_name) + lining_params[prop_readable_name] = prop_value + return lining_params + + @classmethod + def panel_params(cls): + props = bpy.context.active_object.BIMDoorProperties + data = cls.data["parameters"]["data_dict"] + panel_data = cls.data["parameters"]["data_dict"]["panel_properties"] + panel_params = {} + panel_props = props.get_panel_kwargs(lining_data=data["lining_properties"]) + for prop_name in panel_props: + prop_readable_name, prop_value = get_prop_from_data(props, panel_data, prop_name) + panel_params[prop_readable_name] = prop_value + return panel_params class RailingData: diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index a75a593fe1..10b8473e9d 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -485,28 +485,35 @@ class BIMDoorProperties(PropertyGroup): return kwargs return tool.Model.convert_data_to_project_units(kwargs, ["door_type"]) - def get_lining_kwargs(self, convert_to_project_units=False): + def get_lining_kwargs(self, convert_to_project_units=False, door_type=None, lining_data=None): + if not door_type: + door_type = self.door_type + + transom_thickness = lining_data["transom_thickness"] if lining_data else self.transom_thickness + lining_offset = lining_data["lining_offset"] if lining_data else self.lining_offset + threshold_thickness = lining_data["threshold_thickness"] if lining_data else self.threshold_thickness + kwargs = { "lining_depth": self.lining_depth, "lining_thickness": self.lining_thickness, - "lining_offset": self.lining_offset, + "lining_offset": lining_offset, } - if "SLIDING" not in self.door_type: + if "SLIDING" not in door_type: kwargs["lining_to_panel_offset_x"] = self.lining_to_panel_offset_x kwargs["lining_to_panel_offset_y"] = self.lining_to_panel_offset_y - kwargs["transom_thickness"] = self.transom_thickness - if self.transom_thickness: + kwargs["transom_thickness"] = transom_thickness + if transom_thickness: kwargs["transom_offset"] = self.transom_offset - if not self.lining_offset: + if not lining_offset: kwargs["casing_thickness"] = self.casing_thickness if self.casing_thickness: kwargs["casing_depth"] = self.casing_depth - kwargs["threshold_thickness"] = self.threshold_thickness - if self.threshold_thickness: + kwargs["threshold_thickness"] = threshold_thickness + if threshold_thickness: kwargs["threshold_depth"] = self.threshold_depth kwargs["threshold_offset"] = self.threshold_offset @@ -514,10 +521,11 @@ class BIMDoorProperties(PropertyGroup): return kwargs return tool.Model.convert_data_to_project_units(kwargs) - def get_panel_kwargs(self, convert_to_project_units=False): + def get_panel_kwargs(self, convert_to_project_units=False, lining_data=None): + transom_thickness = lining_data["transom_thickness"] if lining_data else self.transom_thickness kwargs = {"panel_depth": self.panel_depth, "panel_width_ratio": self.panel_width_ratio} - if self.transom_thickness: + if transom_thickness: kwargs["frame_thickness"] = self.frame_thickness kwargs["frame_depth"] = self.frame_depth diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index ba5b0033fd..d407588513 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -463,8 +463,6 @@ class BIM_PT_door(bpy.types.Panel): row = self.layout.row(align=True) row.label(text="Door parameters", icon="OUTLINER_OB_LATTICE") - door_data = DoorData.data["parameters"]["data_dict"] - if props.is_editing: row = self.layout.row(align=True) row.operator("bim.finish_editing_door", icon="CHECKMARK", text="Finish Editing") @@ -491,32 +489,23 @@ class BIM_PT_door(bpy.types.Panel): row.operator("bim.remove_door", icon="X", text="") box = self.layout.box() - general_props = props.get_general_kwargs() - for prop in general_props: - prop_value = door_data[prop] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + for prop_name, prop_value in DoorData.data["general_params"].items(): row = box.row(align=True) - row.label(text=f"{props.bl_rna.properties[prop].name}") + row.label(text=prop_name) row.label(text=str(prop_value)) - lining_props = props.get_lining_kwargs() self.layout.label(text="Lining properties") lining_box = self.layout.box() - for prop in lining_props: - prop_value = door_data["lining_properties"][prop] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + for prop_name, prop_value in DoorData.data["lining_params"].items(): row = lining_box.row(align=True) - row.label(text=f"{props.bl_rna.properties[prop].name}") + row.label(text=prop_name) row.label(text=str(prop_value)) - panel_props = props.get_panel_kwargs() self.layout.label(text="Panel properties") panel_box = self.layout.box() - for prop in panel_props: - prop_value = door_data["panel_properties"][prop] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + for prop_name, prop_value in DoorData.data["panel_params"].items(): row = panel_box.row(align=True) - row.label(text=f"{props.bl_rna.properties[prop].name}") + row.label(text=prop_name) row.label(text=str(prop_value)) else: row = self.layout.row()