From 78759a63f24ad041ead5f6e2ecdacfe0497e1547 Mon Sep 17 00:00:00 2001 From: Richard Brice <37087370+RickBrice@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:29:28 -0700 Subject: [PATCH] Updates helmert curve business2geometry mapping (again) --- .../_map_alignment_horizontal_segment.py | 19 +++++++++++++++++-- .../test_map_alignment_horizontal_segment.py | 16 ++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py index 44e2c70110..3a958ef966 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py +++ b/src/ifcopenshell-python/ifcopenshell/api/alignment/_map_alignment_horizontal_segment.py @@ -262,8 +262,8 @@ def _map_helmert_curve(file: ifcopenshell.file, design_parameters: entity_instan type="IfcAxis2Placement2D", Location=file.createIfcCartesianPoint( ( - start_point.Coordinates[0] + x1 * math.cos(start_direction) + y1 * math.sin(start_direction), - start_point.Coordinates[1] + x1 * math.sin(start_direction) - y1 * math.cos(start_direction), + start_point.Coordinates[0] + x1 * math.cos(start_direction) - y1 * math.sin(start_direction), + start_point.Coordinates[1] + x1 * math.sin(start_direction) + y1 * math.cos(start_direction), ) ), RefDirection=file.createIfcDirection( @@ -275,6 +275,21 @@ def _map_helmert_curve(file: ifcopenshell.file, design_parameters: entity_instan ParentCurve=parent_curve2, ) + import numpy as np + settings = ifcopenshell.geom.settings() + prev_segment_fn = ifcopenshell_wrapper.map_shape(settings, curve_segment1.wrapped_data) + prev_segment_evaluator = ifcopenshell_wrapper.function_item_evaluator(settings, prev_segment_fn) + e = prev_segment_evaluator.evaluate(prev_segment_fn.end()) + end = np.array(e) + + segment_fn = ifcopenshell_wrapper.map_shape(settings, curve_segment2.wrapped_data) + segment_evaluator = ifcopenshell_wrapper.function_item_evaluator(settings, segment_fn) + s = segment_evaluator.evaluate(segment_fn.start()) + start = np.array(s) + + assert(np.allclose(end[:3,3],start[:3,3])) + + return curve_segment1, curve_segment2 diff --git a/src/ifcopenshell-python/test/api/alignment/test_map_alignment_horizontal_segment.py b/src/ifcopenshell-python/test/api/alignment/test_map_alignment_horizontal_segment.py index 03cae4f87d..ed2eca6889 100644 --- a/src/ifcopenshell-python/test/api/alignment/test_map_alignment_horizontal_segment.py +++ b/src/ifcopenshell-python/test/api/alignment/test_map_alignment_horizontal_segment.py @@ -1214,7 +1214,7 @@ def _HelmertCurve_100_0_300_1000_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(300.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.7998035122387, -3.91603145329256)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.7998035122387, 3.91603145329256)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.9892460407218963, 0.146260968532457) ) @@ -1262,7 +1262,7 @@ def _HelmertCurve_100_0__300__1000_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(-300.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.7998035122387, 3.91603145329256)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.7998035122387, -3.91603145329256)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.9892460407218963, -0.146260968532457) ) @@ -1310,7 +1310,7 @@ def _HelmertCurve_100_0_300_inf_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(300.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.8122545525202, -3.81263503030693)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.8122545525202, 3.81263503030693)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.9904138664989948, 0.1381317235341378) ) @@ -1358,7 +1358,7 @@ def _HelmertCurve_100_0__300__inf_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(-300.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.8122545525202, 3.81263503030693)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.8122545525202, -3.81263503030693)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.9904138664989948, -0.1381317235341378) ) @@ -1406,7 +1406,7 @@ def _HelmertCurve_100_0_1000_300_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(1000.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9681012468824, -1.49252747074135)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9681012468824, 1.49252747074135)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.997594495159641, 0.0693197174487962) ) @@ -1454,7 +1454,7 @@ def _HelmertCurve_100_0__1000__300_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(-1000.0) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9681012468824, 1.49252747074135)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9681012468824, -1.49252747074135)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.997594495159641, -0.0693197174487962) ) @@ -1502,7 +1502,7 @@ def _HelmertCurve_100_0_inf_300_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(None) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9972443634885, -0.347204361427475)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9972443634885, 0.347204361427475)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.999614222337484, 0.027769614722351524) ) @@ -1550,7 +1550,7 @@ def _HelmertCurve_100_0__inf__300_1_Meter(file): assert mapped_segment.ParentCurve.ConstantTerm == pytest.approx(None) mapped_segment = mapped_segments[1] assert "DISCONTINUOUS" == mapped_segment.Transition - assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9972443634885, 0.347204361427475)) + assert mapped_segment.Placement.Location.Coordinates == pytest.approx((49.9972443634885, -0.347204361427475)) assert mapped_segment.Placement.RefDirection.DirectionRatios == pytest.approx( (0.999614222337484, -0.027769614722351524) )