bring back filter operators into new Filter subpanel and change filter by storey to filter by container

This commit is contained in:
Sigma Dimensions (Yass)
2023-09-23 21:26:58 +01:00
parent e9ed850b78
commit 609b7840b0
4 changed files with 41 additions and 28 deletions
@@ -20,7 +20,7 @@ import bpy
from . import ui, prop, operator
classes = (
operator.ActivateIfcBuildingStoreyFilter,
operator.ActivateContainerFilter,
operator.ActivateIfcClassFilter,
operator.AddFilter,
operator.AddFilterGroup,
@@ -58,6 +58,7 @@ classes = (
prop.SearchQueryGroup,
prop.IfcSelectorProperties,
ui.BIM_PT_search,
ui.BIM_PT_filter,
ui.BIM_PT_colour_by_property,
ui.BIM_PT_select_similar,
ui.BIM_UL_colourscheme,
@@ -466,8 +466,8 @@ class ToggleFilterSelection(Operator):
if props.filter_type == "CLASSES":
for ifc_class in props.filter_classes:
ifc_class.is_selected = self.selecting_actionbool
elif props.filter_type == "BUILDINGSTOREYS":
for building_storey in props.filter_building_storeys:
elif props.filter_type == "CONTAINER":
for building_storey in props.filter_container:
building_storey.is_selected = self.selecting_actionbool
return {"FINISHED"}
@@ -525,11 +525,11 @@ class ActivateIfcClassFilter(Operator):
row.operator("bim.toggle_filter_selection", text="Deselect All").action = "DESELECT"
class ActivateIfcBuildingStoreyFilter(Operator):
class ActivateContainerFilter(Operator):
"""Filter the current selection by Building Storey"""
bl_idname = "bim.activate_ifc_building_storey_filter"
bl_label = "Filter by Building Storey"
bl_idname = "bim.activate_ifc_container_filter"
bl_label = "Filter by Container"
@classmethod
def poll(cls, context):
@@ -540,27 +540,29 @@ class ActivateIfcBuildingStoreyFilter(Operator):
def invoke(self, context, event):
props = bpy.context.scene.BIMSearchProperties
props.filter_building_storeys.clear()
props.filter_container.clear()
ifc_building_storeys = {}
containers = {}
containers.setdefault("None", 0)
for obj in context.selected_objects:
storey = tool.Misc.get_object_storey(obj)
if not storey:
container = tool.Spatial.get_container(tool.Ifc.get_entity(obj))
if not container:
containers["None"] += 1
continue
ifc_building_storeys.setdefault(storey.Name, 0)
ifc_building_storeys[storey.Name] += 1
containers.setdefault(container.Name, 0)
containers[container.Name] += 1
for name, total in dict(sorted(ifc_building_storeys.items())).items():
new = props.filter_building_storeys.add()
for name, total in dict(sorted(containers.items())).items():
new = props.filter_container.add()
new.name = name
new.total = total
props.filter_type = "BUILDINGSTOREYS"
props.filter_type = "CONTAINER"
return context.window_manager.invoke_props_dialog(self, width=250)
def execute(self, context):
bpy.context.scene.BIMSearchProperties.filter_building_storeys.clear()
bpy.context.scene.BIMSearchProperties.filter_container.clear()
return {"FINISHED"}
def draw(self, context):
@@ -568,12 +570,12 @@ class ActivateIfcBuildingStoreyFilter(Operator):
"BIM_UL_ifc_building_storey_filter",
"",
context.scene.BIMSearchProperties,
"filter_building_storeys",
"filter_container",
context.scene.BIMSearchProperties,
"filter_building_storeys_index",
"filter_container_index",
rows=20
if len(bpy.context.scene.BIMSearchProperties.filter_building_storeys) > 20
else len(bpy.context.scene.BIMSearchProperties.filter_building_storeys),
if len(bpy.context.scene.BIMSearchProperties.filter_container) > 20
else len(bpy.context.scene.BIMSearchProperties.filter_container),
)
row = self.layout.row(align=True)
row.operator("bim.toggle_filter_selection", text="Select All").action = "SELECT"
@@ -70,15 +70,15 @@ def update_is_class_selected(self, context):
new.obj = obj
def update_is_level_selected(self, context):
def update_is_container_selected(self, context):
if self.is_selected:
for obj in self.unselected_objects:
obj.obj.select_set(True)
self.unselected_objects.clear()
else:
for obj in context.selected_objects:
level = tool.Misc.get_object_storey(obj)
if level and level.Name == self.name:
container = tool.Spatial.get_container(tool.Ifc.get_entity(obj))
if (container and container.Name == self.name) or (not container and self.name== "None"):
obj.select_set(False)
new = self.unselected_objects.add()
new.obj = obj
@@ -93,7 +93,7 @@ class BIMFilterClasses(PropertyGroup):
class BIMFilterBuildingStoreys(PropertyGroup):
name: StringProperty(name="Name")
is_selected: BoolProperty(name="Is Level Selected", default=True, update=update_is_level_selected)
is_selected: BoolProperty(name="Is Level Selected", default=True, update=update_is_container_selected)
total: IntProperty(name="Total")
unselected_objects: CollectionProperty(type=ObjProperty, name="Unfiltered Objects")
@@ -140,8 +140,8 @@ class BIMSearchProperties(PropertyGroup):
filter_type: StringProperty(name="Filter Type")
filter_classes: CollectionProperty(type=BIMFilterClasses, name="Filter Classes")
filter_classes_index: IntProperty(name="Filter Classes Index")
filter_building_storeys: CollectionProperty(type=BIMFilterBuildingStoreys, name="Filter Level")
filter_building_storeys_index: IntProperty(name="Filter Level Index")
filter_container: CollectionProperty(type=BIMFilterBuildingStoreys, name="Filter Level")
filter_container_index: IntProperty(name="Filter Level Index")
def get_classes(self, ifc_product):
@@ -42,11 +42,21 @@ class BIM_PT_search(Panel):
row = self.layout.row(align=True)
row.operator("bim.search", text="Search", icon="VIEWZOOM")
return # Temporary for now whilst searching is being upgraded.
return
class BIM_PT_filter(Panel):
bl_label = "Filter Selection"
bl_idname = "BIM_PT_filter"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_grouping_and_filtering"
def draw(self, context):
row = self.layout.row(align=True)
row.operator("bim.activate_ifc_class_filter", icon="FILTER")
row.operator("bim.activate_ifc_building_storey_filter", icon="FILTER")
row.operator("bim.activate_ifc_container_filter", icon="FILTER")
class BIM_PT_colour_by_property(Panel):