Skip to content

Clarifies point by distance expression offsets - #1148

Open
RickBrice wants to merge 1 commit into
buildingSMART:ifc4.3-mainfrom
RickBrice:ifc4.3-main
Open

Clarifies point by distance expression offsets#1148
RickBrice wants to merge 1 commit into
buildingSMART:ifc4.3-mainfrom
RickBrice:ifc4.3-main

Conversation

@RickBrice

Copy link
Copy Markdown
Contributor

The semantic definition discusses how the offsets default relative to IfcProduct.Placement and IfcCurveSegment.StartPlacement. Neither of these are valid attributes, offsets are relative to the basis curve, and there are no logical default values.

Phrasing of attribute definitions revised to clarify. Figures added to aid in understanding of the offsets.

@github-actions

Copy link
Copy Markdown

PR Validation -- schema generators

Checks:

  • ✓ EXPRESS schema valid
  • ✓ New entities present in structure.json
  • ✓ MD docs for new entities
  • ✓ PEnum convention
  • ✓ New UML Psets/Qtos emitted
  • ✓ Modified psets emitted
  • ✓ Schema SHACL validation

Detected:

  • New entities: (none)
  • New PEnums: (none)
  • New UML Psets/Qtos: (none)
  • UML files changed: (none)
  • MD docs changed (1): IfcPointByDistanceExpression.md
📋 EXPRESS schema diff (baseline vs PR head)

Express schema differences

0 items

Missing data

🎉 No issues 🎉

Type definitions

🎉 No issues 🎉

Entity definitions

🎉 No issues 🎉

Constraints

🎉 No issues 🎉

SHACL validation report

DefinitionForEnumLiteral

  • The resource 'IfcBridgePartTypeEnum.SURFACESTRUCTURE' has no definition
  • The resource 'IfcRailwayPartTypeEnum.DILATIONTRACK' has no definition

DefinitionForPropertyOrQuantity

  • The Property 'Pset_AirSideSystemInformation.AirFlowSensible' has no definition
  • The Property 'Pset_AirSideSystemInformation.TotalAirFlow' has no definition
  • The Property 'Pset_AirTerminalBoxPHistory.AirFlowCurve' has no definition
  • The Property 'Pset_AirTerminalOccurrence.AirFlowType' has no definition
  • The Property 'Pset_AirToAirHeatRecoveryTypeCommon.PrimaryAirFlowRateRange' has no definition
  • The Property 'Pset_AirToAirHeatRecoveryTypeCommon.SecondaryAirFlowRateRange' has no definition
  • The Property 'Pset_SpaceThermalPHistory.ExhaustAirFlowRate' has no definition
  • The Property 'Qto_WallBaseQuantities.GrossFootPrintArea' has no definition
  • The Property 'Qto_WallBaseQuantities.NetFootPrintArea' has no definition

DefinitionForResource

  • The resource 'IfcSurfaceFeature' has no definition
  • The resource 'IfcURIReference' has no definition

LeafEntityHasPredefinedType

  • Leaf IfcObject 'IfcAlignmentCant' has no PredefinedType attribute
  • Leaf IfcObject 'IfcAlignmentHorizontal' has no PredefinedType attribute
  • Leaf IfcObject 'IfcAlignmentSegment' has no PredefinedType attribute
  • Leaf IfcObject 'IfcAlignmentVertical' has no PredefinedType attribute
  • Leaf IfcObject 'IfcAsset' has no PredefinedType attribute
  • Leaf IfcObject 'IfcBorehole' has no PredefinedType attribute
  • Leaf IfcObject 'IfcBuilding' has no PredefinedType attribute
  • Leaf IfcObject 'IfcBuildingStorey' has no PredefinedType attribute
  • Leaf IfcObject 'IfcCivilElement' has no PredefinedType attribute
  • Leaf IfcObject 'IfcDistributionCircuit' has no PredefinedType attribute
  • Leaf IfcObject 'IfcGeomodel' has no PredefinedType attribute
  • Leaf IfcObject 'IfcGeoslice' has no PredefinedType attribute
  • Leaf IfcObject 'IfcSite' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralCurveConnection' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralCurveMemberVarying' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralLinearAction' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralLoadCase' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralPlanarAction' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralPointAction' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralPointConnection' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralPointReaction' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralResultGroup' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralSurfaceConnection' has no PredefinedType attribute
  • Leaf IfcObject 'IfcStructuralSurfaceMemberVarying' has no PredefinedType attribute
  • Leaf IfcObject 'IfcWallStandardCase' has no PredefinedType attribute
  • Leaf IfcObject 'IfcZone' has no PredefinedType attribute

