Window modifier - removed hardcoded mm units

Related to #2724
This commit is contained in:
Andrej730
2023-01-26 18:22:35 +05:00
parent cee0ff2074
commit 74477d0051
3 changed files with 44 additions and 28 deletions
@@ -17,6 +17,8 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>. # along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import ifcopenshell
import blenderbim.tool as tool
from blenderbim.bim.prop import ObjProperty from blenderbim.bim.prop import ObjProperty
from blenderbim.bim.module.model.data import AuthoringData from blenderbim.bim.module.model.data import AuthoringData
from blenderbim.bim.module.model.root import ConstrTypeEntityNotFound from blenderbim.bim.module.model.root import ConstrTypeEntityNotFound
@@ -302,10 +304,15 @@ class BIMSverchokProperties(PropertyGroup):
def window_type_prop_update(self, context): def window_type_prop_update(self, context):
number_of_panels, panels_data = self.window_types_panels[self.window_type] number_of_panels, panels_data = self.window_types_panels[self.window_type]
si_coversion = 0.001 / ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
panels_data = [[v * si_coversion for v in data] for data in panels_data]
self.first_mullion_offset, self.second_mullion_offset = panels_data[0] self.first_mullion_offset, self.second_mullion_offset = panels_data[0]
self.first_transom_offset, self.second_transom_offset = panels_data[1] self.first_transom_offset, self.second_transom_offset = panels_data[1]
# default prop values are in mm and converted later
class BIMWindowProperties(PropertyGroup): class BIMWindowProperties(PropertyGroup):
window_types = ( window_types = (
("SINGLE_PANEL", "SINGLE_PANEL", ""), ("SINGLE_PANEL", "SINGLE_PANEL", ""),
@@ -191,9 +191,7 @@ def create_bm_window_closed_profile(bm, size: Vector, thickness: Vector, positio
def update_window_modifier_bmesh(context): def update_window_modifier_bmesh(context):
obj = context.object obj = context.object
props = obj.BIMWindowProperties props = obj.BIMWindowProperties
# blender interprets all values as if they are in meters si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
# so no need to convert to blender scene units, just convert to meters
si_conversion = 0.001
panel_schema = DEFAULT_PANEL_SCHEMAS[props.window_type] panel_schema = DEFAULT_PANEL_SCHEMAS[props.window_type]
accumulated_height = [0] * len(panel_schema[0]) accumulated_height = [0] * len(panel_schema[0])
built_panels = [] built_panels = []
@@ -211,7 +209,7 @@ def update_window_modifier_bmesh(context):
first_transom_offset = props.first_transom_offset * si_conversion first_transom_offset = props.first_transom_offset * si_conversion
second_transom_offset = props.second_transom_offset * si_conversion second_transom_offset = props.second_transom_offset * si_conversion
glass_thickness = 10 * si_conversion glass_thickness = 10 * 0.001 * si_conversion
bm = bmesh.new() bm = bmesh.new()
panel_schema = list(reversed(panel_schema)) panel_schema = list(reversed(panel_schema))
@@ -335,6 +333,17 @@ class AddWindow(bpy.types.Operator, tool.Ifc.Operator):
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
props = obj.BIMWindowProperties props = obj.BIMWindowProperties
si_coversion = 0.001 / ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
for prop_name in props.bl_rna.properties.keys():
if prop_name in ("rna_type", "name", "is_editing", "window_type"):
continue
prop_value = getattr(props, prop_name)
if type(prop_value) is float:
prop_value = prop_value * si_coversion
elif type(prop_value) is bpy.types.bpy_prop_array:
prop_value = [el * si_coversion for el in prop_value]
setattr(props, prop_name, prop_value)
window_data = props.get_general_kwargs() window_data = props.get_general_kwargs()
lining_props = props.get_lining_kwargs() lining_props = props.get_lining_kwargs()
panel_props = props.get_panel_kwargs() panel_props = props.get_panel_kwargs()
@@ -29,15 +29,15 @@ from mathutils import Vector
# - order of rows is from top of the window to bottom # - order of rows is from top of the window to bottom
DEFAULT_PANEL_SCHEMAS = { DEFAULT_PANEL_SCHEMAS = {
"SINGLE_PANEL": [[0]], "SINGLE_PANEL": [[0]],
"DOUBLE_PANEL_HORIZONTAL": [[0], [1]], "DOUBLE_PANEL_HORIZONTAL": [[0], [1]],
"DOUBLE_PANEL_VERTICAL": [[0, 1]], "DOUBLE_PANEL_VERTICAL": [[0, 1]],
"TRIPLE_PANEL_BOTTOM": [[0, 1], [2, 2]], "TRIPLE_PANEL_BOTTOM": [[0, 1], [2, 2]],
"TRIPLE_PANEL_TOP": [[0, 0], [1, 2]], "TRIPLE_PANEL_TOP": [[0, 0], [1, 2]],
"TRIPLE_PANEL_LEFT": [[0, 1], [0, 2]], "TRIPLE_PANEL_LEFT": [[0, 1], [0, 2]],
"TRIPLE_PANEL_RIGHT": [[0, 1], [2, 1]], "TRIPLE_PANEL_RIGHT": [[0, 1], [2, 1]],
"TRIPLE_PANEL_HORIZONTAL": [[0], [1], [2]], "TRIPLE_PANEL_HORIZONTAL": [[0], [1], [2]],
"TRIPLE_PANEL_VERTICAL": [[0, 1, 2]], "TRIPLE_PANEL_VERTICAL": [[0, 1, 2]],
} }
@@ -96,8 +96,8 @@ class Usecase:
def execute(self): def execute(self):
self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file)
builder = ShapeBuilder(self.file) builder = ShapeBuilder(self.file)
overall_height = self.convert_si_to_unit(self.settings["overall_height"]) overall_height = self.settings["overall_height"]
overall_width = self.convert_si_to_unit(self.settings["overall_width"]) overall_width = self.settings["overall_width"]
if self.settings["context"].TargetView == "ELEVATION_VIEW": if self.settings["context"].TargetView == "ELEVATION_VIEW":
rect = builder.rectangle(V(overall_width, 0, overall_height)) rect = builder.rectangle(V(overall_width, 0, overall_height))
@@ -110,19 +110,19 @@ class Usecase:
built_panels = [] built_panels = []
window_items = [] window_items = []
lining_thickness = self.convert_si_to_unit(self.settings["lining_properties"]["LiningThickness"]) lining_thickness = self.settings["lining_properties"]["LiningThickness"]
lining_depth = self.convert_si_to_unit(self.settings["lining_properties"]["LiningDepth"]) lining_depth = self.settings["lining_properties"]["LiningDepth"]
lining_offset = self.convert_si_to_unit(self.settings["lining_properties"]["LiningOffset"]) lining_offset = self.settings["lining_properties"]["LiningOffset"]
lining_panel_offset_x = self.convert_si_to_unit(self.settings["lining_properties"]["LiningToPanelOffsetX"]) lining_panel_offset_x = self.settings["lining_properties"]["LiningToPanelOffsetX"]
lining_panel_offset_y = self.convert_si_to_unit(self.settings["lining_properties"]["LiningToPanelOffsetY"]) lining_panel_offset_y = self.settings["lining_properties"]["LiningToPanelOffsetY"]
glass_thickness = self.convert_si_to_unit(10) glass_thickness = self.convert_si_to_unit(10)
mullion_thickness = self.convert_si_to_unit(self.settings["lining_properties"]["MullionThickness"]) / 2 mullion_thickness = self.settings["lining_properties"]["MullionThickness"] / 2
first_mullion_offset = self.convert_si_to_unit(self.settings["lining_properties"]["FirstMullionOffset"]) first_mullion_offset = self.settings["lining_properties"]["FirstMullionOffset"]
second_mullion_offset = self.convert_si_to_unit(self.settings["lining_properties"]["SecondMullionOffset"]) second_mullion_offset = self.settings["lining_properties"]["SecondMullionOffset"]
transom_thickness = self.convert_si_to_unit(self.settings["lining_properties"]["TransomThickness"]) / 2 transom_thickness = self.settings["lining_properties"]["TransomThickness"] / 2
first_transom_offset = self.convert_si_to_unit(self.settings["lining_properties"]["FirstTransomOffset"]) first_transom_offset = self.settings["lining_properties"]["FirstTransomOffset"]
second_transom_offset = self.convert_si_to_unit(self.settings["lining_properties"]["SecondTransomOffset"]) second_transom_offset = self.settings["lining_properties"]["SecondTransomOffset"]
panel_schema = list(reversed(panel_schema)) panel_schema = list(reversed(panel_schema))
@@ -162,9 +162,9 @@ class Usecase:
continue continue
cur_panel = panels[panel_i] cur_panel = panels[panel_i]
panel_depth = cur_panel["FrameDepth"]
panel_thickness = cur_panel["FrameThickness"]
current_items = [] current_items = []
panel_depth = self.convert_si_to_unit(cur_panel["FrameDepth"])
panel_thickness = self.convert_si_to_unit(cur_panel["FrameThickness"])
panel_actual_width = panel_width - lining_panel_offset_x * 2 panel_actual_width = panel_width - lining_panel_offset_x * 2
panel_actual_height = panel_height - lining_panel_offset_x * 2 panel_actual_height = panel_height - lining_panel_offset_x * 2