From 567548c7f36f9062efcbff9562e95bec413f210d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Oct 2022 22:35:53 +1100 Subject: [PATCH] Fix bug where adding an opening didn't create a relative placement --- .../ifcopenshell/api/void/add_opening.py | 10 ++++++ .../test/api/void/test_add_opening.py | 34 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index 2f6e879535..8e0a53f613 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -44,3 +44,13 @@ class Usecase: "RelatedOpeningElement": self.settings["opening"], } ) + + placement = getattr(self.settings["opening"], "ObjectPlacement", None) + if placement and placement.is_a("IfcLocalPlacement"): + ifcopenshell.api.run( + "geometry.edit_object_placement", + self.file, + product=self.settings["opening"], + matrix=ifcopenshell.util.placement.get_local_placement(self.settings["opening"].ObjectPlacement), + is_si=False, + ) diff --git a/src/ifcopenshell-python/test/api/void/test_add_opening.py b/src/ifcopenshell-python/test/api/void/test_add_opening.py index 9121ae75af..357cc300fb 100644 --- a/src/ifcopenshell-python/test/api/void/test_add_opening.py +++ b/src/ifcopenshell-python/test/api/void/test_add_opening.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import numpy import test.bootstrap import ifcopenshell.api @@ -43,3 +44,36 @@ class TestAddOpening(test.bootstrap.IFC4): ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) assert not slab.HasOpenings assert wall.HasOpenings[0].RelatedOpeningElement == opening + + def test_assigning_an_opening_does_not_shift_object_placements(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + ifcopenshell.api.run("unit.assign_unit", self.file) + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + matrix1 = numpy.array( + ( + (1.0, 0.0, 0.0, 1.0), + (0.0, 1.0, 0.0, 1.0), + (0.0, 0.0, 1.0, 1.0), + (0.0, 0.0, 0.0, 1.0), + ) + ) + ifcopenshell.api.run( + "geometry.edit_object_placement", self.file, product=wall, matrix=matrix1.copy(), is_si=False + ) + ifcopenshell.api.run( + "geometry.edit_object_placement", self.file, product=opening, matrix=matrix1.copy(), is_si=False + ) + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + assert opening.ObjectPlacement.PlacementRelTo.PlacesObject[0] == wall + assert numpy.array_equal(ifcopenshell.util.placement.get_local_placement(opening.ObjectPlacement), matrix1) + + def test_not_updating_placement_if_placement_is_not_relative(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + ifcopenshell.api.run("unit.assign_unit", self.file) + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") + placement = self.file.createIfcGridPlacement() + opening.ObjectPlacement = placement + ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) + assert opening.ObjectPlacement == placement