From fdcafa98b304038fba3dfd1109cf2f0c6a98892b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 15 May 2021 12:06:44 +1000 Subject: [PATCH] Continued grid bugfixing, especially related to export-time syncing. --- src/blenderbim/blenderbim/bim/export_ifc.py | 11 +++++++---- src/blenderbim/blenderbim/bim/handler.py | 9 ++++++--- .../blenderbim/bim/module/geometry/operator.py | 18 +----------------- .../ifcopenshell/api/grid/create_axis_curve.py | 6 ++++-- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/export_ifc.py b/src/blenderbim/blenderbim/bim/export_ifc.py index c0de745658..348c44dde8 100644 --- a/src/blenderbim/blenderbim/bim/export_ifc.py +++ b/src/blenderbim/blenderbim/bim/export_ifc.py @@ -98,9 +98,7 @@ class IfcExporter: 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) + bpy.ops.bim.update_mesh_representation(obj=obj.name) IfcStore.edited_objs.clear() def sync_object_placement(self, obj): @@ -136,7 +134,11 @@ class IfcExporter: elif element.is_a("IfcContext"): return - if (element.is_a("IfcElement") and element_collection) or element.is_a("IfcSpatialStructureElement"): + if ( + (element.is_a("IfcElement") and element_collection) + or element.is_a("IfcSpatialStructureElement") + or element.is_a("IfcGrid") + ): try: parent_collection = [c for c in bpy.data.collections if c.children.get(element_collection.name)][0] except: @@ -144,6 +146,7 @@ class IfcExporter: else: parent_collection = obj.users_collection[0] + parent_obj = bpy.data.objects.get(parent_collection.name) if not parent_obj or not parent_obj.BIMObjectProperties.ifc_definition_id: return diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 111f2d83c0..6050f70353 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -15,12 +15,15 @@ def mode_callback(obj, data): obj.mode != "EDIT" or not obj.data or not isinstance(obj.data, bpy.types.Mesh) - or not obj.data.BIMMeshProperties.ifc_definition_id + or not obj.BIMObjectProperties.ifc_definition_id 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": + if obj.data.BIMMeshProperties.ifc_definition_id: + representation = IfcStore.get_file().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + if representation.RepresentationType == "Tessellation" or representation.RepresentationType == "Brep": + IfcStore.edited_objs.add(obj.name) + elif IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id).is_a("IfcGridAxis"): IfcStore.edited_objs.add(obj.name) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 3c41163b54..88b231c13c 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -73,6 +73,7 @@ class AddRepresentation(bpy.types.Operator): if obj.data: product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) + context_id = self.context_id or int(bpy.context.scene.BIMProperties.contexts) context_of_items = self.file.by_id(context_id) @@ -356,23 +357,6 @@ class UpdateMeshRepresentation(bpy.types.Operator): new_representation = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) - # if product.is_a("IfcWall"): - # # Generate axis representation - # axis_context_id = get_context_id("Model", "Axis", "MODEL_VIEW") - # old_axis = ifcopenshell.util.element.get_representation(product, "Model", "Axis", "MODEL_VIEW") - # if ( - # axis_context_id - # and old_axis - # and context_of_items.ContextType == "Model" - # and context_of_items.ContextIdentifier - # and context_of_items.ContextIdentifier == "Body" - # ): - # has_axis_generator = False - # if has_axis_generator: - # # TODO, just pseudocode for now - # representation_data["geometry"] = axis_generator_function_call - # pass - box_context_id = get_context_id("Model", "Box", "MODEL_VIEW") old_box = ifcopenshell.util.element.get_representation(product, "Model", "Box", "MODEL_VIEW") if ( diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py index 9de1815b3e..caa3f3a04e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py @@ -15,8 +15,10 @@ class Usecase: self.settings[key] = value def execute(self): - if self.settings["grid_axis"].AxisCurve: - ifcopenshell.util.element.remove_deep(self.file, self.settings["grid_axis"].AxisCurve) + existing_curve = self.settings["grid_axis"].AxisCurve + if existing_curve and len(self.file.get_inverse(existing_curve)) == 1: + ifcopenshell.util.element.remove_deep(self.file, existing_curve) + self.file.remove(existing_curve) self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) grid = [i for i in self.file.get_inverse(self.settings["grid_axis"]) if i.is_a("IfcGrid")][0]