diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py index 7a3a195326..31c9113e61 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py @@ -12,6 +12,7 @@ class Usecase: "context": None, # IfcGeometricRepresentationContext "blender_object": None, # This is (currently) a Blender object, hence this depends on Blender now "geometry": None, # This is (currently) a Blender data object, hence this depends on Blender now + "coordinate_offset": None, # Optionally apply a vector offset to all coordinates "total_items": 1, # How many representation items to create "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different "should_force_faceted_brep": False, # If we should force faceted breps for meshes @@ -290,6 +291,8 @@ class Usecase: return self.file.createIfcCartesianPointList3D([self.convert_si_to_unit(v.co) for v in vertices]) def convert_si_to_unit(self, co): + if self.settings["coordinate_offset"]: + return (co / self.settings["unit_scale"]) + self.settings["coordinate_offset"] return co / self.settings["unit_scale"] def create_geometric_curve_set_representation(self, is_2d=False): diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py index fa50fa269b..ea51aeffc4 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py @@ -15,6 +15,7 @@ from blenderbim.bim import import_ifc from blenderbim.bim.module.geometry.data import Data from blenderbim.bim.module.context.data import Data as ContextData from blenderbim.bim.module.void.data import Data as VoidData +from mathutils import Vector def get_box_context_id(): @@ -91,10 +92,22 @@ class AddRepresentation(bpy.types.Operator): product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) context_of_items = self.file.by_id(context_id) + gprop = context.scene.BIMGeoreferenceProperties + coordinate_offset = None + if gprop.has_blender_offset and gprop.blender_offset_type == "CARTESIAN_POINT": + coordinate_offset = Vector( + ( + float(gprop.blender_eastings), + float(gprop.blender_northings), + float(gprop.blender_orthogonal_height), + ) + ) + representation_data = { "context": context_of_items, "blender_object": obj, "geometry": obj.data, + "coordinate_offset": coordinate_offset, "total_items": max(1, len(obj.material_slots)), "should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep, "should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation, @@ -307,10 +320,22 @@ class UpdateMeshRepresentation(bpy.types.Operator): old_representation = self.file.by_id(obj.data.BIMMeshProperties.ifc_definition_id) context_of_items = old_representation.ContextOfItems + gprop = context.scene.BIMGeoreferenceProperties + coordinate_offset = None + if gprop.has_blender_offset and gprop.blender_offset_type == "CARTESIAN_POINT": + coordinate_offset = Vector( + ( + float(gprop.blender_eastings), + float(gprop.blender_northings), + float(gprop.blender_orthogonal_height), + ) + ) + representation_data = { "context": context_of_items, "blender_object": obj, "geometry": obj.data, + "coordinate_offset": coordinate_offset, "total_items": max(1, len(obj.material_slots)), "should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep, "should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation, @@ -355,7 +380,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): obj.data.BIMMeshProperties.ifc_definition_id = int(new_representation.id()) obj.data.name = f"{old_representation.ContextOfItems.id()}/{new_representation.id()}" - bpy.ops.bim.remove_representation(ifc_definition_id=old_representation.id()) + bpy.ops.bim.remove_representation(representation_id=old_representation.id()) Data.load(obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py index c5e51360dc..ec99e71772 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py @@ -17,6 +17,8 @@ class Usecase: def unassign_product_representation(self, product, representation): representations = list(product.Representation.Representations or []) + if representation not in representations: + return representations.remove(representation) if not representations: self.file.remove(product.Representation)