jwouellette / TPF-5_372-Unit_Test_Suite

Test instruction and IFC file repository for the BIM for Bridges and Structures Transportation Pooled Fund project
8 stars 0 forks source link

Linear placement implementation uncertainty #15

Open RickBrice opened 3 months ago

RickBrice commented 3 months ago

During our bsUSA BIM for Bridges meeting on July 17 someone mentioned that there was still some uncertainty about linear placement that is hampering implementation. I’m wondering what the issues are.

I think IfcLinearPlacement itself is pretty straightforward, especially since bSI has clarified PlacementRelTo. https://github.com/buildingSMART/ifc-gherkin-rules/issues/124

I have some outstanding questions in the bSI implementers forum regarding IfcAxis2PlacementLinear. Perhaps some of the implementers in the group have some insights and can reinvigorate the issue discussions.

Default value for IfcAxis2PlacementLinear.Axis is not defined https://github.com/buildingSMART/IFC4.x-IF/issues/125

Are both or neither Axis and RefDirection required for IfcAxis2PlacementLinear https://github.com/buildingSMART/IFC4.3.x-development/issues/732 https://github.com/buildingSMART/IFC4.3.x-development/issues/731

Documentation error in IfcSectionedSolidHorizontal https://github.com/buildingSMART/IFC4.x-IF/issues/147

SergejMuhic commented 3 months ago

@RickBrice this was communicated to bSI at submission of 4.3 RC4. They submitted without a fix. The Tunnel project and deployment with software vendors such as ESRI, Trimble, 12d etc. addressed, documented and implemented IfcLinearPlacement with these rules: https://github.com/bSI-InfraRoom/IFC-Specification/pull/843 - correct linear placement always referenced a local placement https://github.com/bSI-InfraRoom/IFC-Specification/pull/259 - concept template requires linear placement to be relative to the placement of a linear positioning element

This shall be accepted by bSI to the formal ISO documentation.

These files: https://github.com/bSI-InfraRoom/IFC-Tunnel-Deployment/pulls are already mostly validated with this logic since the toolkit and checker are derived automatically from the schema and ifc spec (with usages referencing CTs).

For IfcAxis2PlacementLinear, as with other IfcAxis2Placement siblings, both RefDirection and Axis are optional. The default values are corresponding to IfcPointByDistanceExpression where Axis=(0,0,1) global i. e. perpendicular to the global XY plane and RefDirection is the direction of the tangent of the curve on which the placement is.

As it says in the RefDirection documentation, it can be omitted even if there is an Axis present. This is different from its IfcAxis2Placement siblings that require either both RefDirection and Axis to be set or both to be unset. The default value of RefDirection is the tangent to the IfcPointByDistanceExpression.BasisCurve.

RickBrice commented 3 months ago

@SergejMuhic thank you - your input is always helpful and enlightening.

The default values are corresponding to IfcPointByDistanceExpression where Axis=(0,0,1) global i. e. perpendicular to the global XY plane

IfcPointByDistanceExpression doesn’t explicitly call out that default IfcAxis2PlacementLinear.Axis = (0,0,1), and I haven’t found it elsewhere in the specification. The closest thing I can find is IfcPointByDistanceExpression.OffsetVertical is defined as

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.

This says that “vertical” is perpendicular to the tangent of basis curve. For IfcGradientCurve and IfcSegmentedReferenceCurve the curve tangent is generally not parallel to the global XY plane and therefore perpendicular would not be (0,0,1). If “basis curve” is not IfcPointByDistanceExpression.BasisCurve but instead IfcPointByDistanceExpression.BasisCurve.BaseCurve for IfcGradientCurve or IfcPointByDistanceExpression.BasisCurve.BaseCurve.BaseCurve for IfcSegmentedReferenceCurve then IfcAxis2PlacementLinear.Axis defaulting to (0,0,1) makes sense.

I would say the readers of the specification are not will served by such an obscure way of defining IfcAxis2PlacementLinear.Axis when it is omitted. An explicit statement in the definition of IfcAxis2PlacementLinear.Axis would be much more effective.

Regarding default IfcAxis2PlacementLinear.RefDirection

The default value of RefDirection is the tangent to the IfcPointByDistanceExpression.BasisCurve.

Easy enough to understand and it makes sense it is different that its siblings. The basis curve provides an extra bit of geometry that the siblings don’t have. However, I think IfcSectionedSolidHorizontal doesn’t work with the default Axis and RefDirection as explained. When the IfcSectionedSolidHorizontal.CrossSections are defined with default Axis and RefDirections the orientation of the CrossSection isn’t correct to create an extrusion.

Documentation error in IfcSectionedSolidHorizontal https://github.com/buildingSMART/IFC4.x-IF/issues/147 Do you have any insight on that?

SergejMuhic commented 3 months ago

IfcPointByDistanceExpression doesn’t explicitly call out that default IfcAxis2PlacementLinear.Axis = (0,0,1), and I haven’t found it elsewhere in the specification. The closest thing I can find is

True. When modelling the definitions and writing the documentation I was under extreme time pressure where I was looking for acceptance first. I never finalized documentation, templates and usages unfortunately (I was the sole person doing this part). Before actually documenting it, there was an arbitrary decision to hand over and not finalize in the project. You are right, the default Axis is not (0,0,1) but perpendicular to the tangent, my bad. The default value is actually implied in the Axis description where it says that the default is the local z axis. To make it clearer it should say, local z axis as specified in the offsets of IfcPointByDistanceExpression.

My initial intent was using IfcPointOnCurve and IfcAxis2Placement3D but this was rejected in favour of a new point and a new placement definition. Consequently, the descriptions suffered a bit.

IfcAxis2PlacementLinear.Axis defaulting to (0,0,1) makes sense.

This actually was the initial intent but then IfcSectionedSolidHorizontal would unnecessarily require more complex IfcAxis2PlacementLinear instances since in bridge design the profiles are typically vertical. So, now we have two easy alternatives in IfcSectionedSolidHorizontal, either perpendicular to tangent (default) by omitting both RefDirection and Axis or vertical by just using Axis=(0,0,1) and omitting RefDirection.

Let me take a raincheck on the IfcSectionedSolidHorizontal issue. It is a bit late. But I will definitely look into it.