PropertyForDefinition

  • For document 'AcidityConcentration.md/a/properties/docs' a property cannot be found
  • For document 'ActualWork.md/a/properties/docs' a property cannot be found
  • For document 'AdjustmentRange.md/a/properties/docs' a property cannot be found
  • For document 'AdjustmentRangeStepValue.md/a/properties/docs' a property cannot be found
  • For document 'AdjustmentValues.md/a/properties/docs' a property cannot be found
  • For document 'AdmixturesDescription.md/a/properties/docs' a property cannot be found
  • For document 'AffectsSurroundings.md/a/properties/docs' a property cannot be found
  • For document 'Aggregation.md/a/properties/docs' a property cannot be found
  • For document 'AirflowCurve.md/a/properties/docs' a property cannot be found
  • For document 'AirflowSensible.md/a/properties/docs' a property cannot be found
  • For document 'AirflowType.md/a/properties/docs' a property cannot be found
  • For document 'AlkalinityConcentration.md/a/properties/docs' a property cannot be found
  • For document 'AppearanceGrade.md/a/properties/docs' a property cannot be found
  • For document 'ApplicableStructuralDesignMethod.md/a/properties/docs' a property cannot be found
  • For document 'Area.md/a/properties/docs' a property cannot be found
  • For document 'Arrangement.md/a/properties/docs' a property cannot be found
  • For document 'AssessmentOfRisk.md/a/properties/docs' a property cannot be found
  • For document 'BaseChamfer.md/b/properties/docs' a property cannot be found
  • For document 'BearingStrength.md/b/properties/docs' a property cannot be found
  • For document 'BoilingPoint.md/b/properties/docs' a property cannot be found
  • For document 'BottomCover.md/b/properties/docs' a property cannot be found
  • For document 'CO2Content.md/c/properties/docs' a property cannot be found
  • For document 'COContent.md/c/properties/docs' a property cannot be found
  • For document 'CarbonContent.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreBaseHeight.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreBaseWidth.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreMiddleHeight.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreSpacing.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreTopHeight.md/c/properties/docs' a property cannot be found
  • For document 'CenterCoreTopWidth.md/c/properties/docs' a property cannot be found
  • For document 'CentreOfGravityInX.md/c/properties/docs' a property cannot be found
  • For document 'CentreOfGravityInY.md/c/properties/docs' a property cannot be found
  • For document 'CombustionTemperature.md/c/properties/docs' a property cannot be found
  • For document 'CompStrength.md/c/properties/docs' a property cannot be found
  • For document 'CompStrengthPerp.md/c/properties/docs' a property cannot be found
  • For document 'CompactedVolume.md/c/properties/docs' a property cannot be found
  • For document 'CompressiveStrength.md/c/properties/docs' a property cannot be found
  • For document 'Condition.md/c/properties/docs' a property cannot be found
  • For document 'CoreBaseHeight.md/c/properties/docs' a property cannot be found
  • For document 'CoreBaseWidth.md/c/properties/docs' a property cannot be found
  • For document 'CoreMiddleHeight.md/c/properties/docs' a property cannot be found
  • For document 'CoreSpacing.md/c/properties/docs' a property cannot be found
  • For document 'CoreTopHeight.md/c/properties/docs' a property cannot be found
  • For document 'CoreTopWidth.md/c/properties/docs' a property cannot be found
  • For document 'Count.md/c/properties/docs' a property cannot be found
  • For document 'CrossSectionArea.md/c/properties/docs' a property cannot be found
  • For document 'CurrentCarryingCapasity.md/c/properties/docs' a property cannot be found
  • For document 'DefinitionType.md/d/properties/docs' a property cannot be found
  • For document 'DimensionalChangeCoefficient.md/d/properties/docs' a property cannot be found
  • For document 'DissolvedSolidsContent.md/d/properties/docs' a property cannot be found
  • For document 'DraftBaseOffset.md/d/properties/docs' a property cannot be found
  • For document 'DraftSideOffset.md/d/properties/docs' a property cannot be found
  • For document 'DynamicViscosity.md/d/properties/docs' a property cannot be found
  • For document 'EavesHeight.md/e/properties/docs' a property cannot be found
  • For document 'EdgeDraft.md/e/properties/docs' a property cannot be found
  • For document 'ExhaustAirFlowRate.md/e/properties/docs' a property cannot be found
  • For document 'Exponent.md/e/properties/docs' a property cannot be found
  • For document 'FinishCeilingHeight.md/f/properties/docs' a property cannot be found
  • For document 'FinishFloorHeight.md/f/properties/docs' a property cannot be found
  • For document 'FlangeBaseFillet.md/f/properties/docs' a property cannot be found
  • For document 'FlangeChamfer.md/f/properties/docs' a property cannot be found
  • For document 'FlangeDepth.md/f

