Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarity needed for Alignment Cant axis of rotation #160

Open
civilx64 opened this issue Jul 4, 2024 · 5 comments
Open

Clarity needed for Alignment Cant axis of rotation #160

civilx64 opened this issue Jul 4, 2024 · 5 comments
Assignees

Comments

@civilx64
Copy link

civilx64 commented Jul 4, 2024

Problem
Ref buildingSMART/IFC4.3.x-sample-models#23

As I see it there are four variables related to fully describing cant:

  1. Point of rotation (expected to be about one of the railheads or at the center point between railheads)
  2. Distance between left and right railhead
  3. Superelevation (elevation difference between top of low and high railheads)
  4. Cross slope (superelevation / railhead distance)

Figure 8.9.3.62.A in the docs for IfcSegmentedReferenceCurve illustrates these relationships when the low rail is the point of rotation:

There is no corresponding figure to illustrate how rotation about centerline is to be defined.

Solution(s)

Another graphic illustration for rotation about centerline of rail is needed.

Require schema changes?

  • yes
  • no
  • don't know

Require documentation changes?

  • yes
  • no
  • don't know

Rule required

  • other normative rule: a normative check of the IFC Validation Service. Every IFC file must pass this check

My hypothesis is that business logic - specifically IfcAlignmentCantSegment.DesignParameters - must be provided in addition to the IfcCurveSegment representation entity. If true then this should be enforced by a normative rule.

@civilx64
Copy link
Author

civilx64 commented Jul 6, 2024

Looks like I can answer my own question based on discussion in the referenced thread. The geometry representation can stand on its own and does not require anything from the business logic. The other two points still stand - another diagram is required to describe rotation about centerline and both diagrams need updated to dimension CantLeft and CantRight that are contained in the business logic. Which then also means another normative rule in the ALA series is required to confirm that the point of rotation described by the representation matches what is described by the values of CantLeft and CantRight in the business logic.

@civilx64 civilx64 changed the title Can Alignment Cant be described fully by geometric representation only or is business logic required as well? Clarity needed for Alignment Cant axis of rotation Jul 7, 2024
@civilx64
Copy link
Author

Revised diagrams:

ROTATION ABOUT RAILHEAD
IfcSegmentedReferenceCurve_RailheadRotation

ROTATION ABOUT CENTERLINE
IfcSegmentedReferenceCurve_CenterRotation

@RickBrice
Copy link

In practice, I think you are right that the point of rotation is at one of the rail heads or at the center point between. However, the semantic and geometry definitions could be used for rotation about any point.

Here is a quick sketch to illustrate what I mean.

image

LeftCant, RightCant, and Railhead Distance define slope and point of rotation
IfcSegmentCurve.Placement.Axis and IfcSegmentCurve.Placement.Location[2] also define slope and point of rotation.
These should be consistent

@RickBrice
Copy link

RickBrice commented Nov 4, 2024

After many sleepless nights trying to figure out cant, I think I've got it. Thanks to everyone who helped me.

@evandroAlfieri @civilx64 @peterrdf @jmirtsch @SergejMuhic @aothms I propose the following documentation for IfcSegmentedReferenceCurve.

Having an example is not consistent with any other part of the IFC specification, but I think it clarifies in the intent of all the technical speak. My proposal to have the example be part of the Semantic Definition is flexible. If the IFC specification had a commentary, this would be a good place for such an example. Alternatively, the example could go in 8.9.3.62.4 Example


8.9.3.62.1 Semantic Definition

The IfcSegmentedReferenceCurve is a curve defined in the linear parameter space of its base curve that is set in the attribute BaseCurve. The base curve provides a basis for the positioning of the collection of IfcCurveSegment occurrences. A deviating explicit position of a curve segment (IfcCurveSegment.Placement) from the axis of the basis curve produces a superelevation (i.e. depression or elevation from the axis of the base curve). The deviating elevation is defined by the IfcCurveSegment.ParentCurve in the linear parameter space of the base curve. If no deviation in the position of the curve segment to the base curve axis is specified, the axes (Axis and RefDirection) directions of IfcAxis2Placement are interpolated between the initial curve segment placement and the placement of the subsequent curve segment.

The parameterization of IfcSegmentedReferenceCurve is based on the parameterization of the BaseCurve and is not altered by the Segments.

