mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-28 03:05:33 +00:00
WindowData use refactor
This commit is contained in:
@@ -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:
|
||||||
@@ -423,10 +425,14 @@ class BIMDoorProperties(PropertyGroup):
|
|||||||
"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")
|
||||||
|
|||||||
Reference in New Issue
Block a user