mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
IfcDiff now uses the new selector syntax with the new UI
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
Reference in New Issue
Block a user