diff --git a/src/blenderbim/blenderbim/bim/module/diff/data.py b/src/blenderbim/blenderbim/bim/module/diff/data.py index 8dfc47e615..d84b9c19a2 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/data.py +++ b/src/blenderbim/blenderbim/bim/module/diff/data.py @@ -38,6 +38,7 @@ class DiffData: cls.data["total_deleted"] = cls.total_deleted() cls.data["total_changed"] = cls.total_changed() cls.data["changes"] = cls.changes() + cls.data["saved_searches"] = cls.saved_searches() cls.is_loaded = True @classmethod @@ -84,3 +85,18 @@ class DiffData: elif element.GlobalId in diff["deleted"]: changes["Deleted"] = True return changes + + @classmethod + def saved_searches(cls): + if not tool.Ifc.get(): + return [] + groups = tool.Ifc.get().by_type("IfcGroup") + results = [] + for group in groups: + try: + data = json.loads(group.Description) + if isinstance(data, dict) and data.get("type", None) == "BBIM_Search" and data.get("query", None): + results.append(group) + except: + pass + return [(str(g.id()), g.Name or "Unnamed", "") for g in sorted(results, key=lambda x: x.Name or "Unnamed")] diff --git a/src/blenderbim/blenderbim/bim/module/diff/operator.py b/src/blenderbim/blenderbim/bim/module/diff/operator.py index a0bb7d0c2c..9f1e85f66c 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/operator.py +++ b/src/blenderbim/blenderbim/bim/module/diff/operator.py @@ -135,6 +135,7 @@ class ExecuteIfcDiff(bpy.types.Operator): bl_label = "Execute IFC Diff" filename_ext = ".json" filepath: bpy.props.StringProperty(subtype="FILE_PATH") + filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"}) def invoke(self, context, event): self.filepath = bpy.path.ensure_ext(bpy.data.filepath, ".json") @@ -162,7 +163,7 @@ class ExecuteIfcDiff(bpy.types.Operator): new = ifcopenshell.open(self.props.new_file) relationships = [r.relationship for r in self.props.diff_relationships] - query = self.props.diff_filter_elements + query = tool.Search.export_filter_query(self.props.filter_groups) or None ifc_diff = ifcdiff.IfcDiff(old, new, relationships=relationships, filter_elements=query) ifc_diff.diff() diff --git a/src/blenderbim/blenderbim/bim/module/diff/prop.py b/src/blenderbim/blenderbim/bim/module/diff/prop.py index 8a1522e771..c6b0a06c91 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/prop.py +++ b/src/blenderbim/blenderbim/bim/module/diff/prop.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import bpy -from blenderbim.bim.prop import StrProperty +from blenderbim.bim.prop import StrProperty, BIMFilterGroup from blenderbim.bim.module.diff.data import DiffData from bpy.types import PropertyGroup from bpy.props import ( @@ -48,7 +48,7 @@ class DiffProperties(PropertyGroup): old_file: StringProperty(default="", name="Old IFC File") new_file: StringProperty(default="", name="New IFC File") diff_relationships: CollectionProperty(type=Relationships, name="Relationships") - diff_filter_elements: StringProperty(default="", name="Filter") + filter_groups: CollectionProperty(type=BIMFilterGroup, name="Filter Groups") should_load_changed_elements: BoolProperty(name="Load Changed Elements", default=True) active_file: EnumProperty( items=[ diff --git a/src/blenderbim/blenderbim/bim/module/diff/ui.py b/src/blenderbim/blenderbim/bim/module/diff/ui.py index ae0646fc92..6593e7cd6f 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/ui.py +++ b/src/blenderbim/blenderbim/bim/module/diff/ui.py @@ -19,8 +19,8 @@ from bpy.types import Panel from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.diff.data import DiffData +import blenderbim.bim.helper import blenderbim.tool as tool -import json class BIM_PT_diff(Panel): @@ -93,8 +93,7 @@ class BIM_PT_diff(Panel): remove.collection = "diff_relationships" remove.index = index - row = layout.row(align=True) - row.prop(props, "diff_filter_elements") + blenderbim.bim.helper.draw_filter(self.layout, props.filter_groups, DiffData, "diff") row = layout.row() row.operator("bim.execute_ifc_diff") diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index d2f6ca1f11..4a3f9b3f1b 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -20,6 +20,8 @@ class Search(blenderbim.core.tool.Search): return bpy.context.scene.BIMSearchProperties.filter_groups elif module == "csv": return bpy.context.scene.CsvProperties.filter_groups + elif module == "diff": + return bpy.context.scene.DiffProperties.filter_groups elif module == "drawing_include": return bpy.context.active_object.data.BIMCameraProperties.include_filter_groups elif module == "drawing_exclude": diff --git a/src/ifcdiff/ifcdiff.py b/src/ifcdiff/ifcdiff.py index 7abb29c0af..2ee8392f9d 100755 --- a/src/ifcdiff/ifcdiff.py +++ b/src/ifcdiff/ifcdiff.py @@ -54,7 +54,7 @@ class IfcDiff: that comparisons will take longer. :type is_shallow: bool :param filter_elements: An IFC filter query if you only want to compare a - subset of elements. For example: ``.IfcWall`` to only compare walls. + subset of elements. For example: ``IfcWall`` to only compare walls. :type filter_elements: string Example:: @@ -83,9 +83,12 @@ class IfcDiff: self.precision = self.get_precision() if self.filter_elements: - selector = ifcopenshell.util.selector.Selector() - old_elements = set(e.GlobalId for e in selector.parse(self.old, self.filter_elements)) - new_elements = set(e.GlobalId for e in selector.parse(self.new, self.filter_elements)) + old_elements = set( + e.GlobalId for e in ifcopenshell.util.selector.filter_elements(self.old, self.filter_elements) + ) + new_elements = set( + e.GlobalId for e in ifcopenshell.util.selector.filter_elements(self.new, self.filter_elements) + ) else: old_elements = self.old.by_type("IfcElement") if self.old.schema == "IFC2X3":