mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 17:58:20 +00:00
WindowData use refactor
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user