WindowData use refactor

This commit is contained in:
Andrej730
2023-07-13 10:31:20 +05:00
parent c9e6da9b6c
commit cd1a813630
3 changed files with 87 additions and 59 deletions
@@ -235,10 +235,7 @@ class AuthoringData:
if ifc_class: if ifc_class:
elements = sorted(tool.Ifc.get().by_type(ifc_class), key=lambda s: s.Name or "Unnamed") elements = sorted(tool.Ifc.get().by_type(ifc_class), key=lambda s: s.Name or "Unnamed")
results.extend(elements) results.extend(elements)
return [ return [(str(e.id()), e.Name or "Unnamed", e.Description or "") for e in results]
(str(e.id()), e.Name or "Unnamed", e.Description or "")
for e in results
]
return [] return []
@@ -317,6 +314,13 @@ class SverchokData:
return False 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: class WindowData:
data = {} data = {}
is_loaded = False is_loaded = False
@@ -324,17 +328,49 @@ class WindowData:
@classmethod @classmethod
def load(cls): def load(cls):
cls.is_loaded = True 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 @classmethod
def parameters(cls): def pset_data(cls):
element = tool.Ifc.get_entity(bpy.context.active_object) return tool.Model.get_modeling_bbim_pset_data(bpy.context.active_object, "BBIM_Window")
if element:
psets = ifcopenshell.util.element.get_psets(element) @classmethod
parameters = psets.get("BBIM_Window", None) def general_params(cls):
if parameters: props = bpy.context.active_object.BIMWindowProperties
parameters["data_dict"] = json.loads(parameters.get("Data", "[]") or "[]") data = cls.data["parameters"]["data_dict"]
return parameters 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: class DoorData:
@@ -380,10 +416,7 @@ class RailingData:
general_params = {} general_params = {}
general_props = props.get_general_kwargs(railing_type=data["railing_type"]) general_props = props.get_general_kwargs(railing_type=data["railing_type"])
for prop_name in general_props: for prop_name in general_props:
prop_value = data[prop_name] prop_readable_name, prop_value = get_prop_from_data(props, 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
general_params[prop_readable_name] = prop_value general_params[prop_readable_name] = prop_value
return general_params return general_params
@@ -414,12 +447,10 @@ class RoofData:
general_params = {} general_params = {}
general_props = props.get_general_kwargs(generation_method=data["generation_method"]) general_props = props.get_general_kwargs(generation_method=data["generation_method"])
for prop_name in general_props: for prop_name in general_props:
prop_value = data[prop_name] prop_readable_name, prop_value = get_prop_from_data(props, data, prop_name)
prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value
if prop_name in ("angle", "rafter_edge_angle"): if prop_name in ("angle", "rafter_edge_angle"):
prop_value = round(degrees(prop_value), 2) prop_value = round(degrees(prop_value), 2)
prop_readable_name = props.bl_rna.properties[prop_name].name
general_params[prop_readable_name] = prop_value general_params[prop_readable_name] = prop_value
return general_params return general_params
@@ -340,7 +340,9 @@ class BIMWindowProperties(PropertyGroup):
return kwargs return kwargs
return tool.Model.convert_data_to_project_units(kwargs, ["window_type"]) 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 = { kwargs = {
"lining_depth": self.lining_depth, "lining_depth": self.lining_depth,
"lining_thickness": self.lining_thickness, "lining_thickness": self.lining_thickness,
@@ -349,7 +351,7 @@ class BIMWindowProperties(PropertyGroup):
"lining_to_panel_offset_y": self.lining_to_panel_offset_y, "lining_to_panel_offset_y": self.lining_to_panel_offset_y,
} }
if self.window_type in ( if window_type in (
"DOUBLE_PANEL_VERTICAL", "DOUBLE_PANEL_VERTICAL",
"TRIPLE_PANEL_BOTTOM", "TRIPLE_PANEL_BOTTOM",
"TRIPLE_PANEL_TOP", "TRIPLE_PANEL_TOP",
@@ -360,7 +362,7 @@ class BIMWindowProperties(PropertyGroup):
kwargs["mullion_thickness"] = self.mullion_thickness kwargs["mullion_thickness"] = self.mullion_thickness
kwargs["first_mullion_offset"] = self.first_mullion_offset kwargs["first_mullion_offset"] = self.first_mullion_offset
if self.window_type in ( if window_type in (
"DOUBLE_PANEL_HORIZONTAL", "DOUBLE_PANEL_HORIZONTAL",
"TRIPLE_PANEL_BOTTOM", "TRIPLE_PANEL_BOTTOM",
"TRIPLE_PANEL_TOP", "TRIPLE_PANEL_TOP",
@@ -371,10 +373,10 @@ class BIMWindowProperties(PropertyGroup):
kwargs["transom_thickness"] = self.transom_thickness kwargs["transom_thickness"] = self.transom_thickness
kwargs["first_transom_offset"] = self.first_transom_offset 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 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 kwargs["second_transom_offset"] = self.second_transom_offset
if not convert_to_project_units: 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). " description="Offset from the outer side of the wall (by Y-axis). "
"If present then adding casing is not possible.\n" "If present then adding casing is not possible.\n"
"`0.025 mm` is good as default value", "`0.025 mm` is good as default value",
default=0.0, default=0.0,
subtype="DISTANCE" 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( transom_thickness: bpy.props.FloatProperty(
name="Transom Thickness", name="Transom Thickness",
@@ -442,19 +448,19 @@ class BIMDoorProperties(PropertyGroup):
) )
casing_thickness: bpy.props.FloatProperty( casing_thickness: bpy.props.FloatProperty(
name="Casing Thickness", description="Set values > 0 and LiningOffset = 0 to add a casing.", default=0.075, name="Casing Thickness",
subtype="DISTANCE" 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") casing_depth: bpy.props.FloatProperty(name="Casing Depth", default=0.005, subtype="DISTANCE")
threshold_thickness: bpy.props.FloatProperty( threshold_thickness: bpy.props.FloatProperty(
name="Threshold Thickness", description="Set values > 0 to add a threshold.", default=0.025, name="Threshold Thickness", description="Set values > 0 to add a threshold.", default=0.025, subtype="DISTANCE"
subtype="DISTANCE"
) )
threshold_depth: bpy.props.FloatProperty(name="Threshold Depth", default=0.1, subtype="DISTANCE") threshold_depth: bpy.props.FloatProperty(name="Threshold Depth", default=0.1, subtype="DISTANCE")
threshold_offset: bpy.props.FloatProperty( threshold_offset: bpy.props.FloatProperty(
name="Threshold Offset", description="`0.025 mm` is good as default value", default=0.000, name="Threshold Offset", description="`0.025 mm` is good as default value", default=0.000, subtype="DISTANCE"
subtype="DISTANCE"
) )
# panel properties # panel properties
@@ -517,7 +523,7 @@ class BIMDoorProperties(PropertyGroup):
if not convert_to_project_units: if not convert_to_project_units:
return kwargs 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): def set_props_kwargs_from_ifc_data(self, kwargs):
kwargs = tool.Model.convert_data_to_si_units(kwargs, self.non_si_units_props) kwargs = tool.Model.convert_data_to_si_units(kwargs, self.non_si_units_props)
@@ -354,10 +354,8 @@ class BIM_PT_window(bpy.types.Panel):
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="Window parameters", icon="OUTLINER_OB_LATTICE") 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: if props.is_editing:
number_of_panels, panels_data = props.window_types_panels[props.window_type]
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.operator("bim.finish_editing_window", icon="CHECKMARK", text="Finish Editing") row.operator("bim.finish_editing_window", icon="CHECKMARK", text="Finish Editing")
row.operator("bim.cancel_editing_window", icon="CANCEL", text="") 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="") row.operator("bim.remove_window", icon="X", text="")
box = self.layout.box() box = self.layout.box()
general_props = props.get_general_kwargs() general_params = WindowData.data["general_params"]
for prop in general_props: window_type_prop = props.bl_rna.properties["window_type"].name
prop_value = window_data[prop] number_of_panels, panels_data = props.window_types_panels[general_params[window_type_prop]]
prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value for prop_name, prop_value in general_params.items():
row = box.row(align=True) 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)) row.label(text=str(prop_value))
lining_props = props.get_lining_kwargs()
self.layout.label(text="Lining properties") self.layout.label(text="Lining properties")
lining_box = self.layout.box() box = self.layout.box()
for prop in lining_props: for prop_name, prop_value in WindowData.data["lining_params"].items():
prop_value = window_data["lining_properties"][prop] row = box.row(align=True)
prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value row.label(text=prop_name)
row = lining_box.row(align=True)
row.label(text=f"{props.bl_rna.properties[prop].name}")
row.label(text=str(prop_value)) row.label(text=str(prop_value))
panel_props = props.get_panel_kwargs() panel_props = WindowData.data["panel_params"]
self.layout.label(text="Panel properties") self.layout.label(text="Panel properties")
panel_box = self.layout.box() panel_box = self.layout.box()
@@ -430,14 +425,12 @@ class BIM_PT_window(bpy.types.Panel):
r.label(text=f"#{panel_i}") r.label(text=f"#{panel_i}")
r = cols[panel_i + 1].row() r = cols[panel_i + 1].row()
# TODO: align property values more evenly for prop_name in panel_props:
for prop in panel_props: cols[0].row().label(text=prop_name)
cols[0].row().label(text=f"{props.bl_rna.properties[prop].name}")
for panel_i in range(number_of_panels): for panel_i in range(number_of_panels):
r = cols[panel_i + 1].row() r = cols[panel_i + 1].row()
r.alignment = "CENTER" r.alignment = "CENTER"
prop_value = window_data["panel_properties"][prop][panel_i] prop_value = panel_props[prop_name][panel_i]
prop_value = round(prop_value, 5) if type(prop_value) is float else prop_value
r.label(text=str(prop_value)) r.label(text=str(prop_value))
r = cols[panel_i + 1].row() r = cols[panel_i + 1].row()
@@ -616,8 +609,6 @@ class BIM_PT_roof(bpy.types.Panel):
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="Roof parameters", icon="OUTLINER_OB_LATTICE") row.label(text="Roof parameters", icon="OUTLINER_OB_LATTICE")
roof_data = RoofData.data["parameters"]["data_dict"]
if props.is_editing: if props.is_editing:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.operator("bim.finish_editing_roof", icon="CHECKMARK", text="Finish Editing") row.operator("bim.finish_editing_roof", icon="CHECKMARK", text="Finish Editing")