From 73045b7aaf1fab975e5abc2418c85bc61abf2622 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Mon, 2 Dec 2024 09:51:58 -0500 Subject: [PATCH 1/4] fixes continuity calculations for segments on vertical and cant alignment representations The length of each segment corresponds to the total length along the parent curve. However, for continuity calculations, we need to provide the total length along the *base* curve. (IVS-282) --- features/steps/utils/geometry.py | 37 ++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/features/steps/utils/geometry.py b/features/steps/utils/geometry.py index cb60f3f5..eb009bb9 100644 --- a/features/steps/utils/geometry.py +++ b/features/steps/utils/geometry.py @@ -190,20 +190,29 @@ class AlignmentSegmentContinuityCalculation: def _calculate_positions(self) -> None: - u = abs(self.previous_segment.SegmentLength.wrappedValue) * self.length_unit_scale_factor - # for linear segments on vertical alignments (IfcGradientCurve) and cant alignments (IfcSegmentedReferenceCurve) - # we need to project the total segment length to the x-axis, i.e. the "distance along" axis - if self.previous_segment.ParentCurve.is_a().upper() == "IFCLINE": - if (self.previous_segment.UsingCurves[0].is_a().upper() == "IFCGRADIENTCURVE" ) or ( - self.previous_segment.UsingCurves[0].is_a().upper() == "IFCSEGMENTEDREFERENCECURVE"): - # ensure direction ratios have been normalized - x_comp, y_comp = self.previous_segment.Placement.RefDirection.DirectionRatios - divisor = math.sqrt(x_comp ** 2 + y_comp ** 2) - x_comp /= divisor - y_comp /= divisor - # adjust u so that it is based on the total "distance along" of the segment, - # not the total length of the segment (which includes an additional amount for the change in elevation) - u *= x_comp + alignment_rep_type = self.previous_segment.UsingCurves[0].is_a().upper() + match alignment_rep_type: + case "IFCCOMPOSITECURVE": + # Horizontal representation - use the SegmentLength directly + u = abs(self.previous_segment.SegmentLength.wrappedValue) + case "IFCGRADIENTCURVE" | "IFCSEGMENTEDREFERENCECURVE": + # for vertical and cant representations (IfcGradientCurve and IfcSegmentedReferenceCurve), + # u should be the total distance traversed by the segment along the base curve + # (length of the segment projected to the "Distance Along" x-axis). + # The actual distance along the parent curve (e.g. IfcLine, IfcCircle, IfcPolynomialCurve, etc.) will be longer. + # Therefore we will get the projected distance based on the placements of the two segments. + u = self.segment_to_analyze.Placement.Location.Coordinates[0] - self.previous_segment.Placement.Location.Coordinates[0] + case _: + # IfcCurveSegment can only be used with these three representation entities, + # so this case should never be reached. + # If it is reached, the gherkin rule should fail. + # Using a length of 0.0 will force a comparison of the start of the previous segment to the start of the following segment + # which should always return a failing result. + u = 0.0 + + # for all cases, adjust from model units to SI units for ifcopenshell calc + u *= self.length_unit_scale_factor + prev_end_transform = evaluate_segment(segment=self.previous_segment, dist_along=u) current_start_transform = evaluate_segment(segment=self.segment_to_analyze, dist_along=0.0) From 2ddd2452758b31e1c2a2ea66f70d8716107eb13e Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Wed, 4 Dec 2024 00:27:41 -0500 Subject: [PATCH 2/4] bump ifcos version; correct the data in unit test file --- .github/workflows/ci.yml | 2 +- ...cenario02-imperial_break_in_direction_angle.ifc | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2e1ee16..81f57ecb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies run: | pip install behave pytest tabulate pyparsing sqlalchemy numpy pydantic pydot sqlalchemy_utils django python-dotenv deprecated pandas pyspellchecker rtree - wget -O /tmp/ifcopenshell_python.zip https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-`python3 -c 'import sys;print("".join(map(str, sys.version_info[0:2])))'`-v0.8.1-0267e2b-linux64.zip + wget -O /tmp/ifcopenshell_python.zip https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-`python3 -c 'import sys;print("".join(map(str, sys.version_info[0:2])))'`-v0.8.1-eadf35f-linux64.zip mkdir -p `python3 -c 'import site; print(site.getusersitepackages())'` unzip -d `python3 -c 'import site; print(site.getusersitepackages())'` /tmp/ifcopenshell_python.zip - name: Lint with flake8 diff --git a/test/files/als017/fail-als017-scenario02-imperial_break_in_direction_angle.ifc b/test/files/als017/fail-als017-scenario02-imperial_break_in_direction_angle.ifc index ec79c60b..cf7706d9 100644 --- a/test/files/als017/fail-als017-scenario02-imperial_break_in_direction_angle.ifc +++ b/test/files/als017/fail-als017-scenario02-imperial_break_in_direction_angle.ifc @@ -19,7 +19,7 @@ DATA; #12=IFCDIRECTION((0.,0.,1.)); #13=IFCDIRECTION((1.,0.,0.)); #14=IFCAXIS2PLACEMENT3D(#11,#12,#13); -#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-02,#14,$); +#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-04,#14,$); #16=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#15,$,.MODEL_VIEW.,$); #17=IFCCARTESIANPOINT((0.,0.,0.)); #18=IFCAXIS2PLACEMENT3D(#17,$,$); @@ -124,7 +124,7 @@ DATA; #117=IFCLINE(#114,#116); #118=IFCDIRECTION((0.999846863274572,0.0175)); #119=IFCAXIS2PLACEMENT2D(#104,#118); -#120=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#119,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.),#117); +#120=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#119,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.1837359),#117); #121=IFCALIGNMENTVERTICALSEGMENT($,$,0.,1200.,100.,0.0175,0.0175,$,.CONSTANTGRADIENT.); #122=IFCALIGNMENTSEGMENT('0XlKtmjWP31vWH3pMFVFZ0',$,$,$,$,#19,#225,#121); #123=IFCCARTESIANPOINT((0.,0.)); @@ -142,7 +142,7 @@ DATA; #135=IFCLINE(#132,#134); #136=IFCDIRECTION((0.999949998749938,-0.01)); #137=IFCAXIS2PLACEMENT2D(#106,#136); -#138=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#137,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.),#135); +#138=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#137,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.0799980),#135); #139=IFCALIGNMENTVERTICALSEGMENT($,$,2800.,1600.,127.,-0.01,-0.01,$,.CONSTANTGRADIENT.); #140=IFCALIGNMENTSEGMENT('3L5Oy3T4b7WhE4BOy1vRNB',$,$,$,$,#19,#229,#139); #141=IFCCARTESIANPOINT((0.,0.)); @@ -160,7 +160,7 @@ DATA; #153=IFCLINE(#150,#152); #154=IFCDIRECTION((0.999799979995999,0.02)); #155=IFCAXIS2PLACEMENT2D(#108,#154); -#156=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#155,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.),#153); +#156=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#155,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.1599870),#153); #157=IFCALIGNMENTVERTICALSEGMENT($,$,5600.,800.,117.,0.02,0.02,$,.CONSTANTGRADIENT.); #158=IFCALIGNMENTSEGMENT('1CTHPAShTEheZJuik5XMM7',$,$,$,$,#19,#233,#157); #159=IFCCARTESIANPOINT((0.,0.)); @@ -178,7 +178,7 @@ DATA; #171=IFCLINE(#168,#170); #172=IFCDIRECTION((0.999799979995999,-0.02)); #173=IFCAXIS2PLACEMENT2D(#110,#172); -#174=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#173,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1000.),#171); +#174=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#173,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1000.1999800),#171); #175=IFCALIGNMENTVERTICALSEGMENT($,$,8400.,1000.,133.,-0.02,-0.02,$,.CONSTANTGRADIENT.); #176=IFCALIGNMENTSEGMENT('0QLhiodhHADRBlFR0cDN18',$,$,$,$,#19,#237,#175); #177=IFCCARTESIANPOINT((0.,0.)); @@ -196,14 +196,14 @@ DATA; #189=IFCLINE(#186,#188); #190=IFCDIRECTION((0.999987499921874,-0.005)); #191=IFCAXIS2PLACEMENT2D(#112,#190); -#192=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#191,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2600.),#189); +#192=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#191,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2600.0324998),#189); #193=IFCALIGNMENTVERTICALSEGMENT($,$,10200.,2600.,103.,-0.005,-0.005,$,.CONSTANTGRADIENT.); #194=IFCALIGNMENTSEGMENT('1i9TFEUQb2Wfq8uoDmHMoN',$,$,$,$,#19,#241,#193); #195=IFCCARTESIANPOINT((0.,0.)); #196=IFCDIRECTION((1.,0.)); #197=IFCVECTOR(#196,1.); #198=IFCLINE(#195,#197); -#199=IFCDIRECTION((0.999987499921874,-0.005)); +#199=IFCDIRECTION((1.,0.)); #200=IFCAXIS2PLACEMENT2D(#113,#199); #201=IFCCURVESEGMENT(.DISCONTINUOUS.,#200,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(0.),#198); #202=IFCALIGNMENTVERTICALSEGMENT($,$,12800.,0.,90.,-0.005,-0.005,$,.CONSTANTGRADIENT.); From 273f8e9bcc16389064ede5de34ac081bd303221a Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Sun, 8 Dec 2024 22:26:57 -0500 Subject: [PATCH 3/4] use correct values for calculating end gradient (IVS-282) --- features/steps/utils/geometry.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/features/steps/utils/geometry.py b/features/steps/utils/geometry.py index eb009bb9..3b2417e6 100644 --- a/features/steps/utils/geometry.py +++ b/features/steps/utils/geometry.py @@ -188,8 +188,10 @@ class AlignmentSegmentContinuityCalculation: current_start_direction: float = None current_start_gradient: float = None - def _calculate_positions(self) -> None: - + def _get_u_at_end(self): + """ + Get the value of u corresponding to the end of the previous segment + """ alignment_rep_type = self.previous_segment.UsingCurves[0].is_a().upper() match alignment_rep_type: case "IFCCOMPOSITECURVE": @@ -200,20 +202,21 @@ def _calculate_positions(self) -> None: # u should be the total distance traversed by the segment along the base curve # (length of the segment projected to the "Distance Along" x-axis). # The actual distance along the parent curve (e.g. IfcLine, IfcCircle, IfcPolynomialCurve, etc.) will be longer. - # Therefore we will get the projected distance based on the placements of the two segments. - u = self.segment_to_analyze.Placement.Location.Coordinates[0] - self.previous_segment.Placement.Location.Coordinates[0] + # Therefore, we will get the projected distance based on the placements of the two segments. + u = abs(self.segment_to_analyze.Placement.Location.Coordinates[0] - \ + self.previous_segment.Placement.Location.Coordinates[0]) case _: - # IfcCurveSegment can only be used with these three representation entities, - # so this case should never be reached. + # This case should never be reached. # If it is reached, the gherkin rule should fail. # Using a length of 0.0 will force a comparison of the start of the previous segment to the start of the following segment # which should always return a failing result. u = 0.0 # for all cases, adjust from model units to SI units for ifcopenshell calc - u *= self.length_unit_scale_factor + return u * self.length_unit_scale_factor - prev_end_transform = evaluate_segment(segment=self.previous_segment, dist_along=u) + def _calculate_positions(self) -> None: + prev_end_transform = evaluate_segment(segment=self.previous_segment, dist_along=self._get_u_at_end()) current_start_transform = evaluate_segment(segment=self.segment_to_analyze, dist_along=0.0) e0 = prev_end_transform[3][0] / self.length_unit_scale_factor @@ -225,8 +228,7 @@ def _calculate_positions(self) -> None: self.current_start_point = (s0, s1) def _calculate_directions(self) -> None: - u = abs(float(self.previous_segment.SegmentLength.wrappedValue)) * self.length_unit_scale_factor - prev_end_transform = evaluate_segment(segment=self.previous_segment, dist_along=u) + prev_end_transform = evaluate_segment(segment=self.previous_segment, dist_along=self._get_u_at_end()) current_start_transform = evaluate_segment(segment=self.segment_to_analyze, dist_along=0.0) prev_i = prev_end_transform[0][0] From 3f65633f8d7be02f272d103959227c7070c0fd5d Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Sun, 26 Jan 2025 00:41:48 -0500 Subject: [PATCH 4/4] refactor geometry calculations and update IFC test files. Updated to current geometry evaluation methods for alignment segments. Adjusted IFC test files to reflect corrections to direction vectors and parabolic segment lengths. Updated CI pipeline to use the latest IfcOpenShell build. (IVS-282) --- .github/workflows/ci.yml | 2 +- features/steps/utils/geometry.py | 33 +++++-------------- ...-als017-scenario01-imperial_continuous.ifc | 30 ++++++++--------- ...017-scenario02-imperial_not_applicable.ifc | 30 ++++++++--------- 4 files changed, 40 insertions(+), 55 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 509da211..8a2d53c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies run: | pip install behave pytest tabulate pyparsing sqlalchemy numpy pydantic pydot sqlalchemy_utils django python-dotenv deprecated pandas pyspellchecker rtree lark-parser networkx mpmath - wget -O /tmp/ifcopenshell_python.zip https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-`python3 -c 'import sys;print("".join(map(str, sys.version_info[0:2])))'`-v0.8.1-1d27161-linux64.zip + wget -O /tmp/ifcopenshell_python.zip https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-`python3 -c 'import sys;print("".join(map(str, sys.version_info[0:2])))'`-v0.8.1-c49ca69-linux64.zip mkdir -p `python3 -c 'import site; print(site.getusersitepackages())'` unzip -d `python3 -c 'import site; print(site.getusersitepackages())'` /tmp/ifcopenshell_python.zip - name: Lint with flake8 diff --git a/features/steps/utils/geometry.py b/features/steps/utils/geometry.py index 4d3197b2..e57cdd07 100644 --- a/features/steps/utils/geometry.py +++ b/features/steps/utils/geometry.py @@ -158,10 +158,10 @@ def evaluate_segment(segment: ifcopenshell.entity_instance, dist_along: float) - :param dist_along: The distance along this segment at the point of interest (point to be calculated) """ s = ifcos_geom.settings() - pwf = wrapper.map_shape(s, segment.wrapped_data) - pwf_evaluator = wrapper.piecewise_function_evaluator(pwf, s) + seg_function = wrapper.map_shape(s, segment.wrapped_data) + seg_evaluator = wrapper.function_item_evaluator(s, seg_function) - segment_trans_mtx = pwf_evaluator.evaluate(dist_along) + segment_trans_mtx = seg_evaluator.evaluate(dist_along) return np.array(segment_trans_mtx, dtype=np.float64).T @@ -193,27 +193,12 @@ def _get_u_at_end(self): """ Get the value of u corresponding to the end of the previous segment """ - alignment_rep_type = self.previous_segment.UsingCurves[0].is_a().upper() - match alignment_rep_type: - case "IFCCOMPOSITECURVE": - # Horizontal representation - use the SegmentLength directly - u = abs(self.previous_segment.SegmentLength.wrappedValue) - case "IFCGRADIENTCURVE" | "IFCSEGMENTEDREFERENCECURVE": - # for vertical and cant representations (IfcGradientCurve and IfcSegmentedReferenceCurve), - # u should be the total distance traversed by the segment along the base curve - # (length of the segment projected to the "Distance Along" x-axis). - # The actual distance along the parent curve (e.g. IfcLine, IfcCircle, IfcPolynomialCurve, etc.) will be longer. - # Therefore, we will get the projected distance based on the placements of the two segments. - u = abs(self.segment_to_analyze.Placement.Location.Coordinates[0] - \ - self.previous_segment.Placement.Location.Coordinates[0]) - case _: - # This case should never be reached. - # If it is reached, the gherkin rule should fail. - # Using a length of 0.0 will force a comparison of the start of the previous segment to the start of the following segment - # which should always return a failing result. - u = 0.0 - - # for all cases, adjust from model units to SI units for ifcopenshell calc + s = ifcos_geom.settings() + seg_function = wrapper.map_shape(s, self.previous_segment.wrapped_data) + + u = seg_function.length() / self.length_unit_scale_factor + + # adjust from model units to SI units for ifcopenshell calc return u * self.length_unit_scale_factor def _calculate_positions(self) -> None: diff --git a/test/files/als017/pass-als017-scenario01-imperial_continuous.ifc b/test/files/als017/pass-als017-scenario01-imperial_continuous.ifc index 688190a2..a4c7d588 100644 --- a/test/files/als017/pass-als017-scenario01-imperial_continuous.ifc +++ b/test/files/als017/pass-als017-scenario01-imperial_continuous.ifc @@ -19,7 +19,7 @@ DATA; #12=IFCDIRECTION((0.,0.,1.)); #13=IFCDIRECTION((1.,0.,0.)); #14=IFCAXIS2PLACEMENT3D(#11,#12,#13); -#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-01,#14,$); +#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#14,$); #16=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#15,$,.MODEL_VIEW.,$); #17=IFCCARTESIANPOINT((0.,0.,0.)); #18=IFCAXIS2PLACEMENT3D(#17,$,$); @@ -122,7 +122,7 @@ DATA; #115=IFCDIRECTION((1.,0.)); #116=IFCVECTOR(#115,1.); #117=IFCLINE(#114,#116); -#118=IFCDIRECTION((2000.,35.)); +#118=IFCDIRECTION((0.999846910161925,0.01749732092783369)); #119=IFCAXIS2PLACEMENT2D(#104,#118); #120=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#119,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.18373593),#117); #121=IFCALIGNMENTVERTICALSEGMENT($,$,0.,1200.,100.,0.0175,0.0175,$,.CONSTANTGRADIENT.); @@ -131,16 +131,16 @@ DATA; #124=IFCDIRECTION((1.,0.)); #125=IFCAXIS2PLACEMENT2D(#123,#124); #126=IFCPOLYNOMIALCURVE(#125,(0.,1.),(121.,0.0175,-8.59375E-06),$); -#127=IFCDIRECTION((2000.,35.)); +#127=IFCDIRECTION((0.999846910161925, 0.01749732092783369)); #128=IFCAXIS2PLACEMENT2D(#105,#127); -#129=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#128,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.),#126); +#129=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#128,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.0616641341207),#126); #130=IFCALIGNMENTVERTICALSEGMENT($,$,1200.,1600.,121.,0.0175,-0.01,-58181.8181818182,.PARABOLICARC.); #131=IFCALIGNMENTSEGMENT('2hO3vvQE5AdeS5Eme$f7QL',$,$,$,$,#19,#227,#130); #132=IFCCARTESIANPOINT((0.,0.)); #133=IFCDIRECTION((1.,0.)); #134=IFCVECTOR(#133,1.); #135=IFCLINE(#132,#134); -#136=IFCDIRECTION((3000.,-30.0)); +#136=IFCDIRECTION((0.9999500037496875,-0.009999500037496875)); #137=IFCAXIS2PLACEMENT2D(#106,#136); #138=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#137,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.079998),#135); #139=IFCALIGNMENTVERTICALSEGMENT($,$,2800.,1600.,127.,-0.01,-0.01,$,.CONSTANTGRADIENT.); @@ -149,16 +149,16 @@ DATA; #142=IFCDIRECTION((1.,0.)); #143=IFCAXIS2PLACEMENT2D(#141,#142); #144=IFCPOLYNOMIALCURVE(#143,(0.,1.),(111.,-0.01,1.25E-05),$); -#145=IFCDIRECTION((3000.,-30.0)); +#145=IFCDIRECTION((0.9999500037496875,-0.009999500037496875)); #146=IFCAXIS2PLACEMENT2D(#107,#145); -#147=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#146,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.),#144); +#147=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#146,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.0599967004605),#144); #148=IFCALIGNMENTVERTICALSEGMENT($,$,4400.,1200.,111.,-0.01,0.02,40000.,.PARABOLICARC.); #149=IFCALIGNMENTSEGMENT('1PoEOI_HrBQupTSE4S8eo9',$,$,$,$,#19,#231,#148); #150=IFCCARTESIANPOINT((0.,0.)); #151=IFCDIRECTION((1.,0.)); #152=IFCVECTOR(#151,1.); #153=IFCLINE(#150,#152); -#154=IFCDIRECTION((2400.,48.)); +#154=IFCDIRECTION((0.999800059980007,0.01999600119960014)); #155=IFCAXIS2PLACEMENT2D(#108,#154); #156=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#155,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.159984003),#153); #157=IFCALIGNMENTVERTICALSEGMENT($,$,5600.,800.,117.,0.02,0.02,$,.CONSTANTGRADIENT.); @@ -167,16 +167,16 @@ DATA; #160=IFCDIRECTION((1.,0.)); #161=IFCAXIS2PLACEMENT2D(#159,#160); #162=IFCPOLYNOMIALCURVE(#161,(0.,1.),(133.,0.02,-1.E-05),$); -#163=IFCDIRECTION((2400.,48.)); +#163=IFCDIRECTION((0.999800059980007,0.01999600119960014)); #164=IFCAXIS2PLACEMENT2D(#109,#163); -#165=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#164,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2000.),#162); +#165=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#164,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2000.1333253344758),#162); #166=IFCALIGNMENTVERTICALSEGMENT($,$,6400.,2000.,133.,0.02,-0.02,-50000.,.PARABOLICARC.); #167=IFCALIGNMENTSEGMENT('2oM9hedcr8FQ1BmLfJrmq0',$,$,$,$,#19,#235,#166); #168=IFCCARTESIANPOINT((0.,0.)); #169=IFCDIRECTION((1.,0.)); #170=IFCVECTOR(#169,1.); #171=IFCLINE(#168,#170); -#172=IFCDIRECTION((2400.,-48.)); +#172=IFCDIRECTION((0.999800059980007,-0.01999600119960014)); #173=IFCAXIS2PLACEMENT2D(#110,#172); #174=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#173,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1000.19998),#171); #175=IFCALIGNMENTVERTICALSEGMENT($,$,8400.,1000.,133.,-0.02,-0.02,$,.CONSTANTGRADIENT.); @@ -185,16 +185,16 @@ DATA; #178=IFCDIRECTION((1.,0.)); #179=IFCAXIS2PLACEMENT2D(#177,#178); #180=IFCPOLYNOMIALCURVE(#179,(0.,1.),(113.,-0.02,9.375E-06),$); -#181=IFCDIRECTION((2400.,-48.)); +#181=IFCDIRECTION((0.999800059980007, -0.01999600119960014)); #182=IFCAXIS2PLACEMENT2D(#111,#181); -#183=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#182,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.),#180); +#183=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#182,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.0699957381095),#180); #184=IFCALIGNMENTVERTICALSEGMENT($,$,9400.,800.,113.,-0.02,-0.005,53333.3333333333,.PARABOLICARC.); #185=IFCALIGNMENTSEGMENT('3SsqC72Jf8quv1zyfESK3_',$,$,$,$,#19,#239,#184); #186=IFCCARTESIANPOINT((0.,0.)); #187=IFCDIRECTION((1.,0.)); #188=IFCVECTOR(#187,1.); #189=IFCLINE(#186,#188); -#190=IFCDIRECTION((3000.,-15.)); +#190=IFCDIRECTION((0.99998750023437,-0.00499993750117185)); #191=IFCAXIS2PLACEMENT2D(#112,#190); #192=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#191,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2600.0324998),#189); #193=IFCALIGNMENTVERTICALSEGMENT($,$,10200.,2600.,103.,-0.005,-0.005,$,.CONSTANTGRADIENT.); @@ -203,7 +203,7 @@ DATA; #196=IFCDIRECTION((1.,0.)); #197=IFCVECTOR(#196,1.); #198=IFCLINE(#195,#197); -#199=IFCDIRECTION((3000.,-15.)); +#199=IFCDIRECTION((0.99998750023437,-0.00499993750117185)); #200=IFCAXIS2PLACEMENT2D(#113,#199); #201=IFCCURVESEGMENT(.DISCONTINUOUS.,#200,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(0.),#198); #202=IFCALIGNMENTVERTICALSEGMENT($,$,12800.,0.,90.,-0.005,-0.005,$,.CONSTANTGRADIENT.); diff --git a/test/files/als017/pass-als017-scenario02-imperial_not_applicable.ifc b/test/files/als017/pass-als017-scenario02-imperial_not_applicable.ifc index 4c05a498..587ec3bb 100644 --- a/test/files/als017/pass-als017-scenario02-imperial_not_applicable.ifc +++ b/test/files/als017/pass-als017-scenario02-imperial_not_applicable.ifc @@ -19,7 +19,7 @@ DATA; #12=IFCDIRECTION((0.,0.,1.)); #13=IFCDIRECTION((1.,0.,0.)); #14=IFCAXIS2PLACEMENT3D(#11,#12,#13); -#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-02,#14,$); +#15=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#14,$); #16=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#15,$,.MODEL_VIEW.,$); #17=IFCCARTESIANPOINT((0.,0.,0.)); #18=IFCAXIS2PLACEMENT3D(#17,$,$); @@ -122,7 +122,7 @@ DATA; #115=IFCDIRECTION((1.,0.)); #116=IFCVECTOR(#115,1.); #117=IFCLINE(#114,#116); -#118=IFCDIRECTION((0.999846863274572,0.01749732012)); +#118=IFCDIRECTION((0.999846910161925, 0.01749732092783369)); #119=IFCAXIS2PLACEMENT2D(#104,#118); #120=IFCCURVESEGMENT(.CONTINUOUS.,#119,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.18373593),#117); #121=IFCALIGNMENTVERTICALSEGMENT($,$,0.,1200.,100.,0.0175,0.0175,$,.CONSTANTGRADIENT.); @@ -131,16 +131,16 @@ DATA; #124=IFCDIRECTION((1.,0.)); #125=IFCAXIS2PLACEMENT2D(#123,#124); #126=IFCPOLYNOMIALCURVE(#125,(0.,1.),(121.,0.0175,-8.59375E-06),$); -#127=IFCDIRECTION((0.999846863274572,0.01749732012)); +#127=IFCDIRECTION((0.999846910161925, 0.01749732092783369)); #128=IFCAXIS2PLACEMENT2D(#105,#127); -#129=IFCCURVESEGMENT(.CONTINUOUS.,#128,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.),#126); +#129=IFCCURVESEGMENT(.CONTINUOUS.,#128,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.0616641341207),#126); #130=IFCALIGNMENTVERTICALSEGMENT($,$,1200.,1600.,121.,0.0175,-0.01,-58181.8181818182,.PARABOLICARC.); #131=IFCALIGNMENTSEGMENT('2hO3vvQE5AdeS5Eme$f7QL',$,$,$,$,#19,#227,#130); #132=IFCCARTESIANPOINT((0.,0.)); #133=IFCDIRECTION((1.,0.)); #134=IFCVECTOR(#133,1.); #135=IFCLINE(#132,#134); -#136=IFCDIRECTION((0.999949998749938,-0.009999499987)); +#136=IFCDIRECTION((0.9999500037496875,-0.009999500037496875)); #137=IFCAXIS2PLACEMENT2D(#106,#136); #138=IFCCURVESEGMENT(.CONTINUOUS.,#137,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1600.079998),#135); #139=IFCALIGNMENTVERTICALSEGMENT($,$,2800.,1600.,127.,-0.01,-0.01,$,.CONSTANTGRADIENT.); @@ -149,16 +149,16 @@ DATA; #142=IFCDIRECTION((1.,0.)); #143=IFCAXIS2PLACEMENT2D(#141,#142); #144=IFCPOLYNOMIALCURVE(#143,(0.,1.),(111.,-0.01,1.25E-05),$); -#145=IFCDIRECTION((0.999949998749938,-0.009999499987)); +#145=IFCDIRECTION((0.9999500037496875,-0.009999500037496875)); #146=IFCAXIS2PLACEMENT2D(#107,#145); -#147=IFCCURVESEGMENT(.CONTINUOUS.,#146,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.),#144); +#147=IFCCURVESEGMENT(.CONTINUOUS.,#146,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1200.0599967004605),#144); #148=IFCALIGNMENTVERTICALSEGMENT($,$,4400.,1200.,111.,-0.01,0.02,40000.,.PARABOLICARC.); #149=IFCALIGNMENTSEGMENT('1PoEOI_HrBQupTSE4S8eo9',$,$,$,$,#19,#231,#148); #150=IFCCARTESIANPOINT((0.,0.)); #151=IFCDIRECTION((0.999799979995999,0.01999599960)); #152=IFCVECTOR(#151,1.); #153=IFCLINE(#150,#152); -#154=IFCDIRECTION((0.999799979995999,0.01999599960)); +#154=IFCDIRECTION((0.999800059980007,0.01999600119960014)); #155=IFCAXIS2PLACEMENT2D(#108,#154); #156=IFCCURVESEGMENT(.CONTINUOUS.,#155,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.159984003),#153); #157=IFCALIGNMENTVERTICALSEGMENT($,$,5600.,800.,117.,0.02,0.02,$,.CONSTANTGRADIENT.); @@ -167,16 +167,16 @@ DATA; #160=IFCDIRECTION((1.,0.)); #161=IFCAXIS2PLACEMENT2D(#159,#160); #162=IFCPOLYNOMIALCURVE(#161,(0.,1.),(133.,0.02,-1.E-05),$); -#163=IFCDIRECTION((0.999799979995999,0.01999599960)); +#163=IFCDIRECTION((0.999800059980007,0.01999600119960014)); #164=IFCAXIS2PLACEMENT2D(#109,#163); -#165=IFCCURVESEGMENT(.CONTINUOUS.,#164,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2000.),#162); +#165=IFCCURVESEGMENT(.CONTINUOUS.,#164,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2000.1333253344758),#162); #166=IFCALIGNMENTVERTICALSEGMENT($,$,6400.,2000.,133.,0.02,-0.02,-50000.,.PARABOLICARC.); #167=IFCALIGNMENTSEGMENT('2oM9hedcr8FQ1BmLfJrmq0',$,$,$,$,#19,#235,#166); #168=IFCCARTESIANPOINT((0.,0.)); #169=IFCDIRECTION((1.,0.)); #170=IFCVECTOR(#169,1.); #171=IFCLINE(#168,#170); -#172=IFCDIRECTION((0.999799979995999,-0.01999599960)); +#172=IFCDIRECTION((0.999800059980007,-0.01999600119960014)); #173=IFCAXIS2PLACEMENT2D(#110,#172); #174=IFCCURVESEGMENT(.CONTINUOUS.,#173,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1000.19998),#171); #175=IFCALIGNMENTVERTICALSEGMENT($,$,8400.,1000.,133.,-0.02,-0.02,$,.CONSTANTGRADIENT.); @@ -185,16 +185,16 @@ DATA; #178=IFCDIRECTION((1.,0.)); #179=IFCAXIS2PLACEMENT2D(#177,#178); #180=IFCPOLYNOMIALCURVE(#179,(0.,1.),(113.,-0.02,9.375E-06),$); -#181=IFCDIRECTION((0.999799979995999,-0.01999599960)); +#181=IFCDIRECTION((0.999800059980007, -0.01999600119960014)); #182=IFCAXIS2PLACEMENT2D(#111,#181); -#183=IFCCURVESEGMENT(.CONTINUOUS.,#182,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.),#180); +#183=IFCCURVESEGMENT(.CONTINUOUS.,#182,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(800.0699957381095),#180); #184=IFCALIGNMENTVERTICALSEGMENT($,$,9400.,800.,113.,-0.02,-0.005,53333.3333333333,.PARABOLICARC.); #185=IFCALIGNMENTSEGMENT('3SsqC72Jf8quv1zyfESK3_',$,$,$,$,#19,#239,#184); #186=IFCCARTESIANPOINT((0.,0.)); #187=IFCDIRECTION((1.,0.)); #188=IFCVECTOR(#187,1.); #189=IFCLINE(#186,#188); -#190=IFCDIRECTION((0.999987499921874,-0.00499993750)); +#190=IFCDIRECTION((1.,0.)); #191=IFCAXIS2PLACEMENT2D(#112,#190); #192=IFCCURVESEGMENT(.CONTINUOUS.,#191,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2600.0324998),#189); #193=IFCALIGNMENTVERTICALSEGMENT($,$,10200.,2600.,103.,-0.005,-0.005,$,.CONSTANTGRADIENT.); @@ -203,7 +203,7 @@ DATA; #196=IFCDIRECTION((1.,0.)); #197=IFCVECTOR(#196,1.); #198=IFCLINE(#195,#197); -#199=IFCDIRECTION((0.999987499921874,-0.00499993750)); +#199=IFCDIRECTION((1.,0.)); #200=IFCAXIS2PLACEMENT2D(#113,#199); #201=IFCCURVESEGMENT(.DISCONTINUOUS.,#200,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(0.),#198); #202=IFCALIGNMENTVERTICALSEGMENT($,$,12800.,0.,90.,-0.005,-0.005,$,.CONSTANTGRADIENT.);