From 9b857cdefa01a0caa0e25eb912b6a3e6b4c707b2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 18 Aug 2023 00:03:46 +1000 Subject: [PATCH] Fix #3596. Fix bug where objects marked as edited were not unmarked after saving when toggling mode. Also fix bug where updating representation didn't check whether or not the meshlike representation has openings applied (which would bake the openings, instead of leaving them dynamic). --- src/blenderbim/blenderbim/bim/module/csv/operator.py | 11 ++++++----- .../blenderbim/bim/module/geometry/operator.py | 6 ++++++ src/blenderbim/blenderbim/bim/prop.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 1 + src/blenderbim/blenderbim/tool/ifc.py | 7 +++++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index 152c671f39..256193d9c8 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -16,14 +16,15 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . -import bpy -import ifccsv -import ifcopenshell import os -import logging +import bpy import json -import webbrowser +import ifccsv +import logging import tempfile +import webbrowser +import ifcopenshell +import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore from blenderbim.bim.handler import purge_module_data diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index cc3605b26d..8ac0e3c33a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -239,6 +239,10 @@ class UpdateRepresentation(bpy.types.Operator, Operator): product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) material = ifcopenshell.util.element.get_material(product, should_skip_usage=True) + if getattr(product, "HasOpenings", False) and obj.data.BIMMeshProperties.has_openings_applied: + # Meshlike things with openings can only be updated without openings applied. + return + if not product.is_a("IfcGridAxis"): tool.Geometry.clear_cache(product) @@ -1442,9 +1446,11 @@ class OverrideModeSetObject(bpy.types.Operator): self.reload_representation(obj) else: self.reload_representation(obj) + tool.Ifc.finish_edit(obj) for obj in self.unchanged_objs_with_openings: self.reload_representation(obj) + tool.Ifc.finish_edit(obj) return {"FINISHED"} def reload_representation(self, obj): diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 34b587d58d..d1dbc3445c 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -435,6 +435,7 @@ class BIMMeshProperties(PropertyGroup): ifc_definition_id: IntProperty(name="IFC Definition ID") ifc_boolean_id: IntProperty(name="IFC Boolean ID") obj: bpy.props.PointerProperty(type=bpy.types.Object) + has_openings_applied: BoolProperty(name="Has Openings Applied", default=True) is_native: BoolProperty(name="Is Native", default=False) is_swept_solid: BoolProperty(name="Is Swept Solid") is_parametric: BoolProperty(name="Is Parametric", default=False) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 47854d0668..6795def93d 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -460,6 +460,7 @@ class Geometry(blenderbim.core.tool.Geometry): mesh = ifc_importer.create_mesh(element, shape) ifc_importer.material_creator.load_existing_materials() ifc_importer.material_creator.create(element, obj, mesh) + mesh.BIMMeshProperties.has_openings_applied = apply_openings return mesh diff --git a/src/blenderbim/blenderbim/tool/ifc.py b/src/blenderbim/blenderbim/tool/ifc.py index b52da78d3a..247e3a5c66 100644 --- a/src/blenderbim/blenderbim/tool/ifc.py +++ b/src/blenderbim/blenderbim/tool/ifc.py @@ -146,6 +146,13 @@ class Ifc(blenderbim.core.tool.Ifc): def edit(cls, obj): IfcStore.edited_objs.add(obj) + @classmethod + def finish_edit(cls, obj): + try: + IfcStore.edited_objs.remove(obj) + except: + pass + @classmethod def resolve_uri(cls, uri): if os.path.isabs(uri):