diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py index bac0f6253d..0369587fc5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py @@ -17,6 +17,8 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api.pset +import ifcopenshell.util.element def remove_georeferencing(file: ifcopenshell.file) -> None: @@ -25,8 +27,7 @@ def remove_georeferencing(file: ifcopenshell.file) -> None: All georeferencing parameters such as projected CRS and map conversion data will be lost. - :return: None - :rtype: None + In IFC2X3, the psets will be removed from the IfcProject. Example: @@ -34,11 +35,17 @@ def remove_georeferencing(file: ifcopenshell.file) -> None: # Let's change our mind ifcopenshell.api.run("georeference.remove_georeferencing", model) """ - - map_conversion = file.by_type("IfcMapConversion")[0] - projected_crs = file.by_type("IfcProjectedCRS")[0] - if projected_crs.MapUnit and len(file.get_inverse(projected_crs.MapUnit)) == 1: - # TODO: go deeper for conversion units - file.remove(projected_crs.MapUnit) - file.remove(projected_crs) - file.remove(map_conversion) + if file.schema == "IFC2X3": + project = file.by_type("IfcProject")[0] + if pset := ifcopenshell.util.element.get_pset(project, "ePSet_ProjectedCRS"): + ifcopenshell.api.pset.remove_pset(file, project, file.by_id(pset["id"])) + if pset := ifcopenshell.util.element.get_pset(project, "ePSet_MapConversion"): + ifcopenshell.api.pset.remove_pset(file, project, file.by_id(pset["id"])) + return + for projected_crs in file.by_type("IfcProjectedCRS"): + if (unit := projected_crs.MapUnit) and len(file.get_inverse(unit)) == 1: + projected_crs.MapUnit = None + ifcopenshell.util.element.remove_deep2(file, unit) + file.remove(projected_crs) + for coordinate_operation in file.by_type("IfcCoordinateOperation"): + file.remove(coordinate_operation) diff --git a/src/ifcopenshell-python/test/api/georeference/test_remove_georeferencing.py b/src/ifcopenshell-python/test/api/georeference/test_remove_georeferencing.py new file mode 100644 index 0000000000..5befb17b99 --- /dev/null +++ b/src/ifcopenshell-python/test/api/georeference/test_remove_georeferencing.py @@ -0,0 +1,44 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api.root +import ifcopenshell.api.context +import ifcopenshell.api.georeference +import ifcopenshell.util.element + + +class TestRemoveGeoreferencing(test.bootstrap.IFC4): + def test_removing_georeferencing(self): + ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") + ifcopenshell.api.context.add_context(self.file, "Model") + ifcopenshell.api.georeference.add_georeferencing(self.file) + ifcopenshell.api.georeference.remove_georeferencing(self.file) + assert len(self.file.by_type("IfcMapConversion")) == 0 + assert len(self.file.by_type("IfcProjectedCRS")) == 0 + + +class TestAddGeoreferencingIFC2X3(test.bootstrap.IFC2X3): + def test_adding_georeferencing(self): + project = ifcopenshell.api.root.create_entity(self.file, ifc_class="IfcProject") + ifcopenshell.api.georeference.add_georeferencing(self.file) + ifcopenshell.api.georeference.remove_georeferencing(self.file) + conversion = ifcopenshell.util.element.get_pset(project, "ePSet_MapConversion", verbose=True) + crs = ifcopenshell.util.element.get_pset(project, "ePSet_ProjectedCRS", verbose=True) + assert not conversion + assert not crs