diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 3ad281d07d..ff52cf6ed9 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -92,6 +92,7 @@ classes = [ operator.SelectIfcFile, operator.SelectSchemaDir, operator.SelectURIAttribute, + operator.EditBlenderCollection, prop.StrProperty, operator.BIM_OT_enum_property_search, # /!\ Register AFTER prop.StrProperty prop.ObjProperty, diff --git a/src/blenderbim/blenderbim/bim/module/diff/__init__.py b/src/blenderbim/blenderbim/bim/module/diff/__init__.py index 02c9fbda20..4888dfd661 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/diff/__init__.py @@ -25,6 +25,7 @@ classes = ( operator.SelectDiffOldFile, operator.SelectDiffNewFile, operator.ExecuteIfcDiff, + prop.Relationships, prop.DiffProperties, ui.BIM_PT_diff, ) diff --git a/src/blenderbim/blenderbim/bim/module/diff/operator.py b/src/blenderbim/blenderbim/bim/module/diff/operator.py index 6c088669d9..e0c7553905 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/operator.py +++ b/src/blenderbim/blenderbim/bim/module/diff/operator.py @@ -114,10 +114,11 @@ class ExecuteIfcDiff(bpy.types.Operator): context.scene.DiffProperties.diff_old_file, context.scene.DiffProperties.diff_new_file, self.filepath, - context.scene.DiffProperties.diff_relationships.split(), + [r.relationship for r in context.scene.DiffProperties.diff_relationships], context.scene.DiffProperties.diff_filter_elements, ) - ifc_diff.diff() + diff = ifc_diff.diff() ifc_diff.export() context.scene.DiffProperties.diff_json_file = self.filepath + context.scene.DiffProperties.diff_result = diff return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/diff/prop.py b/src/blenderbim/blenderbim/bim/module/diff/prop.py index bfea4c9b63..4dde19cce3 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/prop.py +++ b/src/blenderbim/blenderbim/bim/module/diff/prop.py @@ -30,10 +30,16 @@ from bpy.props import ( CollectionProperty, ) +class Relationships(PropertyGroup): + relationship: EnumProperty( + name="Relationship", + items=[(r,r,r) for r in ["type", "property", "container", "aggregate", "classification"]], + ) class DiffProperties(PropertyGroup): diff_json_file: StringProperty(default="", name="Diff JSON File") diff_old_file: StringProperty(default="", name="Diff Old IFC File") diff_new_file: StringProperty(default="", name="Diff New IFC File") - diff_relationships: StringProperty(default="", name="Diff Relationships") + diff_relationships: CollectionProperty(type=Relationships, name="Diff Relationships") diff_filter_elements: StringProperty(default="", name="Diff Filter") + diff_result: StringProperty(default="", name="Diff Result") diff --git a/src/blenderbim/blenderbim/bim/module/diff/ui.py b/src/blenderbim/blenderbim/bim/module/diff/ui.py index 74fe44c529..dc92d76a6a 100644 --- a/src/blenderbim/blenderbim/bim/module/diff/ui.py +++ b/src/blenderbim/blenderbim/bim/module/diff/ui.py @@ -18,6 +18,8 @@ from bpy.types import Panel from blenderbim.bim.ifc import IfcStore +import blenderbim.tool as tool +import json class BIM_PT_diff(Panel): @@ -48,15 +50,52 @@ class BIM_PT_diff(Panel): row = layout.row(align=True) row.prop(bim_properties, "diff_relationships") + row.context_pointer_set("bim_prop_group", bim_properties) + add = row.operator("bim.edit_blender_collection", icon="ADD", text="") + add.option = "add" + add.collection = "diff_relationships" + + for index, r in enumerate(bim_properties.diff_relationships): + row = layout.row(align=True) + row.context_pointer_set("bim_prop_group", bim_properties) + row.prop(r, "relationship", text=" ") + remove = row.operator("bim.edit_blender_collection", icon="REMOVE", text="") + remove.option = "remove" + remove.collection = "diff_relationships" + remove.index = index row = layout.row(align=True) row.prop(bim_properties, "diff_filter_elements") + row.operator("bim.ifc_selector", icon="FILTER", text="") row = layout.row() row.operator("bim.execute_ifc_diff") + if bim_properties.diff_result: + row = layout.row() + row.alignment = "CENTER" + row.label(text=bim_properties.diff_result) # TODO: show if there ifc diff operation is sucessful row = layout.row(align=True) row.prop(bim_properties, "diff_json_file") row.operator("bim.select_diff_json_file", icon="FILE_FOLDER", text="") row.operator("bim.visualise_diff", icon="HIDE_OFF", text="") + + + # Show diff results # + if bim_properties.diff_json_file: + with open(context.scene.DiffProperties.diff_json_file, "r") as file: + results = json.load(file) + if results: + row = layout.row() + row = layout.row() + row.label(text="Diff Results:") + for g in results["changed"]: + obj = tool.Ifc.get_entity(context.active_object) + if obj.GlobalId == g: + for k,v in results["changed"][g].items(): + row = layout.row() + row.alignment = "LEFT" + row.label(text=f"{str(k).upper()}: {str(v)}") + + \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/module/search/__init__.py b/src/blenderbim/blenderbim/bim/module/search/__init__.py index 57379f90a1..7fb8ce763f 100644 --- a/src/blenderbim/blenderbim/bim/module/search/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/search/__init__.py @@ -20,7 +20,6 @@ import bpy from . import ui, prop, operator classes = ( - operator.EditBlenderCollection, operator.ActivateIfcClassFilter, operator.ActivateIfcBuildingStoreyFilter, operator.ColourByAttribute, diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 629c7524db..d331877768 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -69,22 +69,6 @@ def does_keyword_exist(pattern, string, context): return True -class EditBlenderCollection(Operator): - bl_idname = "bim.edit_blender_collection" - bl_label = "Add or Remove blender collection item" - bl_options = {"REGISTER", "UNDO"} - option: StringProperty() - collection: StringProperty() - index: IntProperty() - - def execute(self, context): - if self.option == "add": - getattr(context.bim_prop_group, self.collection).add() - else: - getattr(context.bim_prop_group, self.collection).remove(self.index) - return {"FINISHED"} - - class SelectGlobalId(Operator): """Click to select the objects that match with the given Global ID""" @@ -562,7 +546,7 @@ class FilterModelElements(Operator): if obj.BIMObjectProperties.ifc_definition_id in sel_element_ids: obj.hide_set(True) - +#This needs to be moved into ui code, I know ;) - vulevukusej class IfcSelector(Operator): """Select elements in model with IFC Selector""" @@ -581,7 +565,6 @@ class IfcSelector(Operator): def draw(self, context): from . import ui - ui.IfcSelectorUI.draw(context, self.layout) diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index 83859a2bc0..7958271be8 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -595,3 +595,18 @@ class BIM_OT_enum_property_search(bpy.types.Operator): values = [values] for value in values: self.add_item(identifier=key, name=key + " (" + value + ")") + +class EditBlenderCollection(bpy.types.Operator): + bl_idname = "bim.edit_blender_collection" + bl_label = "Add or Remove blender collection item" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.StringProperty(description="add or remove item from collection") + collection: bpy.props.StringProperty(description="collection to be edited") + index: bpy.props.IntProperty(description="index of item to be removed") + + def execute(self, context): + if self.option == "add": + getattr(context.bim_prop_group, self.collection).add() + else: + getattr(context.bim_prop_group, self.collection).remove(self.index) + return {"FINISHED"}