You can now filter spatial containers by name, long name, or class

This commit is contained in:
Dion Moult
2024-08-23 14:27:22 +10:00
parent e3b1e0773f
commit ed6365b292
2 changed files with 36 additions and 6 deletions
@@ -115,6 +115,7 @@ class Element(PropertyGroup):
class BIMSpatialDecompositionProperties(PropertyGroup):
container_filter: StringProperty(name="Container Filter", default="", options={"TEXTEDIT_UPDATE"})
containers: CollectionProperty(name="Containers", type=BIMContainer)
contracted_containers: StringProperty(name="Contracted containers", default="[]")
expanded_containers: StringProperty(name="Expanded containers", default="[]")
+35 -6
View File
@@ -184,6 +184,9 @@ class BIM_PT_spatial_decomposition(Panel):
class BIM_UL_containers_manager(UIList):
def __init__(self):
self.use_filter_show = True
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
row = layout.row(align=True)
@@ -214,16 +217,42 @@ class BIM_UL_containers_manager(UIList):
row.label(text="", icon="BLANK1")
if item.has_children:
if item.is_expanded:
row.operator("bim.contract_container", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN").container = (
item.ifc_definition_id
)
row.operator(
"bim.contract_container", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN"
).container = item.ifc_definition_id
else:
row.operator("bim.expand_container", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT").container = (
item.ifc_definition_id
)
row.operator(
"bim.expand_container", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT"
).container = item.ifc_definition_id
else:
row.label(text="", icon="BLANK1")
def draw_filter(self, context, layout):
row = layout.row()
row.prop(context.scene.BIMSpatialDecompositionProperties, "container_filter", text="", icon="VIEWZOOM")
def filter_items(self, context, data, propname):
items = getattr(data, propname)
filter_name = context.scene.BIMSpatialDecompositionProperties.container_filter.lower()
filter_flags = [self.bitflag_filter_item] * len(items)
for idx, item in enumerate(items):
if (
filter_name in item.name.lower()
or filter_name in item.long_name.lower()
or filter_name in item.ifc_class.lower()
):
filter_flags[idx] |= self.bitflag_filter_item
else:
filter_flags[idx] &= ~self.bitflag_filter_item
return filter_flags, []
items = getattr(data, propname)
filter_name = context.scene.BIMSpatialDecompositionProperties.container_filter
filtered = bpy.types.UI_UL_list.filter_items_by_name(filter_name, self.bitflag_filter_item, items, "name")
return filtered, []
class BIM_UL_elements(UIList):
def __init__(self):