mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 10:11:46 +00:00
Don't burn CPU cycles recalculating the door every draw call in parametric door interface
This commit is contained in:
@@ -26,6 +26,7 @@ from bonsai.bim.module.model.data import AuthoringData
|
|||||||
from bpy.types import PropertyGroup, NodeTree
|
from bpy.types import PropertyGroup, NodeTree
|
||||||
from math import pi, radians
|
from math import pi, radians
|
||||||
from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator
|
from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator
|
||||||
|
from bonsai.bim.module.model.door import update_door_modifier_bmesh
|
||||||
from typing import TYPE_CHECKING, Literal, get_args
|
from typing import TYPE_CHECKING, Literal, get_args
|
||||||
|
|
||||||
|
|
||||||
@@ -125,6 +126,10 @@ def update_x_angle(self, context):
|
|||||||
self.x_angle = 0
|
self.x_angle = 0
|
||||||
|
|
||||||
|
|
||||||
|
def update_door(self, context):
|
||||||
|
update_door_modifier_bmesh(context)
|
||||||
|
|
||||||
|
|
||||||
class BIMModelProperties(PropertyGroup):
|
class BIMModelProperties(PropertyGroup):
|
||||||
ifc_class: bpy.props.EnumProperty(items=get_ifc_class, name="Construction Class", update=update_ifc_class)
|
ifc_class: bpy.props.EnumProperty(items=get_ifc_class, name="Construction Class", update=update_ifc_class)
|
||||||
relating_type_id: bpy.props.EnumProperty(
|
relating_type_id: bpy.props.EnumProperty(
|
||||||
@@ -600,14 +605,19 @@ class BIMDoorProperties(PropertyGroup):
|
|||||||
non_si_units_props = ("is_editing", "door_type", "panel_width_ratio")
|
non_si_units_props = ("is_editing", "door_type", "panel_width_ratio")
|
||||||
is_editing: bpy.props.BoolProperty(default=False)
|
is_editing: bpy.props.BoolProperty(default=False)
|
||||||
door_type: bpy.props.EnumProperty(
|
door_type: bpy.props.EnumProperty(
|
||||||
name="Door Operation Type", items=tuple((i, i, "") for i in get_args(DoorType)), default="SINGLE_SWING_LEFT"
|
name="Door Operation Type",
|
||||||
|
items=tuple((i, i, "") for i in get_args(DoorType)),
|
||||||
|
default="SINGLE_SWING_LEFT",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
overall_height: bpy.props.FloatProperty(name="Overall Height", default=2.0, subtype="DISTANCE")
|
overall_height: bpy.props.FloatProperty(name="Overall Height", default=2.0, subtype="DISTANCE", update=update_door)
|
||||||
overall_width: bpy.props.FloatProperty(name="Overall Width", default=0.9, subtype="DISTANCE")
|
overall_width: bpy.props.FloatProperty(name="Overall Width", default=0.9, subtype="DISTANCE", update=update_door)
|
||||||
|
|
||||||
# lining properties
|
# lining properties
|
||||||
lining_depth: bpy.props.FloatProperty(name="Lining Depth", default=0.050, subtype="DISTANCE")
|
lining_depth: bpy.props.FloatProperty(name="Lining Depth", default=0.050, subtype="DISTANCE", update=update_door)
|
||||||
lining_thickness: bpy.props.FloatProperty(name="Lining Thickness", default=0.050, subtype="DISTANCE")
|
lining_thickness: bpy.props.FloatProperty(
|
||||||
|
name="Lining Thickness", default=0.050, subtype="DISTANCE", update=update_door
|
||||||
|
)
|
||||||
lining_offset: bpy.props.FloatProperty(
|
lining_offset: bpy.props.FloatProperty(
|
||||||
name="Lining Offset",
|
name="Lining Offset",
|
||||||
description="Offset from the outer side of the wall (by Y-axis). "
|
description="Offset from the outer side of the wall (by Y-axis). "
|
||||||
@@ -615,12 +625,13 @@ class BIMDoorProperties(PropertyGroup):
|
|||||||
"`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",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
lining_to_panel_offset_x: bpy.props.FloatProperty(
|
lining_to_panel_offset_x: bpy.props.FloatProperty(
|
||||||
name="Lining to Panel Offset X", default=0.025, subtype="DISTANCE"
|
name="Lining to Panel Offset X", default=0.025, subtype="DISTANCE", update=update_door
|
||||||
)
|
)
|
||||||
lining_to_panel_offset_y: bpy.props.FloatProperty(
|
lining_to_panel_offset_y: bpy.props.FloatProperty(
|
||||||
name="Lining to Panel Offset Y", default=0.025, subtype="DISTANCE"
|
name="Lining to Panel Offset Y", default=0.025, subtype="DISTANCE", update=update_door
|
||||||
)
|
)
|
||||||
|
|
||||||
transom_thickness: bpy.props.FloatProperty(
|
transom_thickness: bpy.props.FloatProperty(
|
||||||
@@ -628,12 +639,14 @@ class BIMDoorProperties(PropertyGroup):
|
|||||||
description="Set values > 0 to add a transom.\n" "`0.050 mm` is good as default value",
|
description="Set values > 0 to add a transom.\n" "`0.050 mm` is good as default value",
|
||||||
default=0.000,
|
default=0.000,
|
||||||
subtype="DISTANCE",
|
subtype="DISTANCE",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
transom_offset: bpy.props.FloatProperty(
|
transom_offset: bpy.props.FloatProperty(
|
||||||
name="Transom Offset",
|
name="Transom Offset",
|
||||||
description="Distance from the bottom door opening to the beginning of the transom (unlike windows)",
|
description="Distance from the bottom door opening to the beginning of the transom (unlike windows)",
|
||||||
default=1.525,
|
default=1.525,
|
||||||
subtype="DISTANCE",
|
subtype="DISTANCE",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
|
|
||||||
casing_thickness: bpy.props.FloatProperty(
|
casing_thickness: bpy.props.FloatProperty(
|
||||||
@@ -641,28 +654,44 @@ class BIMDoorProperties(PropertyGroup):
|
|||||||
description="Set values > 0 and LiningOffset = 0 to add a casing.",
|
description="Set values > 0 and LiningOffset = 0 to add a casing.",
|
||||||
default=0.075,
|
default=0.075,
|
||||||
subtype="DISTANCE",
|
subtype="DISTANCE",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
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", update=update_door)
|
||||||
|
|
||||||
threshold_thickness: bpy.props.FloatProperty(
|
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",
|
||||||
|
update=update_door,
|
||||||
|
)
|
||||||
|
threshold_depth: bpy.props.FloatProperty(
|
||||||
|
name="Threshold Depth", default=0.1, subtype="DISTANCE", update=update_door
|
||||||
)
|
)
|
||||||
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, subtype="DISTANCE"
|
name="Threshold Offset",
|
||||||
|
description="`0.025 mm` is good as default value",
|
||||||
|
default=0.000,
|
||||||
|
subtype="DISTANCE",
|
||||||
|
update=update_door,
|
||||||
)
|
)
|
||||||
|
|
||||||
# panel properties
|
# panel properties
|
||||||
panel_depth: bpy.props.FloatProperty(name="Panel Depth", default=0.035, subtype="DISTANCE")
|
panel_depth: bpy.props.FloatProperty(name="Panel Depth", default=0.035, subtype="DISTANCE", update=update_door)
|
||||||
panel_width_ratio: bpy.props.FloatProperty(
|
panel_width_ratio: bpy.props.FloatProperty(
|
||||||
name="Panel Width Ratio",
|
name="Panel Width Ratio",
|
||||||
description="Width of this panel, given as ratio " "relative to the total clear opening width of the door",
|
description="Width of this panel, given as ratio " "relative to the total clear opening width of the door",
|
||||||
default=1.0,
|
default=1.0,
|
||||||
soft_min=0,
|
soft_min=0,
|
||||||
soft_max=1,
|
soft_max=1,
|
||||||
|
update=update_door,
|
||||||
|
)
|
||||||
|
frame_thickness: bpy.props.FloatProperty(
|
||||||
|
name="Window Frame Thickness", default=0.035, subtype="DISTANCE", update=update_door
|
||||||
|
)
|
||||||
|
frame_depth: bpy.props.FloatProperty(
|
||||||
|
name="Window Frame Depth", default=0.035, subtype="DISTANCE", update=update_door
|
||||||
)
|
)
|
||||||
frame_thickness: bpy.props.FloatProperty(name="Window Frame Thickness", default=0.035, subtype="DISTANCE")
|
|
||||||
frame_depth: bpy.props.FloatProperty(name="Window Frame Depth", default=0.035, subtype="DISTANCE")
|
|
||||||
|
|
||||||
# Material properties
|
# Material properties
|
||||||
panel_material: bpy.props.EnumProperty(name="Panel Material", items=get_materials, options=set())
|
panel_material: bpy.props.EnumProperty(name="Panel Material", items=get_materials, options=set())
|
||||||
|
|||||||
@@ -33,10 +33,8 @@ from bonsai.bim.module.model.data import (
|
|||||||
from bonsai.bim.module.model.prop import get_ifc_class
|
from bonsai.bim.module.model.prop import get_ifc_class
|
||||||
from bonsai.bim.module.model.stair import regenerate_stair_mesh
|
from bonsai.bim.module.model.stair import regenerate_stair_mesh
|
||||||
from bonsai.bim.module.model.window import update_window_modifier_bmesh
|
from bonsai.bim.module.model.window import update_window_modifier_bmesh
|
||||||
from bonsai.bim.module.model.door import update_door_modifier_bmesh
|
|
||||||
from bonsai.bim.module.model.railing import update_railing_modifier_bmesh
|
from bonsai.bim.module.model.railing import update_railing_modifier_bmesh
|
||||||
from bonsai.bim.module.model.roof import update_roof_modifier_bmesh
|
from bonsai.bim.module.model.roof import update_roof_modifier_bmesh
|
||||||
from bonsai.bim.helper import prop_with_search
|
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
|
|
||||||
|
|
||||||
@@ -551,9 +549,6 @@ class BIM_PT_door(bpy.types.Panel):
|
|||||||
self.layout.prop(props, "panel_material")
|
self.layout.prop(props, "panel_material")
|
||||||
if props.transom_thickness:
|
if props.transom_thickness:
|
||||||
self.layout.prop(props, "glazing_material")
|
self.layout.prop(props, "glazing_material")
|
||||||
|
|
||||||
update_door_modifier_bmesh(context)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
row.operator("bim.enable_editing_door", icon="GREASEPENCIL", text="")
|
row.operator("bim.enable_editing_door", icon="GREASEPENCIL", text="")
|
||||||
row.operator("bim.remove_door", icon="X", text="")
|
row.operator("bim.remove_door", icon="X", text="")
|
||||||
|
|||||||
Reference in New Issue
Block a user