IfcDiff now uses the new selector syntax with the new UI

This commit is contained in:
Dion Moult
2024-04-01 10:16:30 +11:00
parent e2102cd2c7
commit 7742e4da45
6 changed files with 31 additions and 10 deletions
@@ -38,6 +38,7 @@ class DiffData:
cls.data["total_deleted"] = cls.total_deleted() cls.data["total_deleted"] = cls.total_deleted()
cls.data["total_changed"] = cls.total_changed() cls.data["total_changed"] = cls.total_changed()
cls.data["changes"] = cls.changes() cls.data["changes"] = cls.changes()
cls.data["saved_searches"] = cls.saved_searches()
cls.is_loaded = True cls.is_loaded = True
@classmethod @classmethod
@@ -84,3 +85,18 @@ class DiffData:
elif element.GlobalId in diff["deleted"]: elif element.GlobalId in diff["deleted"]:
changes["Deleted"] = True changes["Deleted"] = True
return changes 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")]
@@ -135,6 +135,7 @@ class ExecuteIfcDiff(bpy.types.Operator):
bl_label = "Execute IFC Diff" bl_label = "Execute IFC Diff"
filename_ext = ".json" filename_ext = ".json"
filepath: bpy.props.StringProperty(subtype="FILE_PATH") filepath: bpy.props.StringProperty(subtype="FILE_PATH")
filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"})
def invoke(self, context, event): def invoke(self, context, event):
self.filepath = bpy.path.ensure_ext(bpy.data.filepath, ".json") 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) new = ifcopenshell.open(self.props.new_file)
relationships = [r.relationship for r in self.props.diff_relationships] 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 = ifcdiff.IfcDiff(old, new, relationships=relationships, filter_elements=query)
ifc_diff.diff() ifc_diff.diff()
@@ -17,7 +17,7 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>. # along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
from blenderbim.bim.prop import StrProperty from blenderbim.bim.prop import StrProperty, BIMFilterGroup
from blenderbim.bim.module.diff.data import DiffData from blenderbim.bim.module.diff.data import DiffData
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
@@ -48,7 +48,7 @@ class DiffProperties(PropertyGroup):
old_file: StringProperty(default="", name="Old IFC File") old_file: StringProperty(default="", name="Old IFC File")
new_file: StringProperty(default="", name="New IFC File") new_file: StringProperty(default="", name="New IFC File")
diff_relationships: CollectionProperty(type=Relationships, name="Relationships") 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) should_load_changed_elements: BoolProperty(name="Load Changed Elements", default=True)
active_file: EnumProperty( active_file: EnumProperty(
items=[ items=[
@@ -19,8 +19,8 @@
from bpy.types import Panel from bpy.types import Panel
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.diff.data import DiffData from blenderbim.bim.module.diff.data import DiffData
import blenderbim.bim.helper
import blenderbim.tool as tool import blenderbim.tool as tool
import json
class BIM_PT_diff(Panel): class BIM_PT_diff(Panel):
@@ -93,8 +93,7 @@ class BIM_PT_diff(Panel):
remove.collection = "diff_relationships" remove.collection = "diff_relationships"
remove.index = index remove.index = index
row = layout.row(align=True) blenderbim.bim.helper.draw_filter(self.layout, props.filter_groups, DiffData, "diff")
row.prop(props, "diff_filter_elements")
row = layout.row() row = layout.row()
row.operator("bim.execute_ifc_diff") row.operator("bim.execute_ifc_diff")
+2
View File
@@ -20,6 +20,8 @@ class Search(blenderbim.core.tool.Search):
return bpy.context.scene.BIMSearchProperties.filter_groups return bpy.context.scene.BIMSearchProperties.filter_groups
elif module == "csv": elif module == "csv":
return bpy.context.scene.CsvProperties.filter_groups return bpy.context.scene.CsvProperties.filter_groups
elif module == "diff":
return bpy.context.scene.DiffProperties.filter_groups
elif module == "drawing_include": elif module == "drawing_include":
return bpy.context.active_object.data.BIMCameraProperties.include_filter_groups return bpy.context.active_object.data.BIMCameraProperties.include_filter_groups
elif module == "drawing_exclude": elif module == "drawing_exclude":
+7 -4
View File
@@ -54,7 +54,7 @@ class IfcDiff:
that comparisons will take longer. that comparisons will take longer.
:type is_shallow: bool :type is_shallow: bool
:param filter_elements: An IFC filter query if you only want to compare a :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 :type filter_elements: string
Example:: Example::
@@ -83,9 +83,12 @@ class IfcDiff:
self.precision = self.get_precision() self.precision = self.get_precision()
if self.filter_elements: if self.filter_elements:
selector = ifcopenshell.util.selector.Selector() old_elements = set(
old_elements = set(e.GlobalId for e in selector.parse(self.old, self.filter_elements)) e.GlobalId for e in ifcopenshell.util.selector.filter_elements(self.old, self.filter_elements)
new_elements = set(e.GlobalId for e in selector.parse(self.new, self.filter_elements)) )
new_elements = set(
e.GlobalId for e in ifcopenshell.util.selector.filter_elements(self.new, self.filter_elements)
)
else: else:
old_elements = self.old.by_type("IfcElement") old_elements = self.old.by_type("IfcElement")
if self.old.schema == "IFC2X3": if self.old.schema == "IFC2X3":