mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
Small Refactor to Bimtester + Diff Module (#1271)
* Refactoring of BIMTester Module * Modification to Bimtester refactor + Diff refactor Co-authored-by: Ihab El Aghoury <ihab_elaghoury@yahoo.ca> Co-authored-by: Dion Moult <dion@thinkmoult.com>
This commit is contained in:
@@ -17,6 +17,7 @@ if bpy is not None:
|
|||||||
"context": None,
|
"context": None,
|
||||||
"covetool": None,
|
"covetool": None,
|
||||||
"csv": None,
|
"csv": None,
|
||||||
|
"diff": None,
|
||||||
"bimtester": None,
|
"bimtester": None,
|
||||||
"debug": None,
|
"debug": None,
|
||||||
"geometry": None,
|
"geometry": None,
|
||||||
@@ -40,9 +41,6 @@ if bpy is not None:
|
|||||||
operator.SelectClass,
|
operator.SelectClass,
|
||||||
operator.SelectType,
|
operator.SelectType,
|
||||||
operator.OpenUri,
|
operator.OpenUri,
|
||||||
operator.SelectDiffJsonFile,
|
|
||||||
operator.SelectDiffNewFile,
|
|
||||||
operator.SelectDiffOldFile,
|
|
||||||
operator.SelectDataDir,
|
operator.SelectDataDir,
|
||||||
operator.SelectSchemaDir,
|
operator.SelectSchemaDir,
|
||||||
operator.SelectIfcFile,
|
operator.SelectIfcFile,
|
||||||
@@ -106,8 +104,6 @@ if bpy is not None:
|
|||||||
operator.OpenView,
|
operator.OpenView,
|
||||||
operator.OpenViewCamera,
|
operator.OpenViewCamera,
|
||||||
operator.ActivateView,
|
operator.ActivateView,
|
||||||
operator.ExecuteIfcDiff,
|
|
||||||
operator.VisualiseDiff,
|
|
||||||
operator.ExportClashSets,
|
operator.ExportClashSets,
|
||||||
operator.ImportClashSets,
|
operator.ImportClashSets,
|
||||||
operator.AddClashSet,
|
operator.AddClashSet,
|
||||||
@@ -228,7 +224,6 @@ if bpy is not None:
|
|||||||
ui.BIM_PT_ifcclash,
|
ui.BIM_PT_ifcclash,
|
||||||
ui.BIM_PT_library,
|
ui.BIM_PT_library,
|
||||||
ui.BIM_PT_presentation_layers,
|
ui.BIM_PT_presentation_layers,
|
||||||
ui.BIM_PT_diff,
|
|
||||||
ui.BIM_PT_patch,
|
ui.BIM_PT_patch,
|
||||||
ui.BIM_PT_mvd,
|
ui.BIM_PT_mvd,
|
||||||
ui.BIM_PT_presentation_layer_data,
|
ui.BIM_PT_presentation_layer_data,
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class BIM_PT_qa(Panel):
|
|||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
if context.scene.BimTesterProperties.features_file != '': # To handle the error when no .feature file exists in the folder
|
if str(context.scene.BimTesterProperties.features_file) != '': # To handle the error when no .feature file exists in the folder
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.operator("bim.execute_bim_tester")
|
row.operator("bim.execute_bim_tester")
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import bpy
|
||||||
|
from . import ui, prop, operator
|
||||||
|
|
||||||
|
classes = (
|
||||||
|
operator.SelectDiffJsonFile,
|
||||||
|
operator.VisualiseDiff,
|
||||||
|
operator.SelectDiffOldFile,
|
||||||
|
operator.SelectDiffNewFile,
|
||||||
|
operator.ExecuteIfcDiff,
|
||||||
|
prop.DiffProperties,
|
||||||
|
ui.BIM_PT_diff,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def register():
|
||||||
|
bpy.types.Scene.DiffProperties = bpy.props.PointerProperty(type=prop.DiffProperties)
|
||||||
|
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
del bpy.types.Scene.DiffProperties
|
||||||
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
import bpy
|
||||||
|
import ifccsv
|
||||||
|
import ifcopenshell
|
||||||
|
import json
|
||||||
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SelectDiffJsonFile(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.select_diff_json_file"
|
||||||
|
bl_label = "Select Diff JSON File"
|
||||||
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
bpy.context.scene.DiffProperties.diff_json_file = self.filepath
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
context.window_manager.fileselect_add(self)
|
||||||
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
|
|
||||||
|
class VisualiseDiff(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.visualise_diff"
|
||||||
|
bl_label = "Visualise Diff"
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
#ifc_file = IfcStore.get_file() # In case we get from Store
|
||||||
|
ifc_file = ifcopenshell.open(context.scene.DiffProperties.diff_new_file) # for Now refer to the new file
|
||||||
|
with open(bpy.context.scene.DiffProperties.diff_json_file, "r") as file:
|
||||||
|
diff = json.load(file)
|
||||||
|
for obj in bpy.context.visible_objects:
|
||||||
|
obj.color = (1.0, 1.0, 1.0, 0.2)
|
||||||
|
global_id = ifc_file.by_id(obj.BIMObjectProperties.ifc_definition_id).GlobalId
|
||||||
|
#global_id = obj.BIMObjectProperties.attributes.get("GlobalId")
|
||||||
|
if not global_id:
|
||||||
|
continue
|
||||||
|
if global_id.string_value in diff["deleted"]:
|
||||||
|
obj.color = (1.0, 0.0, 0.0, 0.2)
|
||||||
|
elif global_id.string_value in diff["added"]:
|
||||||
|
obj.color = (0.0, 1.0, 0.0, 0.2)
|
||||||
|
elif global_id.string_value in diff["changed"]:
|
||||||
|
obj.color = (0.0, 0.0, 1.0, 0.2)
|
||||||
|
area = next(area for area in bpy.context.screen.areas if area.type == "VIEW_3D")
|
||||||
|
area.spaces[0].shading.color_type = "OBJECT"
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
class SelectDiffOldFile(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.select_diff_old_file"
|
||||||
|
bl_label = "Select Diff Old File"
|
||||||
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
bpy.context.scene.DiffProperties.diff_old_file = self.filepath
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
context.window_manager.fileselect_add(self)
|
||||||
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
|
|
||||||
|
class SelectDiffNewFile(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.select_diff_new_file"
|
||||||
|
bl_label = "Select Diff New File"
|
||||||
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
bpy.context.scene.DiffProperties.diff_new_file = self.filepath
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
context.window_manager.fileselect_add(self)
|
||||||
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
|
|
||||||
|
class ExecuteIfcDiff(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.execute_ifc_diff"
|
||||||
|
bl_label = "Execute IFC Diff"
|
||||||
|
filename_ext = ".json"
|
||||||
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
self.filepath = bpy.path.ensure_ext(bpy.data.filepath, ".json")
|
||||||
|
WindowManager = context.window_manager
|
||||||
|
WindowManager.fileselect_add(self)
|
||||||
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
import ifcdiff
|
||||||
|
|
||||||
|
ifc_diff = ifcdiff.IfcDiff(
|
||||||
|
bpy.context.scene.DiffProperties.diff_old_file,
|
||||||
|
bpy.context.scene.DiffProperties.diff_new_file,
|
||||||
|
self.filepath,
|
||||||
|
bpy.context.scene.DiffProperties.diff_relationships.split(),
|
||||||
|
)
|
||||||
|
ifc_diff.diff()
|
||||||
|
ifc_diff.export()
|
||||||
|
bpy.context.scene.DiffProperties.diff_json_file = self.filepath
|
||||||
|
return {"FINISHED"}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import bpy
|
||||||
|
from blenderbim.bim.prop import StrProperty
|
||||||
|
from bpy.types import PropertyGroup
|
||||||
|
from bpy.props import (
|
||||||
|
PointerProperty,
|
||||||
|
StringProperty,
|
||||||
|
EnumProperty,
|
||||||
|
BoolProperty,
|
||||||
|
IntProperty,
|
||||||
|
FloatProperty,
|
||||||
|
FloatVectorProperty,
|
||||||
|
CollectionProperty,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
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")
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
from bpy.types import Panel
|
||||||
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
|
class BIM_PT_diff(Panel):
|
||||||
|
bl_label = "IFC Diff"
|
||||||
|
bl_idname = "BIM_PT_diff"
|
||||||
|
bl_options = {"DEFAULT_CLOSED"}
|
||||||
|
bl_space_type = "PROPERTIES"
|
||||||
|
bl_region_type = "WINDOW"
|
||||||
|
bl_context = "scene"
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.use_property_split = True
|
||||||
|
|
||||||
|
scene = context.scene
|
||||||
|
bim_properties = scene.DiffProperties
|
||||||
|
|
||||||
|
layout.label(text="IFC Diff Setup:")
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(bim_properties, "diff_old_file")
|
||||||
|
row.operator("bim.select_diff_old_file", icon="FILE_FOLDER", text="")
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(bim_properties, "diff_new_file")
|
||||||
|
row.operator("bim.select_diff_new_file", icon="FILE_FOLDER", text="")
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(bim_properties, "diff_relationships")
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
row.operator("bim.execute_ifc_diff")
|
||||||
|
|
||||||
|
# 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="")
|
||||||
@@ -748,98 +748,6 @@ class ExecuteIfcPatch(bpy.types.Operator):
|
|||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
class SelectDiffJsonFile(bpy.types.Operator):
|
|
||||||
bl_idname = "bim.select_diff_json_file"
|
|
||||||
bl_label = "Select Diff JSON File"
|
|
||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
bpy.context.scene.BIMProperties.diff_json_file = self.filepath
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
def invoke(self, context, event):
|
|
||||||
context.window_manager.fileselect_add(self)
|
|
||||||
return {"RUNNING_MODAL"}
|
|
||||||
|
|
||||||
|
|
||||||
class VisualiseDiff(bpy.types.Operator):
|
|
||||||
bl_idname = "bim.visualise_diff"
|
|
||||||
bl_label = "Visualise Diff"
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
with open(bpy.context.scene.BIMProperties.diff_json_file, "r") as file:
|
|
||||||
diff = json.load(file)
|
|
||||||
for obj in bpy.context.visible_objects:
|
|
||||||
obj.color = (1.0, 1.0, 1.0, 0.2)
|
|
||||||
global_id = obj.BIMObjectProperties.attributes.get("GlobalId")
|
|
||||||
if not global_id:
|
|
||||||
continue
|
|
||||||
if global_id.string_value in diff["deleted"]:
|
|
||||||
obj.color = (1.0, 0.0, 0.0, 0.2)
|
|
||||||
elif global_id.string_value in diff["added"]:
|
|
||||||
obj.color = (0.0, 1.0, 0.0, 0.2)
|
|
||||||
elif global_id.string_value in diff["changed"]:
|
|
||||||
obj.color = (0.0, 0.0, 1.0, 0.2)
|
|
||||||
area = next(area for area in bpy.context.screen.areas if area.type == "VIEW_3D")
|
|
||||||
area.spaces[0].shading.color_type = "OBJECT"
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
|
|
||||||
class SelectDiffOldFile(bpy.types.Operator):
|
|
||||||
bl_idname = "bim.select_diff_old_file"
|
|
||||||
bl_label = "Select Diff Old File"
|
|
||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
bpy.context.scene.BIMProperties.diff_old_file = self.filepath
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
def invoke(self, context, event):
|
|
||||||
context.window_manager.fileselect_add(self)
|
|
||||||
return {"RUNNING_MODAL"}
|
|
||||||
|
|
||||||
|
|
||||||
class SelectDiffNewFile(bpy.types.Operator):
|
|
||||||
bl_idname = "bim.select_diff_new_file"
|
|
||||||
bl_label = "Select Diff New File"
|
|
||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
bpy.context.scene.BIMProperties.diff_new_file = self.filepath
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
def invoke(self, context, event):
|
|
||||||
context.window_manager.fileselect_add(self)
|
|
||||||
return {"RUNNING_MODAL"}
|
|
||||||
|
|
||||||
|
|
||||||
class ExecuteIfcDiff(bpy.types.Operator):
|
|
||||||
bl_idname = "bim.execute_ifc_diff"
|
|
||||||
bl_label = "Execute IFC Diff"
|
|
||||||
filename_ext = ".json"
|
|
||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
|
||||||
|
|
||||||
def invoke(self, context, event):
|
|
||||||
self.filepath = bpy.path.ensure_ext(bpy.data.filepath, ".json")
|
|
||||||
WindowManager = context.window_manager
|
|
||||||
WindowManager.fileselect_add(self)
|
|
||||||
return {"RUNNING_MODAL"}
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
import ifcdiff
|
|
||||||
|
|
||||||
ifc_diff = ifcdiff.IfcDiff(
|
|
||||||
bpy.context.scene.BIMProperties.diff_old_file,
|
|
||||||
bpy.context.scene.BIMProperties.diff_new_file,
|
|
||||||
self.filepath,
|
|
||||||
bpy.context.scene.BIMProperties.diff_relationships.split(),
|
|
||||||
)
|
|
||||||
ifc_diff.diff()
|
|
||||||
ifc_diff.export()
|
|
||||||
bpy.context.scene.BIMProperties.diff_json_file = self.filepath
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
|
|
||||||
class ExportClashSets(bpy.types.Operator):
|
class ExportClashSets(bpy.types.Operator):
|
||||||
bl_idname = "bim.export_clash_sets"
|
bl_idname = "bim.export_clash_sets"
|
||||||
bl_label = "Export Clash Sets"
|
bl_label = "Export Clash Sets"
|
||||||
|
|||||||
@@ -1042,10 +1042,6 @@ class BIMProperties(PropertyGroup):
|
|||||||
search_pset_name: StringProperty(name="Search Pset Name")
|
search_pset_name: StringProperty(name="Search Pset Name")
|
||||||
search_prop_name: StringProperty(name="Search Prop Name")
|
search_prop_name: StringProperty(name="Search Prop Name")
|
||||||
search_pset_value: StringProperty(name="Search Pset Value")
|
search_pset_value: StringProperty(name="Search Pset Value")
|
||||||
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")
|
|
||||||
classification: EnumProperty(items=getClassifications, name="Classification", update=refreshReferences)
|
classification: EnumProperty(items=getClassifications, name="Classification", update=refreshReferences)
|
||||||
active_classification_name: StringProperty(name="Active Classification Name")
|
active_classification_name: StringProperty(name="Active Classification Name")
|
||||||
classifications: CollectionProperty(name="Classifications", type=Classification)
|
classifications: CollectionProperty(name="Classifications", type=Classification)
|
||||||
|
|||||||
@@ -802,43 +802,6 @@ class BIM_PT_library(Panel):
|
|||||||
layout.row().prop(scene.BIMLibrary, "description")
|
layout.row().prop(scene.BIMLibrary, "description")
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_diff(Panel):
|
|
||||||
bl_label = "IFC Diff"
|
|
||||||
bl_idname = "BIM_PT_diff"
|
|
||||||
bl_options = {"DEFAULT_CLOSED"}
|
|
||||||
bl_space_type = "PROPERTIES"
|
|
||||||
bl_region_type = "WINDOW"
|
|
||||||
bl_context = "scene"
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
layout.use_property_split = True
|
|
||||||
|
|
||||||
scene = context.scene
|
|
||||||
bim_properties = scene.BIMProperties
|
|
||||||
|
|
||||||
layout.label(text="IFC Diff Setup:")
|
|
||||||
|
|
||||||
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="")
|
|
||||||
|
|
||||||
row = layout.row(align=True)
|
|
||||||
row.prop(bim_properties, "diff_old_file")
|
|
||||||
row.operator("bim.select_diff_old_file", icon="FILE_FOLDER", text="")
|
|
||||||
|
|
||||||
row = layout.row(align=True)
|
|
||||||
row.prop(bim_properties, "diff_new_file")
|
|
||||||
row.operator("bim.select_diff_new_file", icon="FILE_FOLDER", text="")
|
|
||||||
|
|
||||||
row = layout.row(align=True)
|
|
||||||
row.prop(bim_properties, "diff_relationships")
|
|
||||||
|
|
||||||
row = layout.row()
|
|
||||||
row.operator("bim.execute_ifc_diff")
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_patch(Panel):
|
class BIM_PT_patch(Panel):
|
||||||
bl_label = "IFC Patch"
|
bl_label = "IFC Patch"
|
||||||
bl_idname = "BIM_PT_patch"
|
bl_idname = "BIM_PT_patch"
|
||||||
|
|||||||
Reference in New Issue
Block a user