diff --git a/src/ifcblenderexport/blenderbim/__init__.py b/src/ifcblenderexport/blenderbim/__init__.py index 6d458feb83..34c40ed119 100644 --- a/src/ifcblenderexport/blenderbim/__init__.py +++ b/src/ifcblenderexport/blenderbim/__init__.py @@ -75,6 +75,7 @@ if bpy is not None: operator.RemoveMaterialAttribute, operator.QuickProjectSetup, operator.SelectGlobalId, + operator.SelectAttribute, operator.CreateAggregate, operator.EditAggregate, operator.SaveAggregate, @@ -114,6 +115,7 @@ if bpy is not None: prop.BIMCameraProperties, ui.BIM_PT_documentation, ui.BIM_PT_bim, + ui.BIM_PT_search, ui.BIM_PT_owner, ui.BIM_PT_context, ui.BIM_PT_qa, diff --git a/src/ifcblenderexport/blenderbim/operator.py b/src/ifcblenderexport/blenderbim/operator.py index 52f023079d..ef64207ca9 100644 --- a/src/ifcblenderexport/blenderbim/operator.py +++ b/src/ifcblenderexport/blenderbim/operator.py @@ -99,11 +99,37 @@ class SelectGlobalId(bpy.types.Operator): for object in bpy.context.visible_objects: index = object.BIMObjectProperties.attributes.find('GlobalId') if index != -1 \ - and object.BIMObjectProperties.attributes[index].string_value == bpy.context.scene.BIMProperties.global_id: + and object.BIMObjectProperties.attributes[index].string_value == bpy.context.scene.BIMProperties.global_id: object.select_set(True) break return {'FINISHED'} +class SelectAttribute(bpy.types.Operator): + bl_idname = 'bim.select_attribute' + bl_label = 'Select Attribute' + + def execute(self, context): + import re + for object in bpy.context.visible_objects: + index = object.BIMObjectProperties.attributes.find(bpy.context.scene.BIMProperties.search_attribute_name) + if index == -1: + continue + value = object.BIMObjectProperties.attributes[index].string_value + search_value = bpy.context.scene.BIMProperties.search_attribute_value + if bpy.context.scene.BIMProperties.search_regex \ + and bpy.context.scene.BIMProperties.search_ignorecase \ + and re.search(search_value, value, flags=re.IGNORECASE): + object.select_set(True) + elif bpy.context.scene.BIMProperties.search_regex \ + and re.search(search_value, value): + object.select_set(True) + elif bpy.context.scene.BIMProperties.search_ignorecase \ + and value.lower() == search_value.lower(): + object.select_set(True) + elif value == search_value: + object.select_set(True) + return {'FINISHED'} + class AssignClass(bpy.types.Operator): bl_idname = 'bim.assign_class' bl_label = 'Assign IFC Class' diff --git a/src/ifcblenderexport/blenderbim/prop.py b/src/ifcblenderexport/blenderbim/prop.py index 7f415996fe..19f988813f 100644 --- a/src/ifcblenderexport/blenderbim/prop.py +++ b/src/ifcblenderexport/blenderbim/prop.py @@ -388,7 +388,11 @@ class BIMProperties(PropertyGroup): pset_file: EnumProperty(items=getPsetFiles, name="Pset File") has_georeferencing: BoolProperty(name="Has Georeferencing", default=False) has_library: BoolProperty(name="Has Project Library", default=False) + search_regex: BoolProperty(name="Search With Regex", default=False) + search_ignorecase: BoolProperty(name="Search Ignoring Case", default=True) global_id: StringProperty(name="GlobalId") + search_attribute_name: StringProperty(name="Search Attribute Name") + search_attribute_value: StringProperty(name="Search Attribute Value") features_dir: StringProperty(default='', name="Features Directory", update=refreshFeaturesFiles) features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios) scenario: EnumProperty(items=getScenarios, name="Scenario") diff --git a/src/ifcblenderexport/blenderbim/ui.py b/src/ifcblenderexport/blenderbim/ui.py index 2ba99c0182..e549bf0050 100644 --- a/src/ifcblenderexport/blenderbim/ui.py +++ b/src/ifcblenderexport/blenderbim/ui.py @@ -410,13 +410,6 @@ class BIM_PT_bim(Panel): row.prop(bim_properties, "ifc_file") row.operator("bim.select_ifc_file", icon="FILE_FOLDER", text="") - layout.label(text="Software Identity:") - - row = layout.row() - row.prop(bim_properties, 'global_id') - row = layout.row() - row.operator('bim.select_global_id') - layout.label(text="IFC Categorisation:") row = layout.row() @@ -471,6 +464,37 @@ class BIM_PT_bim(Panel): row.operator("bim.unassign_classification") +class BIM_PT_search(Panel): + bl_label = "BIM Search" + bl_idname = "BIM_PT_search" + bl_options = {'DEFAULT_CLOSED'} + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "scene" + + def draw(self, context): + layout = self.layout + + scene = context.scene + props = scene.BIMProperties + + row = layout.row() + row.prop(props, 'search_regex') + row = layout.row() + row.prop(props, 'search_ignorecase') + + layout.label(text="Global ID:") + row = layout.row(align=True) + row.prop(props, 'global_id', text='') + row.operator('bim.select_global_id', text='', icon='VIEWZOOM') + + layout.label(text="Attribute:") + row = layout.row(align=True) + row.prop(props, 'search_attribute_name', text='') + row.prop(props, 'search_attribute_value', text='') + row.operator('bim.select_attribute', text='', icon='VIEWZOOM') + + class BIM_PT_qa(Panel): bl_label = "BIMTester Quality Auditing" bl_idname = "BIM_PT_qa"