From 49ea7748510855e49bf8f22f846d8ab8e61d92b3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 15 Mar 2021 20:32:47 +1100 Subject: [PATCH] Export auto syncs edited meshes if authoring mode enabled. See #1360. --- src/ifcblenderexport/blenderbim/bim/export_ifc.py | 14 +++++++++++++- src/ifcblenderexport/blenderbim/bim/handler.py | 4 ++-- src/ifcblenderexport/blenderbim/bim/ifc.py | 1 + .../blenderbim/bim/module/geometry/operator.py | 3 ++- .../blenderbim/bim/module/geometry/prop.py | 1 - .../blenderbim/bim/module/geometry/ui.py | 4 ---- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/ifcblenderexport/blenderbim/bim/export_ifc.py b/src/ifcblenderexport/blenderbim/bim/export_ifc.py index efabfcbdeb..7134b013c5 100644 --- a/src/ifcblenderexport/blenderbim/bim/export_ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/export_ifc.py @@ -20,6 +20,7 @@ class IfcExporter: self.set_header() if bpy.context.scene.BIMProjectProperties.is_authoring: self.sync_object_placements() + self.sync_edited_objects() extension = self.ifc_export_settings.output_file.split(".")[-1] if extension == "ifczip": with tempfile.TemporaryDirectory() as unzipped_path: @@ -45,7 +46,8 @@ class IfcExporter: with open(self.ifc_export_settings.output_file, "w") as outfile: json.dump(jsonData, outfile, indent=None if self.ifc_export_settings.json_compact else 4) if bpy.context.scene.BIMProjectProperties.is_authoring: - bpy.ops.wm.save_mainfile() + if bpy.data.filepath: + bpy.ops.wm.save_mainfile() def set_header(self): # TODO: add all metadata, pending bug #747 @@ -80,6 +82,16 @@ class IfcExporter: except: pass + def sync_edited_objects(self): + for obj_name in IfcStore.edited_objs.copy(): + obj = bpy.data.objects.get(obj_name) + if not obj: + continue + representation = IfcStore.get_file().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + if representation.RepresentationType == "Tessellation" or representation.RepresentationType == "Brep": + bpy.ops.bim.update_mesh_representation(obj=obj.name) + IfcStore.edited_objs.clear() + def sync_object_placement(self, obj): blender_matrix = np.matrix(obj.matrix_world) ifc_matrix = ifcopenshell.util.placement.get_local_placement( diff --git a/src/ifcblenderexport/blenderbim/bim/handler.py b/src/ifcblenderexport/blenderbim/bim/handler.py index 3f874c87bc..3bbd503a28 100644 --- a/src/ifcblenderexport/blenderbim/bim/handler.py +++ b/src/ifcblenderexport/blenderbim/bim/handler.py @@ -12,12 +12,12 @@ def mode_callback(obj, data): or not obj.data or not isinstance(obj.data, bpy.types.Mesh) or not obj.data.BIMMeshProperties.ifc_definition_id - or not bpy.context.scene.BIMGeometryProperties.should_auto_update_mesh_representations + or not bpy.context.scene.BIMProjectProperties.is_authoring ): return representation = IfcStore.get_file().by_id(obj.data.BIMMeshProperties.ifc_definition_id) if representation.RepresentationType == "Tessellation" or representation.RepresentationType == "Brep": - bpy.ops.bim.update_mesh_representation(obj=obj.name) + IfcStore.edited_objs.add(obj.name) def name_callback(obj, data): diff --git a/src/ifcblenderexport/blenderbim/bim/ifc.py b/src/ifcblenderexport/blenderbim/bim/ifc.py index b58c3a388e..371e05e51b 100644 --- a/src/ifcblenderexport/blenderbim/bim/ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/ifc.py @@ -9,6 +9,7 @@ class IfcStore: schema = None id_map = {} guid_map = {} + edited_objs = set() pset_template_path = "" pset_template_file = None diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py index 8fec09a106..6119164df7 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py @@ -38,12 +38,12 @@ class EditObjectPlacement(bpy.types.Operator): self.file = IfcStore.get_file() # TODO: determine how to deal with this module dependency props = bpy.context.scene.BIMGeoreferenceProperties - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) for obj in objs: if not obj.BIMObjectProperties.ifc_definition_id: continue matrix = np.array(obj.matrix_world) if props.has_blender_offset and props.blender_offset_type == "OBJECT_PLACEMENT": + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) # TODO: np.array? Why not matrix? matrix = np.array( ifcopenshell.util.geolocation.local2global( @@ -306,6 +306,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): for obj in objs: self.update_obj_mesh_representation(context, obj) + IfcStore.edited_objs.discard(obj.name) return {"FINISHED"} def update_obj_mesh_representation(self, context, obj): diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py index ee6649aec7..983754d987 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py @@ -14,7 +14,6 @@ from bpy.props import ( class BIMGeometryProperties(PropertyGroup): - should_auto_update_mesh_representations: BoolProperty(name="Should Auto Update Representations", default=False) # Revit workaround should_use_presentation_style_assignment: BoolProperty(name="Force Presentation Style Assignment", default=False) # RIB iTwo, DESITE BIM workaround diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py index 62031bd38b..99e1c482cf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py @@ -66,10 +66,6 @@ class BIM_PT_mesh(Panel): layout = self.layout props = context.active_object.data.BIMMeshProperties - sprops = context.scene.BIMGeometryProperties - row = self.layout.row() - row.prop(sprops, "should_auto_update_mesh_representations") - row = layout.row(align=True) op = row.operator("bim.switch_representation", text="Bake Voids", icon="SELECT_SUBTRACT") op.ifc_definition_id = props.ifc_definition_id