From 3fa573e3c108d1706329a3d25991b3b6bbecfb08 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 20:48:38 +1000 Subject: [PATCH] Fix #4615. Report to user if they are attempting to create an incompatible context-representation combination. --- .../bim/module/geometry/operator.py | 29 ++++++++++++------- src/blenderbim/blenderbim/core/geometry.py | 9 +++++- .../api/geometry/add_representation.py | 22 +++++++------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index aacb218c2e..7458de0c87 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -149,6 +149,8 @@ class AddRepresentation(bpy.types.Operator, Operator): return ifc_context = tool.Ifc.get().by_id(ifc_context) + original_data = obj.data + if self.representation_conversion_method == "OUTLINE": if ifc_context.ContextType == "Plan": data = tool.Geometry.generate_outline_mesh(obj, axis="+Z") @@ -166,16 +168,23 @@ class AddRepresentation(bpy.types.Operator, Operator): data = tool.Geometry.generate_3d_box_mesh(obj) tool.Geometry.change_object_data(obj, data, is_global=True) - core.add_representation( - tool.Ifc, - tool.Geometry, - tool.Style, - tool.Surveyor, - obj=obj, - context=ifc_context, - ifc_representation_class=None, - profile_set_usage=None, - ) + try: + core.add_representation( + tool.Ifc, + tool.Geometry, + tool.Style, + tool.Surveyor, + obj=obj, + context=ifc_context, + ifc_representation_class=None, + profile_set_usage=None, + ) + except core.IncompatibleRepresentationError: + if obj.data != original_data: + tool.Geometry.change_object_data(obj, original_data, is_global=True) + bpy.data.meshes.remove(data) + self.report({"ERROR"}, "No compatible representation for the context could be created.") + return {"CANCELLED"} def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index 6226059ebb..6f34203b8a 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -47,7 +47,7 @@ def add_representation( data = geometry.get_object_data(obj) if not data and ifc_representation_class != "IfcTextLiteral": - return + raise IncompatibleRepresentationError() representation = ifc.run( "geometry.add_representation", @@ -63,6 +63,9 @@ def add_representation( profile_set_usage=profile_set_usage, ) + if not representation: + raise IncompatibleRepresentationError() + if geometry.is_body_representation(representation): [geometry.run_style_add_style(obj=mat) for mat in geometry.get_object_materials_without_styles(obj)] ifc.run( @@ -221,3 +224,7 @@ def edit_similar_opening_placement(geometry, opening=None, similar_openings=None old_placement = similar_opening.ObjectPlacement similar_opening.ObjectPlacement = opening.ObjectPlacement geometry.delete_opening_object_placement(old_placement) + + +class IncompatibleRepresentationError(Exception): + pass diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index fee0dc7dd1..aa98a15f3c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -352,12 +352,10 @@ class Usecase: ) def create_curve3d_representation(self): - return self.file.createIfcShapeRepresentation( - self.settings["context"], - self.settings["context"].ContextIdentifier, - "Curve3D", - self.create_curves(), - ) + if curves := self.create_curves(): + return self.file.createIfcShapeRepresentation( + self.settings["context"], self.settings["context"].ContextIdentifier, "Curve3D", curves + ) def create_curve2d_representation(self): return self.file.createIfcShapeRepresentation( @@ -425,7 +423,7 @@ class Usecase: results.append(self.file.createIfcSweptDiskSolid(curve, radius)) return results - def is_mesh_curve_consequtive(self, geom_data): + def is_mesh_curve_consecutive(self, geom_data): import blenderbim.tool as tool bm = tool.Blender.get_bmesh_for_mesh(geom_data) @@ -475,11 +473,11 @@ class Usecase: geom_data = self.settings["geometry"] if isinstance(geom_data, bpy.types.Mesh): - if self.is_mesh_curve_consequtive(geom_data): - if self.file.schema == "IFC2X3": - return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) - else: - return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + if not self.is_mesh_curve_consecutive(geom_data): + return + if self.file.schema == "IFC2X3": + return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) import blenderbim.tool as tool