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):