SHACL report truncated -- full report in the workflow artifact bundle.

See workflow run for failure details.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These diagrams are quite helpful - thanks! I'd recommend increasing DistanceAlong so that it is at (or just short of) the PI. The purpose of OffsetLongitudinal is to reach the unreachable zone, so there's no need for it to begin outside of that area.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since the point is otherwise unreachable, I don't think it matters what DistanceAlong is. When I created the sketch, I was thinking that DistanceAlong may be some convenient point, such as at a full station. There isn't any technical reason why it needs to be "close" to or at the PI.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the XY plane, yes. Consider the case where Tangent 1 includes a vertical curve with reasonably steep gradients. If DistanceAlong is on the first gradient, then the default Axis direction of a linear placement using this PointByDistanceExpression is very different than that of the second gradient. Or even if it is a single constant vertical gradient, the elevation (Z value) at DistanceAlong would vary quite a bit from that at the PI. My assumption is that a point to be located in the unreachable zone would match the elevation and orientation of the PI, at least before OffsetVertical is applied.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not disagreeing with you, but in the end, it is up to the implementer/modeler to use the distance along and offsets to get the point they want. They can do it the "easy way" (as you've called out) or the "hard way" (maybe that's that the draft figure shows). The figure is generic enough to convey the idea. Perhaps modeling guidance documents could highlight some best practices.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good deal - let's leave this figure as-is.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would add a note somewhere, that this is the horizontal plane.


![](../../../../figures/ifcpointbydistanceexpression_offsetlongitudinal.svg)

### BasisCurve

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
### BasisCurve
### BasisCurve
Reference system for linear positioning. As such, BasisCurve must be one of the supported shape representations for __IfcAlignment__:
* __IfcCompositeCurve__
* __IfcGradientCurve__
* __IfcSegmentedReferenceCurve__
* __IfcOffsetCurveByDistances__
* __IfcPolyline__ or __IfcIndexedPolyCurve__

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IfcOffsetCurveByDistances, IfcPolyline and IfcIndexPolyCurve do not have easy projections onto the global XY Plane.

I would limit this to IfcCompositeCurve, IfcGradientCurve, and IfcSegmentReferenceCurve.

Is this a documentation clarification or a change of the ISO spec? Can we do this in 4x3 or does it need to go to 4x4?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The intent was to refer back to the representations already documented for IfcAlignment and therefore re-iterate existing parts of the documentation versus breaking new ground, so to speak. IfcPolyline and IfcIndexedPolyCurve can be projected to XY by just dropping Z values (if provided in the first place). These entity types are important for supporting GIS use cases. Agree that IfcOffsetCurveByDistances is not as straightforward, but there's still value in keeping it for overall consistency. A future PR specifically for IfcOffsetCurveByDistances could provide additional clarification on how a point by distance should be implemented.