Figure 8.9.3.62.A shows a cross section of a IfcSegmentedReferenceCurve usage for an alignment representation featuring cant with rotation about the low rail and varying superelevation.

Figure_8 9 3 62 A
Figure 8.9.3.62.A — use of a segmented reference curve on a cant segment based on a gradient curve

Figure 8.9.3.62.B shows a cross section of a IfcSegmentedReferenceCurve usage for an alignment representation feature cant with rotation about the track centerline with no deviating position.

Figure_8 9 3 62 B
Figure 8.9.3.62.B — use of a segmented reference curve on a cant segment based on a gradient curve with rotation about track centerline and no superelevation

Informally, a IfcSegmentedReferenceCurve is a curve defined in a “horizontal distance along base curve, deviating elevation” coordinate system. The IfcCurveSegment.ParentCurve defines the change in cross slope between rail heads over the length of the segment. When the IfcCurveSegment.Placement.Location differs from the IfcCurveSegmentPlacement.Location of the next segment (or the IfcSegmentedReferenceCurve.EndPoint for the last segment, if specified), the IfcCurveSegment.ParentCurve also defines the deviating elevation. If the IfcCurveSegment.Placement.Location is the same as for the start of the next segment, the deviating elevation along the length of the segment is constant.

Evaluation of a IfcCurveSegment that is part of a IfcSegmentedReferenceCurve is illustrated with an example. Consider a IfcCurveSegment with a IfcCosineSpiral parent curve. The curve segment has a position of (0.0,0.08,0.0) and an Axis of (0.0, 0.10606,0.99436). The curve segment has a length of 100. The next curve segment has a position of (100.0,0.0,0.0) and an Axis of (0.0, 0.0,1.0). The constant and cosine terms are both 2500.

The parent curve equation is $D(s)=\frac{L}{A_o} + \frac{L}{A_1}cos(\pi \frac{s}{L})$ where $A_0$ is the constant term and $A_1$ is the cosine term.

The deviating elevation at the start of the segment is $D_s=D(0)=0.08$

The deviating elevation at the end of the segment is $D_e=D(100)=0.0$

The deviating elevation at the segment mid-point is $D=\frac{100}{2500}+\frac{100}{2500}cos(\pi \frac{50}{100})=0.04$

The orientation of the Axis at the start of the segment is $\theta_s=tan^{-1}(\frac{0.99436}{0.10606})=1.46454$

The orientation of the Axis at the end of the segment is $\theta_e = tan^{-1}(\frac{1.0}{0.0}) = 1.570796$

The orientation of Axis at the segment mid-point is $\theta = \theta_s + \frac{(\theta_e -\theta_s)}{(D_e - D_s)}(D-D_s)=1.46484+\frac{(1.570796-1.46454)}{(0.0-0.08)}(0.04-0.08)=1.517968$

The slope of the deviating elevation is the derivative of the parent curve.

$slope = -\frac{\pi}{A_1}sin\pi\frac{s}{L} = -\frac{\pi}{2500}sin\pi\frac{50}{100}=-0.0012567$

$slope angle = tan^{-1}(slope) = -0.0012567$

RefDirection = ($cos(slope angle)$, $sin(slope angle)$ ,0.0)

The Z-Direction at the segment mid-point is (0.0, $cos\theta$, $sin\theta$) = $(0.0,0.05234,0.99863)$

The Y-Direction is the cross product of Z-Direction and RefDirection

Axis is the cross product of RefDirection and Y-Direction

Figure 8.9.3.62.C shows the deviating elevation of the left rail, right rail, and centerline of track along the length of the segment.

Figure_8 9 3 62 C
Figure 8.9.3.62.C — Deviating elevation along length of segment

Figure 8.9.3.62.D shows the orientation variation of Axis along the length of the segment
Figure_8 9 3 62 D
Figure 8.9.3.62.D — Orientation of Axis along length of segment

@evandroAlfieri
Copy link
Contributor

That is fantastic! 🚀 Thanks @RickBrice (and all others that contributed to this).
I'll start building a PR to update the documentation. And yes, if you have an example file we can add it to the list of examples.

@evandroAlfieri evandroAlfieri self-assigned this Nov 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants