WindowData use refactor

This commit is contained in:
Andrej730
2023-07-13 10:31:20 +05:00
parent 8217fcdf47
commit 577aacb746
3 changed files with 87 additions and 59 deletions
@@ -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
@@ -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)
@@ -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")