diff --git a/src/bonsai/bonsai/bim/helper.py b/src/bonsai/bonsai/bim/helper.py index da51bbe587..d5ec4867d1 100644 --- a/src/bonsai/bonsai/bim/helper.py +++ b/src/bonsai/bonsai/bim/helper.py @@ -54,7 +54,9 @@ def draw_attributes( popup_active_attribute: Optional[bonsai.bim.prop.Attribute] = None, callback: Optional[Callable[[bonsai.bim.prop.Attribute, bpy.types.UILayout], None]] = None, ) -> None: - """you can set attribute active in popup with `active_attribute` + """Draw editable UI for prop.Attributes. + + You can set attribute active in popup with `active_attribute` meaning you will be able to type into attribute's field without having to click on it first """ diff --git a/src/bonsai/bonsai/bim/module/group/ui.py b/src/bonsai/bonsai/bim/module/group/ui.py index b9db464a82..5b721040cd 100644 --- a/src/bonsai/bonsai/bim/module/group/ui.py +++ b/src/bonsai/bonsai/bim/module/group/ui.py @@ -16,8 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import bpy from bpy.types import Panel, UIList from bonsai.bim.ifc import IfcStore +from bonsai.bim.helper import draw_attributes from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData @@ -60,12 +62,8 @@ class BIM_PT_groups(Panel): if self.props.active_group_id: self.draw_editable_ui(context) - def draw_editable_ui(self, context): - for attribute in self.props.group_attributes: - row = self.layout.row(align=True) - row.prop(attribute, "string_value", text=attribute.name) - if attribute.is_optional: - row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") + def draw_editable_ui(self, context: bpy.types.Context) -> None: + draw_attributes(self.props.group_attributes, self.layout) class BIM_PT_object_groups(Panel): diff --git a/src/bonsai/bonsai/bim/module/layer/ui.py b/src/bonsai/bonsai/bim/module/layer/ui.py index 4457e1a2b0..ae1bcc430c 100644 --- a/src/bonsai/bonsai/bim/module/layer/ui.py +++ b/src/bonsai/bonsai/bim/module/layer/ui.py @@ -16,8 +16,10 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +import bpy from bpy.types import Panel, UIList, Mesh from bonsai.bim.ifc import IfcStore +from bonsai.bim.helper import draw_attributes from bonsai.bim.module.layer.data import LayersData @@ -61,12 +63,8 @@ class BIM_PT_layers(Panel): if self.props.active_layer_id: self.draw_editable_ui(context) - def draw_editable_ui(self, context): - for attribute in self.props.layer_attributes: - row = self.layout.row(align=True) - row.prop(attribute, "string_value", text=attribute.name) - if attribute.is_optional: - row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") + def draw_editable_ui(self, context: bpy.types.Context) -> None: + draw_attributes(self.props.layer_attributes, self.layout) class BIM_UL_layers(UIList): diff --git a/src/bonsai/bonsai/bim/module/structural/ui.py b/src/bonsai/bonsai/bim/module/structural/ui.py index 8f9447ada4..767724bdd5 100644 --- a/src/bonsai/bonsai/bim/module/structural/ui.py +++ b/src/bonsai/bonsai/bim/module/structural/ui.py @@ -59,20 +59,8 @@ def draw_boundary_condition_ui(layout, boundary_condition, connection_id, props) draw_boundary_condition_read_only_ui(layout, boundary_condition) -def draw_boundary_condition_editable_ui(layout, props): - for attribute in props.boundary_condition_attributes: - if attribute.data_type == "string": - row = layout.row() - row.prop(attribute, "string_value", text=attribute["name"]) - else: - row = layout.row(align=True) - row.prop(attribute, "enum_value", text=attribute["name"]) - if attribute.enum_value == "IfcBoolean": - row.prop(attribute, "bool_value", text="") - else: - row.prop(attribute, "float_value", text="") - if attribute.is_optional: - row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") +def draw_boundary_condition_editable_ui(layout: bpy.types.UILayout, props: bpy.types.PropertyGroup) -> None: + draw_attributes(props.boundary_condition_attributes, layout) def draw_boundary_condition_read_only_ui(layout, boundary_condition): diff --git a/src/bonsai/bonsai/bim/module/system/ui.py b/src/bonsai/bonsai/bim/module/system/ui.py index 80996cc149..2bd49feb7d 100644 --- a/src/bonsai/bonsai/bim/module/system/ui.py +++ b/src/bonsai/bonsai/bim/module/system/ui.py @@ -19,7 +19,7 @@ import bpy import bonsai.bim.helper import bonsai.tool as tool -from bonsai.bim.helper import prop_with_search +from bonsai.bim.helper import prop_with_search, draw_attributes from bpy.types import Panel, UIList from bonsai.bim.module.system.data import SystemData, ZonesData, ActiveObjectZonesData, ObjectSystemData, PortData @@ -113,12 +113,8 @@ class BIM_PT_systems(Panel): if self.props.edited_system_id: self.draw_editable_ui(context) - def draw_editable_ui(self, context): - for attribute in self.props.system_attributes: - row = self.layout.row(align=True) - row.prop(attribute, "string_value", text=attribute.name) - if attribute.is_optional: - row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") + def draw_editable_ui(self, context: bpy.types.Context) -> None: + draw_attributes(self.props.system_attributes, self.layout) class BIM_PT_ports(Panel):