Definition from ISO/CD 10303-42:1992: A composite curve (IfcCompositeCurve) is a collection of curves joined end-to-end. The individual segments of the curve are themselves defined as composite curve segments. The parameterization of the composite curve is an accumulation of the parametric ranges of the referenced bounded curves. The first segment is parameterized from 0 to l1, and, for i ³ 2, the ith segment is parameterized from
where lk is the parametric length (i.e., difference between maximum and minimum parameter values) of the curve underlying the kth segment.
NOTE Corresponding STEP entity: composite_curve, please refer to ISO/IS 10303-42:1994, p. 56 for the final definition of the formal standard. The WR2 is added to ensure consistent Dim at all segments.
HISTORY New class in IFC Release 1.0
Informal Propositions:
# | Attribute | Type | Cardinality | Description | A |
---|---|---|---|---|---|
1 | Segments | IfcCompositeCurveSegment | L[1:?] | The component bounded curves, their transitions and senses. The transition attribute for the last segment defines the transition between the end of the last segment and the start of the first; this transition attribute may take the value discontinuous, which indicates an open curve. | X |
2 | SelfIntersect | LOGICAL | [1:1] | Indication of whether the curve intersects itself or not; this is for information only. | X |
NSegments :=SIZEOF(Segments) | INTEGER | [1:1] | The number of component curves. | X | |
ClosedCurve :=Segments[NSegments].Transition <> Discontinuous | LOGICAL | [1:1] | Indication whether the curve is closed or not; this is derived from the transition code of the last segment. | X |
Rule | Description |
---|---|
WR41 | No transition code should be Discontinuous, except for the last code of an open curve. |
WR42 | Ensures, that all segments used in the curve have the same dimensionality. |
# | Attribute | Type | Cardinality | Description | A |
---|---|---|---|---|---|
IfcRepresentationItem | |||||
IfcGeometricRepresentationItem | |||||
IfcCurve | |||||
Dim :=IfcCurveDim(SELF) | IfcDimensionCount | [1:1] | The space dimensionality of this abstract class, defined differently for all subtypes, i.e. for IfcLine, IfcConic and IfcBoundedCurve. | X | |
IfcBoundedCurve | |||||
IfcCompositeCurve | |||||
1 | Segments | IfcCompositeCurveSegment | L[1:?] | The component bounded curves, their transitions and senses. The transition attribute for the last segment defines the transition between the end of the last segment and the start of the first; this transition attribute may take the value discontinuous, which indicates an open curve. | X |
2 | SelfIntersect | LOGICAL | [1:1] | Indication of whether the curve intersects itself or not; this is for information only. | X |
NSegments :=SIZEOF(Segments) | INTEGER | [1:1] | The number of component curves. | X | |
ClosedCurve :=Segments[NSegments].Transition <> Discontinuous | LOGICAL | [1:1] | Indication whether the curve is closed or not; this is derived from the transition code of the last segment. | X |
<xs:element name="IfcCompositeCurve" type="ifc:IfcCompositeCurve" substitutionGroup="ifc:IfcBoundedCurve" nillable="true"/>
<xs:complexType name="IfcCompositeCurve">
<xs:complexContent>
<xs:extension base="ifc:IfcBoundedCurve">
<xs:sequence>
<xs:element name="Segments">
<xs:complexType>
<xs:sequence>
<xs:element ref="ifc:IfcCompositeCurveSegment" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="ifc:itemType" fixed="ifc:IfcCompositeCurveSegment"/>
<xs:attribute ref="ifc:cType" fixed="list"/>
<xs:attribute ref="ifc:arraySize" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="SelfIntersect" type="ifc:logical" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
ENTITY IfcCompositeCurve
SUBTYPE OF (IfcBoundedCurve);
Segments : LIST [1:?] OF IfcCompositeCurveSegment;
SelfIntersect : LOGICAL;
DERIVE
NSegments : INTEGER := SIZEOF(Segments);
ClosedCurve : LOGICAL := Segments[NSegments].Transition <> Discontinuous;
WHERE
WR41 : ((NOT ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 1)) OR ((ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 0));
WR42 : SIZEOF( QUERY( Temp <* Segments | Temp.Dim <> Segments[1].Dim)) = 0;
END_ENTITY;