diff --git a/IFC4x3/Sections/Domain specific data schemas/Schemas/IfcStructuralElementsDomain/Entities/IfcTendonConduit/DocEntity.xml b/IFC4x3/Sections/Domain specific data schemas/Schemas/IfcStructuralElementsDomain/Entities/IfcTendonConduit/DocEntity.xml index 4c4a6010d..6f1e11bd3 100644 --- a/IFC4x3/Sections/Domain specific data schemas/Schemas/IfcStructuralElementsDomain/Entities/IfcTendonConduit/DocEntity.xml +++ b/IFC4x3/Sections/Domain specific data schemas/Schemas/IfcStructuralElementsDomain/Entities/IfcTendonConduit/DocEntity.xml @@ -19,3 +19,4 @@ + diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcCompositeCurveSegment/DocEntity.xml b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcCompositeCurveSegment/DocEntity.xml index 4c9777558..a7824a351 100644 --- a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcCompositeCurveSegment/DocEntity.xml +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcCompositeCurveSegment/DocEntity.xml @@ -24,3 +24,4 @@ + diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcGradientCurve/Documentation.md b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcGradientCurve/Documentation.md index 0efd0e517..ce3bd5184 100644 --- a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcGradientCurve/Documentation.md +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Entities/IfcGradientCurve/Documentation.md @@ -1,3 +1,5 @@ Gradient curve is a type of curve 3D curve representation that is based on its 2D projection (BaseCurve) and a height deifned by its gradient segments which can be derived from a function that retrieves it from the segment start height, its placement and the ParentCurve instance and the type of the ParentCurve. -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_. +(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_.) + +_IfcGradientCurve_ is parameterized in the curvilinear space of its _BaseCurve_. It is a sum of individual segment parameter lengths of _Segments_. diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/DocFunction.xml b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/DocFunction.xml new file mode 100644 index 000000000..88027d5c7 --- /dev/null +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/DocFunction.xml @@ -0,0 +1,3 @@ + + + diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Documentation.md b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Documentation.md new file mode 100644 index 000000000..4dc77d11b --- /dev/null +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Documentation.md @@ -0,0 +1 @@ +Factorial implementation "x!". diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Expression.txt b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Expression.txt new file mode 100644 index 000000000..bdad8ffb7 --- /dev/null +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcFactorial/Expression.txt @@ -0,0 +1,15 @@ +(IfcInteger Factor) : IfcInteger; + + LOCAL + Fac : IfcInteger := 1; + END_LOCAL; + + IF Factor = 0 THEN + RETURN 1; + END_IF; + + REPEAT i := 1 TO Factor + Fac = Fac * i; + END_REPEAT; + + RETURN Fac; diff --git a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcGradient/Expression.txt b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcGradient/Expression.txt index c4f1790d7..b87bfcb41 100644 --- a/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcGradient/Expression.txt +++ b/IFC4x3/Sections/Resource definition data schemas/Schemas/IfcGeometryResource/Functions/IfcGradient/Expression.txt @@ -1,2 +1,37 @@ -(GradientCurve : IfcGradientCurve) : IfcLengthMeasure; - RETURN(1); +(GradientCurve : IfcGradientCurve, Position : IfcCurveMeasureSelect) : IfcLengthMeasure; + + REPEAT i := 1 TO (SIZEOF(GradientCurve.Segments) - 1); + Segment : IfcCurveSegment := GradientCurve.Segments[i]; + NextSegment : IfcCurveSegment := GradientCurve.Segments[i + 1]; + Location : IfcCartesianPoint := NextSegment\IfcCurveSegment.Placement\IfcAxis2Placement2D.Location\IfcCartesianPoint; + SegmentPlacement : IfcAxis2Placement2D := Segment.Placement\IfcAxis2Placement2D; + SegDistAlong : IfcParameterValue := SegmentPlacement.Location\IfcCartesianPoint.Coordinates[1]; + + IF (Location.Coordinates[1] > Position) + CASE TRUE OF + + 'IFCCIRCLE' IN TYPEOF(Segment.ParentCurve) : + BEGIN + RETURN SegmentPlacement.Location\IfcCartesianPoint.Coordinates[2] + Segment.ParentCurve.Radius * (COS(ACOS(SegmentPlacement.P[1][1]) / 2 - Segment.SegmentLength) - (Position - SegDistAlong)); + END; + + 'IFCCLOTHOID' IN TYPEOF(Segment.ParentCurve) : + BEGIN + RETURN SegmentPlacement.Location\IfcCartesianPoint.Coordinates[2] + 3 ** -1 * Segment.SegmentLength ** 3 + (3 * IfcFactorial(7)) ** -1 * Segment.SegmentLength ** 7 + (5 * IfcFactorial(11)) ** -1 * Segment.SegmentLength ** 11; + END; + + 'IFCLINE' IN TYPEOF(Segment.ParentCurve) : + BEGIN + RETURN SegmentPlacement.Location\IfcCartesianPoint.Coordinates[2] + Segment.ParentCurve\IfcLine.Pnt[2] + Segment.ParentCurve\IfcLine.Dir.Orientation.DirectionRatios[2] * Segment.ParentCurve\IfcLine.Dir.Magnitude * Segment.ParentCurve\IfcLine.Dir.Orientation.DirectionRatios[2] * (Position - SegDistAlong) / Segment.ParentCurve\IfcLine.Dir.Orientation.DirectionRatios[1]; + END; + + 'IFCPOLYLINE' IN TYPEOF(Segment.ParentCurve) : + BEGIN + RETURN SegmentPlacement.Location\IfcCartesianPoint.Coordinates[2] + (Position - SegDistAlong) * (Segment.ParentCurve.Points[2].Coordinates[2] - Segment.ParentCurve.Points[1].Coordinates[2]) / (Segment.ParentCurve.Points[2].Coordinates[1] - Segment.ParentCurve.Points[1].Coordinates[1]); + END; + + OTHERWISE : RETURN(?); + END_CASE; + END_IF; + END_REPEAT; + RETURN(?);