diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index b71c0caf04..b436cf7c5a 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -325,6 +325,10 @@ def draw_filter(layout, props, data, module): elif ifc_filter.type == "instance": row = box.row(align=True) row.prop(ifc_filter, "value", text="", icon="GRIP") + op = row.operator("bim.select_filter_elements", text="", icon="EYEDROPPER") + op.group_index = i + op.index = j + op.module = module op = row.operator("bim.remove_filter", text="", icon="X") op.group_index = i op.index = j diff --git a/src/blenderbim/blenderbim/bim/module/csv/__init__.py b/src/blenderbim/blenderbim/bim/module/csv/__init__.py index 6a2641d36f..0cc17cc86c 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/csv/__init__.py @@ -25,7 +25,6 @@ classes = ( operator.RemoveAllCsvAttributes, operator.ExportIfcCsv, operator.ImportIfcCsv, - operator.EyedropIfcCsv, operator.SelectCsvIfcFile, operator.ImportCsvAttributes, operator.ExportCsvAttributes, diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index a364c9594b..b027e26ce6 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -64,7 +64,7 @@ class RemoveAllCsvAttributes(bpy.types.Operator): class ImportCsvAttributes(bpy.types.Operator): bl_idname = "bim.import_csv_attributes" - bl_label = "Import CSV Template" + bl_label = "Load CSV Settings" bl_description = "Import a json template for CSV export" bl_options = {"REGISTER", "UNDO"} filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"}) @@ -93,7 +93,7 @@ class ImportCsvAttributes(bpy.types.Operator): class ExportCsvAttributes(bpy.types.Operator): bl_idname = "bim.export_csv_attributes" - bl_label = "Export CSV Template" + bl_label = "Save CSV Settings" bl_options = {"REGISTER", "UNDO"} bl_description = "Save a json template for CSV export" filename_ext = ".json" @@ -197,24 +197,6 @@ class ImportIfcCsv(bpy.types.Operator): return {"FINISHED"} -class EyedropIfcCsv(bpy.types.Operator): - bl_idname = "bim.eyedrop_ifccsv" - bl_label = "Query Selected Items" - bl_options = {"REGISTER", "UNDO"} - - def execute(self, context): - global_ids = [] - self.file = IfcStore.get_file() - for obj in context.selected_objects: - element = tool.Ifc.get_entity(obj) - if element: - global_id = getattr(element, "GlobalId", None) - if global_id: - global_ids.append(global_id) - context.scene.CsvProperties.ifc_selector = ",".join(global_ids) - return {"FINISHED"} - - class SelectCsvIfcFile(bpy.types.Operator): bl_idname = "bim.select_csv_ifc_file" bl_label = "Select CSV IFC File" diff --git a/src/blenderbim/blenderbim/bim/module/search/__init__.py b/src/blenderbim/blenderbim/bim/module/search/__init__.py index 87a58cc368..f94636cafa 100644 --- a/src/blenderbim/blenderbim/bim/module/search/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/search/__init__.py @@ -39,6 +39,7 @@ classes = ( operator.SaveSearch, operator.SaveSelectorQuery, operator.Search, + operator.SelectFilterElements, operator.SelectGlobalId, operator.SelectIfcClass, operator.SelectSimilar, diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index b8a11c7ebd..e47b51c81a 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -120,6 +120,37 @@ class AddFilter(Operator): return {"FINISHED"} +class SelectFilterElements(bpy.types.Operator): + bl_idname = "bim.select_filter_elements" + bl_label = "Select Filter Elements" + bl_options = {"REGISTER", "UNDO"} + group_index: IntProperty() + index: IntProperty() + module: StringProperty() + + def execute(self, context): + if self.module == "search": + props = context.scene.BIMSearchProperties + elif self.module == "csv": + props = context.scene.CsvProperties + global_ids = [] + for obj in context.selected_objects: + element = tool.Ifc.get_entity(obj) + if element: + global_id = getattr(element, "GlobalId", None) + if global_id: + global_ids.append(global_id) + if len(global_ids) > 50: + # Too much to store in a string property + name = "globalid-filter-" + ifcopenshell.guid.new() + text_data = bpy.data.texts.new(name) + text_data.from_string(",".join(global_ids)) + props.filter_groups[self.group_index].filters[self.index].value = f"bpy.data.texts['{name}']" + else: + props.filter_groups[self.group_index].filters[self.index].value = ",".join(global_ids) + return {"FINISHED"} + + class Search(Operator): bl_idname = "bim.search" bl_label = "Search" diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index ea85c88589..b1238dc327 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -26,7 +26,11 @@ class Search(blenderbim.core.tool.Search): continue if ifc_filter.type == "instance": has_instance_or_entity_filter = True - filter_group_query.append(ifc_filter.value) + if "bpy.data.texts" in ifc_filter.value: + data_name = ifc_filter.value.split("bpy.data.texts")[1][2:-2] + filter_group_query.append(bpy.data.texts[data_name].as_string()) + else: + filter_group_query.append(ifc_filter.value) elif ifc_filter.type == "entity": has_instance_or_entity_filter = True filter_group_query.append(ifc_filter.value) @@ -92,7 +96,23 @@ class ImportFilterQueryTransformer(lark.Transformer): def facet_list(self, args): new = self.filter_groups.add() + global_ids = [] for arg in args: + if arg["type"] == "instance" and global_ids: + if "bpy.data.texts" in new2.value: + data_name = new2.value.split("bpy.data.texts")[1][2:-2] + bpy.data.texts[data_name].write("," + arg["value"]) + elif len(new2.value) > (23 * 50): + name = "globalid-filter-" + ifcopenshell.guid.new() + text_data = bpy.data.texts.new(name) + text_data.from_string(new2.value + "," + arg["value"]) + new2.value = f"bpy.data.texts['{name}']" + else: + new2.value += "," + arg["value"] + continue + global_ids = [] + if arg["type"] == "instance": + global_ids.append(arg["value"]) new2 = new.filters.add() new2.type = arg["type"] new2.value = arg["value"]