From 419901649ea613cb5a5411d6f514210d5c14d1dc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 1 Jun 2022 14:25:30 +1000 Subject: [PATCH] You can now configure the distance limit for false origin offsets --- src/blenderbim/blenderbim/bim/import_ifc.py | 28 +++++++++++-------- .../blenderbim/bim/module/project/prop.py | 8 +++--- .../blenderbim/bim/module/project/ui.py | 4 +-- .../test/bim/feature/project.feature | 6 ++-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 72dae171be..c09f51b81e 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -270,7 +270,9 @@ class IfcImporter: def is_point_far_away(self, point, is_meters=True): # Locations greater than 1km are not considered "small sites" according to the georeferencing guide - limit = 1000 if is_meters else (1000 / self.unit_scale) + # Users can configure this if they have to handle larger sites but beware of surveying precision + limit = self.ifc_import_settings.distance_limit + limit = limit if is_meters else (limit / self.unit_scale) coords = point if hasattr(point, "Coordinates"): coords = point.Coordinates @@ -392,7 +394,7 @@ class IfcImporter: props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: return - if self.ifc_import_settings.should_offset_model: + if self.ifc_import_settings.false_origin: return self.set_manual_blender_offset() if self.file.schema == "IFC2X3": project = self.file.by_type("IfcProject")[0] @@ -408,9 +410,9 @@ class IfcImporter: def set_manual_blender_offset(self): props = bpy.context.scene.BIMGeoreferenceProperties - props.blender_eastings = str(self.ifc_import_settings.model_offset_coordinates[0]) - props.blender_northings = str(self.ifc_import_settings.model_offset_coordinates[1]) - props.blender_orthogonal_height = str(self.ifc_import_settings.model_offset_coordinates[2]) + props.blender_eastings = str(self.ifc_import_settings.false_origin[0]) + props.blender_northings = str(self.ifc_import_settings.false_origin[1]) + props.blender_orthogonal_height = str(self.ifc_import_settings.false_origin[2]) props.has_blender_offset = True def guess_georeferencing(self, element): @@ -1868,8 +1870,8 @@ class IfcImportSettings: self.should_clean_mesh = True self.deflection_tolerance = 0.001 self.angular_tolerance = 0.5 - self.should_offset_model = False - self.model_offset_coordinates = (0, 0, 0) + self.distance_limit = 1000 + self.false_origin = None self.has_filter = None self.should_filter_spatial_elements = True self.elements = set() @@ -1893,10 +1895,12 @@ class IfcImportSettings: settings.should_clean_mesh = props.should_clean_mesh settings.deflection_tolerance = props.deflection_tolerance settings.angular_tolerance = props.angular_tolerance - settings.should_offset_model = props.should_offset_model - settings.model_offset_coordinates = ( - [float(o) for o in props.model_offset_coordinates.split(",")] - if props.model_offset_coordinates - else (0, 0, 0) + settings.distance_limit = props.distance_limit + settings.false_origin = ( + [float(o) for o in props.false_origin.split(",")] + if props.false_origin + else None ) + if settings.false_origin == [0, 0, 0]: + settings.false_origin = None return settings diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index fe49738432..6e3d3e1f7b 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -132,10 +132,10 @@ class BIMProjectProperties(PropertyGroup): should_merge_by_material: BoolProperty(name="Import and Merge by Material", default=False) should_merge_materials_by_colour: BoolProperty(name="Import and Merge Materials by Colour", default=False) should_clean_mesh: BoolProperty(name="Import and Clean Mesh", default=True) - deflection_tolerance: FloatProperty(name="Import Deflection Tolerance", default=0.001) - angular_tolerance: FloatProperty(name="Import Angular Tolerance", default=0.5) - should_offset_model: BoolProperty(name="Import and Offset Model", default=False) - model_offset_coordinates: StringProperty(name="Model Offset Coordinates", default="0,0,0") + deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.001) + angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5) + distance_limit: FloatProperty(name="Distance Limit", default=1000) + false_origin: StringProperty(name="False Origin", default="0,0,0") links: CollectionProperty(name="Links", type=Link) active_link_index: IntProperty(name="Active Link Index") export_schema: EnumProperty(items=get_export_schema, name="IFC Schema") diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index e90c818113..0a6b668fda 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -82,9 +82,9 @@ class BIM_PT_project(Panel): row = self.layout.row() row.prop(pprops, "angular_tolerance") row = self.layout.row() - row.prop(pprops, "should_offset_model") + row.prop(pprops, "distance_limit") row = self.layout.row() - row.prop(pprops, "model_offset_coordinates") + row.prop(pprops, "false_origin") row = self.layout.row(align=True) row.operator("bim.load_project_elements") diff --git a/src/blenderbim/test/bim/feature/project.feature b/src/blenderbim/test/bim/feature/project.feature index f88e918f94..1fbddce925 100644 --- a/src/blenderbim/test/bim/feature/project.feature +++ b/src/blenderbim/test/bim/feature/project.feature @@ -269,16 +269,14 @@ Scenario: Load project elements - load with the spatial decomposition collection Scenario: Load project elements - manual offset of object placements Given an empty Blender session And I press "bim.load_project(filepath='{cwd}/test/files/manual-geolocation.ifc', is_advanced=True)" - When I set "scene.BIMProjectProperties.should_offset_model" to "True" - And I set "scene.BIMProjectProperties.model_offset_coordinates" to "268388500, 5774506000, 21900" + When I set "scene.BIMProjectProperties.false_origin" to "268388500, 5774506000, 21900" And I press "bim.load_project_elements" Then the object "IfcPlate/1780 x 270 PRECAST WALL" is at "0,0,0" Scenario: Load project elements - manual offset of cartesian points Given an empty Blender session And I press "bim.load_project(filepath='{cwd}/test/files/manual-geolocation-coords.ifc', is_advanced=True)" - When I set "scene.BIMProjectProperties.should_offset_model" to "True" - And I set "scene.BIMProjectProperties.model_offset_coordinates" to "1990711,5971553,22700" + When I set "scene.BIMProjectProperties.false_origin" to "1990711,5971553,22700" And I press "bim.load_project_elements" Then the object "IfcBuildingElementProxy/NAME" is at "0,0,0"