From 13d434c00fa77d5f399118008704a28db6883bdd Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 Apr 2020 09:48:52 +1000 Subject: [PATCH] Fix incorrect OffsetObjectPlacement patch when coordinates or directions are recycled --- .../recipes/OffsetObjectPlacements.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ifcpatch/recipes/OffsetObjectPlacements.py b/src/ifcpatch/recipes/OffsetObjectPlacements.py index dcac934671..697c9d2e4d 100644 --- a/src/ifcpatch/recipes/OffsetObjectPlacements.py +++ b/src/ifcpatch/recipes/OffsetObjectPlacements.py @@ -24,23 +24,35 @@ class Patcher: placement.RelativePlacement.Location.Coordinates[2] + float(self.args[2]) ) + relative_placement = self.file.createIfcAxis2Placement3D( + self.file.createIfcCartesianPoint(offset_location)) + + if placement.RelativePlacement.Axis: + relative_placement.Axis = placement.RelativePlacement.Axis + if placement.RelativePlacement.RefDirection: + relative_placement.RefDirection = placement.RelativePlacement.RefDirection + angle = float(self.args[3]) if not angle: - placement.RelativePlacement.Location.Coordinates = offset_location + placement.RelativePlacement = relative_placement continue rotation_matrix = self.z_rotation_matrix(math.radians(angle)) - placement.RelativePlacement.Location.Coordinates = self.multiply_by_matrix(offset_location, rotation_matrix) + relative_placement.Location.Coordinates = self.multiply_by_matrix(offset_location, rotation_matrix) if placement.RelativePlacement.Axis: z_axis = placement.RelativePlacement.Axis.DirectionRatios - placement.RelativePlacement.Axis.DirectionRatios = self.multiply_by_matrix(z_axis, rotation_matrix) + relative_placement.Axis = self.file.createIfcDirection( + self.multiply_by_matrix(z_axis, rotation_matrix)) if placement.RelativePlacement.RefDirection: x_axis = placement.RelativePlacement.RefDirection.DirectionRatios - placement.RelativePlacement.RefDirection.DirectionRatios = self.multiply_by_matrix(x_axis, rotation_matrix) else: - x_axis = self.file.createIfcDirection(self.multiply_by_matrix((1., 0., 0.), rotation_matrix)) + x_axis = (1., 0., 0.) + relative_placement.RefDirection = self.file.createIfcDirection( + self.multiply_by_matrix(x_axis, rotation_matrix)) + + placement.RelativePlacement = relative_placement def get_absolute_placement(self, object_placement): if object_placement.PlacementRelTo: