From 577aacb7466cf32dce03b1c2eadd6cc55b2d9c63 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 13 Jul 2023 10:31:20 +0500 Subject: [PATCH] WindowData use refactor --- .../blenderbim/bim/module/model/data.py | 71 +++++++++++++------ .../blenderbim/bim/module/model/prop.py | 38 +++++----- .../blenderbim/bim/module/model/ui.py | 37 ++++------ 3 files changed, 87 insertions(+), 59 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index b307eb742f..7ef1314e74 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -235,10 +235,7 @@ class AuthoringData: if ifc_class: elements = sorted(tool.Ifc.get().by_type(ifc_class), key=lambda s: s.Name or "Unnamed") results.extend(elements) - return [ - (str(e.id()), e.Name or "Unnamed", e.Description or "") - for e in results - ] + return [(str(e.id()), e.Name or "Unnamed", e.Description or "") for e in results] return [] @@ -317,6 +314,13 @@ class SverchokData: return False +def get_prop_from_data(props, data, prop_name): + prop_value = data[prop_name] + prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + prop_readable_name = props.bl_rna.properties[prop_name].name + return prop_readable_name, prop_value + + class WindowData: data = {} is_loaded = False @@ -324,17 +328,49 @@ class WindowData: @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_Window", 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_Window") + + @classmethod + def general_params(cls): + props = bpy.context.active_object.BIMWindowProperties + 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.BIMWindowProperties + data = cls.data["parameters"]["data_dict"] + lining_data = data["lining_properties"] + lining_params = {} + lining_props = props.get_lining_kwargs(window_type=data["window_type"]) + 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.BIMWindowProperties + panel_data = cls.data["parameters"]["data_dict"]["panel_properties"] + panel_params = {} + panel_props = props.get_panel_kwargs() + 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 DoorData: @@ -380,10 +416,7 @@ class RailingData: general_params = {} general_props = props.get_general_kwargs(railing_type=data["railing_type"]) for prop_name in general_props: - prop_value = data[prop_name] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value - - prop_readable_name = props.bl_rna.properties[prop_name].name + prop_readable_name, prop_value = get_prop_from_data(props, data, prop_name) general_params[prop_readable_name] = prop_value return general_params @@ -414,12 +447,10 @@ class RoofData: general_params = {} general_props = props.get_general_kwargs(generation_method=data["generation_method"]) for prop_name in general_props: - prop_value = data[prop_name] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + prop_readable_name, prop_value = get_prop_from_data(props, data, prop_name) if prop_name in ("angle", "rafter_edge_angle"): prop_value = round(degrees(prop_value), 2) - prop_readable_name = props.bl_rna.properties[prop_name].name general_params[prop_readable_name] = prop_value return general_params diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index df5979eb8a..a75a593fe1 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -340,7 +340,9 @@ class BIMWindowProperties(PropertyGroup): return kwargs return tool.Model.convert_data_to_project_units(kwargs, ["window_type"]) - def get_lining_kwargs(self, convert_to_project_units=False): + def get_lining_kwargs(self, window_type=None, convert_to_project_units=False): + if not window_type: + window_type = self.window_type kwargs = { "lining_depth": self.lining_depth, "lining_thickness": self.lining_thickness, @@ -349,7 +351,7 @@ class BIMWindowProperties(PropertyGroup): "lining_to_panel_offset_y": self.lining_to_panel_offset_y, } - if self.window_type in ( + if window_type in ( "DOUBLE_PANEL_VERTICAL", "TRIPLE_PANEL_BOTTOM", "TRIPLE_PANEL_TOP", @@ -360,7 +362,7 @@ class BIMWindowProperties(PropertyGroup): kwargs["mullion_thickness"] = self.mullion_thickness kwargs["first_mullion_offset"] = self.first_mullion_offset - if self.window_type in ( + if window_type in ( "DOUBLE_PANEL_HORIZONTAL", "TRIPLE_PANEL_BOTTOM", "TRIPLE_PANEL_TOP", @@ -371,10 +373,10 @@ class BIMWindowProperties(PropertyGroup): kwargs["transom_thickness"] = self.transom_thickness kwargs["first_transom_offset"] = self.first_transom_offset - if self.window_type in ("TRIPLE_PANEL_VERTICAL",): + if window_type in ("TRIPLE_PANEL_VERTICAL",): kwargs["second_mullion_offset"] = self.second_mullion_offset - if self.window_type in ("TRIPLE_PANEL_HORIZONTAL",): + if window_type in ("TRIPLE_PANEL_HORIZONTAL",): kwargs["second_transom_offset"] = self.second_transom_offset if not convert_to_project_units: @@ -422,11 +424,15 @@ class BIMDoorProperties(PropertyGroup): description="Offset from the outer side of the wall (by Y-axis). " "If present then adding casing is not possible.\n" "`0.025 mm` is good as default value", - default=0.0, - subtype="DISTANCE" + default=0.0, + subtype="DISTANCE", + ) + lining_to_panel_offset_x: bpy.props.FloatProperty( + name="Lining to Panel Offset X", default=0.025, subtype="DISTANCE" + ) + lining_to_panel_offset_y: bpy.props.FloatProperty( + name="Lining to Panel Offset Y", default=0.025, subtype="DISTANCE" ) - lining_to_panel_offset_x: bpy.props.FloatProperty(name="Lining to Panel Offset X", default=0.025, subtype="DISTANCE") - lining_to_panel_offset_y: bpy.props.FloatProperty(name="Lining to Panel Offset Y", default=0.025, subtype="DISTANCE") transom_thickness: bpy.props.FloatProperty( name="Transom Thickness", @@ -442,19 +448,19 @@ class BIMDoorProperties(PropertyGroup): ) casing_thickness: bpy.props.FloatProperty( - name="Casing Thickness", description="Set values > 0 and LiningOffset = 0 to add a casing.", default=0.075, - subtype="DISTANCE" + name="Casing Thickness", + description="Set values > 0 and LiningOffset = 0 to add a casing.", + default=0.075, + subtype="DISTANCE", ) casing_depth: bpy.props.FloatProperty(name="Casing Depth", default=0.005, subtype="DISTANCE") threshold_thickness: bpy.props.FloatProperty( - name="Threshold Thickness", description="Set values > 0 to add a threshold.", default=0.025, - subtype="DISTANCE" + name="Threshold Thickness", description="Set values > 0 to add a threshold.", default=0.025, subtype="DISTANCE" ) threshold_depth: bpy.props.FloatProperty(name="Threshold Depth", default=0.1, subtype="DISTANCE") threshold_offset: bpy.props.FloatProperty( - name="Threshold Offset", description="`0.025 mm` is good as default value", default=0.000, - subtype="DISTANCE" + name="Threshold Offset", description="`0.025 mm` is good as default value", default=0.000, subtype="DISTANCE" ) # panel properties @@ -517,7 +523,7 @@ class BIMDoorProperties(PropertyGroup): if not convert_to_project_units: return kwargs - return tool.Model.convert_data_to_project_units(kwargs, ("panel_width_ratio", )) + return tool.Model.convert_data_to_project_units(kwargs, ("panel_width_ratio",)) def set_props_kwargs_from_ifc_data(self, kwargs): kwargs = tool.Model.convert_data_to_si_units(kwargs, self.non_si_units_props) diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index ab509fd144..ba5b0033fd 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -354,10 +354,8 @@ class BIM_PT_window(bpy.types.Panel): row = self.layout.row(align=True) row.label(text="Window parameters", icon="OUTLINER_OB_LATTICE") - window_data = WindowData.data["parameters"]["data_dict"] - number_of_panels, panels_data = props.window_types_panels[props.window_type] - if props.is_editing: + number_of_panels, panels_data = props.window_types_panels[props.window_type] row = self.layout.row(align=True) row.operator("bim.finish_editing_window", icon="CHECKMARK", text="Finish Editing") row.operator("bim.cancel_editing_window", icon="CANCEL", text="") @@ -398,25 +396,22 @@ class BIM_PT_window(bpy.types.Panel): row.operator("bim.remove_window", icon="X", text="") box = self.layout.box() - general_props = props.get_general_kwargs() - for prop in general_props: - prop_value = window_data[prop] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + general_params = WindowData.data["general_params"] + window_type_prop = props.bl_rna.properties["window_type"].name + number_of_panels, panels_data = props.window_types_panels[general_params[window_type_prop]] + for prop_name, prop_value in 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 = window_data["lining_properties"][prop] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value - row = lining_box.row(align=True) - row.label(text=f"{props.bl_rna.properties[prop].name}") + box = self.layout.box() + for prop_name, prop_value in WindowData.data["lining_params"].items(): + row = box.row(align=True) + row.label(text=prop_name) row.label(text=str(prop_value)) - panel_props = props.get_panel_kwargs() + panel_props = WindowData.data["panel_params"] self.layout.label(text="Panel properties") panel_box = self.layout.box() @@ -430,14 +425,12 @@ class BIM_PT_window(bpy.types.Panel): r.label(text=f"#{panel_i}") r = cols[panel_i + 1].row() - # TODO: align property values more evenly - for prop in panel_props: - cols[0].row().label(text=f"{props.bl_rna.properties[prop].name}") + for prop_name in panel_props: + cols[0].row().label(text=prop_name) for panel_i in range(number_of_panels): r = cols[panel_i + 1].row() r.alignment = "CENTER" - prop_value = window_data["panel_properties"][prop][panel_i] - prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value + prop_value = panel_props[prop_name][panel_i] r.label(text=str(prop_value)) r = cols[panel_i + 1].row() @@ -616,8 +609,6 @@ class BIM_PT_roof(bpy.types.Panel): row = self.layout.row(align=True) row.label(text="Roof parameters", icon="OUTLINER_OB_LATTICE") - roof_data = RoofData.data["parameters"]["data_dict"] - if props.is_editing: row = self.layout.row(align=True) row.operator("bim.finish_editing_roof", icon="CHECKMARK", text="Finish Editing")