I see this as an implementer agreement and therefore clarification, not change to the spec. The EXPRESS definition remains the same and this revision provides additional guidance on how linear referencing is accomplished in IFC.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IfcIndexedPolyCurve can be projected to XY by just dropping Z values

True, however segments of type IfcArcIndex will project onto XY as an ellipse. That's not an impossible thing, but not at all common in road/rail alignments.

@RickBrice

Copy link
Copy Markdown
Contributor Author

Here is an alternative figure what would replace the one for offset vertical.

ifc_offset_directions

@civilx64

civilx64 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

I'd recommend keeping the previous graphic since it provides a simplified 2.5D view that domain users are familiar with, and adding this new one to supplement the overall concept.

# IfcPointByDistanceExpression

An _IfcPointByDistanceExpression_ describes a point relative to a basis curve according to distance along the basis curve. The offsets default to the initial context of the curve relative to it's tangent either specified in _IfcProduct.Placement_ or in the case of a segmented curve to the _IfcCurveSegment_ _StartPlacement_ where the values correspond to the following:
An _IfcPointByDistanceExpression_ describes a point relative to a basis curve according to distance along the projection of the basis curve in the horizontal plane. The offsets are relative to the basis curve where the values correspond to the following:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the general definition of basis curve is incorrect. The basis curve provides the basis for the 3D curve derived from the 2.5D construction. IfcPointByDistanceExpression.BasisCurve should be IfcPointByDistanceExpression.Directrix and then this definition would be as

An IfcPointByDistanceExpression describes a point relative to a directrix according to a distance along the basis curve of the directrix (the projection of the directrix onto a horizontal plane). The offsets are relative to the directrix where values correspond to the following:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I disagree. If you want to have the point explicitly on the projection, then you should reference the projection (in IfcGradientCurve.BaseCurve this would be the IfcCompositeCurve). This is or was the intent and one of the essential clarifying functions was added in IFC Tunnel: https://bsi-infraroom.github.io/IFC-Documentation-Tunnel/4_4_0_0/general/HTML/index-new.htm#schema%2Fifcproductextension%2Flexical%2Fifcalignmentrepresentation.htm
It would need a bit more to make it formal and clear also on the IfcPointByDistanceExpression side of things but bSI TD was very clear that the project cannot propose such clarifications or enhancements.

Regarding IfcGradientCurve documentation, the projection reference is not relevant anyway since:
"The parametrization of the gradient curve is based on the underlying segments of its BaseCurve. The value of the parameter equals the parameter value of BaseCurve."
Same for IfcSegmentedReferenceCurve.

The offsets, however, need to be possible on the actual 3D geometry. Tunnel design data for example needs this and was a requirement in the infra domain in the Infra projects.

This is a broader issue that comes from the IfcCurveMeasureSelect confusion which was not intended for production use but bSI chose to keep it, despite its intention being just for testing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SergejMuhic it seems like you are saying the IfcPointByDistanceExpression.DistanceAlong is measured along whatever curve is assigned to IfcPointByDistanceExpression.BasisCurve. If it is an IfcGradientCurve then DistanceAlong is the distance along the 3D curve, not it’s project onto a horizontal plane.

Is this the case? If so, it seems counter to the idea of 2.5D curve geometry we are accustomed to in civil engineering and many implementations have gotten this wrong.

ISO 19148 is not specific in this regard.

image

A definitive answer to this simple question is crucial for consistent implementations of the IFC4x3 specification.

bSI TD was very clear that the project cannot propose such clarifications or enhancements.

At the moment bSI does not have a TD. There is an effort underway, lead by the bSI Quality and Delivery Director, to address the open issues in IFC4x3. Issues have been categorized and are being addressed in two-week sprints through the Implementers Forum. IFC4x-IF | 4.4 update. You clearly have deep and tacit understanding of the alignment geometry topics. A core group of people are volunteering many hours to move the specification and implementations forward and are getting frustrated by the lack of clarity in this space. This is the opportunity to make the necessary clarifications and enhancements.


### DistanceAlong
The distance along the basis curve measured as either a _IfcLengthMeasure_ or _IfcParameterValue_.
The distance along the horizontal projection of the basis curve measured as either a _IfcLengthMeasure_ or _IfcParameterValue_.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would not need to be changed because the semantic definition establishes that the basis curve is the horizontal projection of the directrix.


### OffsetLateral
Default offset horizontally is measured perpendicular to the basis curve, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous segment governs.
Offset measured horizontally perpendicular to the basis curve, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous segment governs.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Offset measured horizontally perpendicular to the directrix....

Default offset vertical to the basis curve where positive values indicate perpendicular to the tangent at DistanceAlong in the plane of the tangent perpendicular to the global XY plane.
Offset vertical to the basis curve where positive values indicate perpendicular to the tangent of the basis curve at DistanceAlong.

![](../../../../figures/ifcpointbydistanceexpression_offsetvertical.svg)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Offset vertical to the directrix....

![](../../../../figures/ifcpointbydistanceexpression_offsetvertical.svg)

### OffsetLongitudinal
Offset parallel to the basis curve after applying DistanceAlong, OffsetLateral, and OffsetVertical to reach locations for the case of a tangentially discontinuous basis curve.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Offset parallel to the directrix after applying...

@pjanck pjanck left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Increased clarity. Wording debatable - I am no native speaker.

![](../../../../figures/ifcpointbydistanceexpression_offsetvertical.svg)

### OffsetLongitudinal
Offset parallel to the basis curve after applying DistanceAlong, OffsetLateral, and OffsetVertical to reach locations for the case of a tangentially discontinuous basis curve.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Offset parallel to the basis curve after applying DistanceAlong, OffsetLateral, and OffsetVertical to reach locations for the case of a tangentially discontinuous basis curve.
Offset parallel to the tangent of the basis curve at DistanceAlong after applying OffsetLateral and OffsetVertical.
NOTE: This may be used to reach locations for the case of a tangentially discontinuous basis curve.


### OffsetVertical
Default offset vertical to the basis curve where positive values indicate perpendicular to the tangent at DistanceAlong in the plane of the tangent perpendicular to the global XY plane.
Offset vertical to the basis curve where positive values indicate perpendicular to the tangent of the basis curve at DistanceAlong.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Offset vertical to the basis curve where positive values indicate perpendicular to the tangent of the basis curve at DistanceAlong.
Offset orthogonal to the tangent of basis curve at DistanceAlong that lies in the plane spanned by the tangent of the basis curve at DistanceAlong and the vertical axis of curve's context, where positive values are in agreement with the positive values of the vertical axis of curve's context.


### OffsetLateral
Default offset horizontally is measured perpendicular to the basis curve, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous segment governs.
Offset measured horizontally perpendicular to the basis curve, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous segment governs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Offset measured horizontally perpendicular to the basis curve, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous segment governs.
Offset measured perpendicular to the tangent of basis curve at DistanceAlong in the plane parallel to the horizontal plane, where positive values indicate to the left of the basis curve as facing in the positive parametrization direction of the basis curve, and negative values indicate to the right. If DistanceAlong coincides with a point of tangential discontinuity (within precision limits), then the tangent of the previous (oncoming) segment governs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would add a note somewhere, that this is the horizontal plane.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Elevation is never used in the definitions. While I understand what is meant - I would propose to change to vertical axis of the curve's context. (Similar wording welcome - this is at least what I used in my other suggestions.)

@pjanck

pjanck commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Here is an alternative figure

I would add it as the first figure in Attributes section. Not alternatively, but rather an addition.

Remove global, since it could be misunderstood. Proposal: change global with curve's, so global X becomes curve's X, or similar.

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

Successfully merging this pull request may close these issues.

4 participants