Map Representation
Overview
This functional part deals with the definition of a representation map (equivalent of a symbol or block) and the placement of copies of that representation map at multiple placement locations. Each representation map has an origin (normally 0.,0.,0.) and a representation (defined as for general forms of representation), which has a representation identifier and representation type, identifying its use within different representation views
The use of representation maps is significant within an IFC based exchange of information. The representation map provides a single entity to which shape definition(s) can be assigned. Copies of the representation map are made at the locations required with rotation and transformation applied as necessary.
Forms of representation can be replaced by representation maps, if the type concept, i.e. the use of an IfcMappedItem for sharing the geometric representation(s) of the type is used.
Results
A representation for a type product is defined and associated to the type product as a representation map. Occurrences of copies of the representation map are placed as mapped items with placement and transformation.
| Description | Entity/Pset/Functional Part | MAN | REC | OPT |
|---|---|---|---|---|
| Define the representation that is to be the representation map for the product type concerned. | IfcRepresentationMap.MappedRepresentation::IfcRepresentation | |||
| A representation map can be created using any form of representation allowed within the IFC model as a subtype of IfcRepresentation and therefore comprising a set of occurrences of IfcRepresentationItem. Refer to specific functional parts dealing with different forms of representation, for example: _* fp_represent_composite_curve_ _* fp_represent_faceted_brep_solid_model_ _* fp_represent_polyline_ |
IfcRepresentation.Items::IfcRepresentationItem | |||
| Set the mapping origin for the representation map. The mapping origin is a placement that defines the position about which the mapped representation is mapped |
IfcRepresentationMap.MappingOrigin::IfcAxis2Placement | |||
|
IfcMappedItem.MappingSource::IfcRepresentationMap | |||
| Set the transformation of the mapped item. A Cartesian transformation operator defines a geometric transformation composed of translation, rotation, mirroring and scaling. Note that IfcCartesianTransformationOperator is an abstract supertype. Achievement of transformation is through the use of subtypes as below._ |
IfcMappedItem.MappingTarget::IfcCartesianTransformationOperator | |||
| For all types of Cartesian transformation operation, the following attributes may be asserted: | ||||
|
<subtype>.Axis1::IfcDirection | |||
|
<subtype>.Axis2::IfcDirection | |||
|
<subtype>.LocalOrgin ? fp_represent_cartesian_point | |||
|
<subtype>.Scale::REAL | |||
|
<subtype>. Scl::REAL | |||
|
<subtype>.Dim::IfcDimensionCount | |||
| For a 2D transformation with uniform scaling | Use <subtype> = IfcCartesianTransformationOperator2D | |||
|
IfcCartesianTransformationOperator2D.U::IfcDirection | |||
| For a 2D transformation with non uniform scaling Attributes as below are in addition to those defined for IfcCartesianTransformationOperator2D |
Use <subtype> = IfcCartesianTransformationOperator2DnonUniform | |||
|
IfcCartesianTransformationOperator2DnonUniform.Scale2 ::REAL | |||
|
IfcCartesianTransformationOperator2DnonUniform.Scl2::REAL | |||
| For a 3D transformation with uniform scaling | Use <subtype> = IfcCartesianTransformationOperator3D | |||
|
IfcCartesianTransformationOperator3D.Axis3::IfcDirection | |||
|
IfcCartesianTransformationOperator3D.U ? IfcDirection | |||
| For a 3D transformation with non uniform scaling Attributes as below are in addition to those defined for IfcCartesianTransformationOperator3D |
Use <subtype> = IfcCartesianTransformationOperator3DnonUniform | |||
|
IfcCartesianTransformationOperator3DnonUniform.Scale2 ::REAL | |||
|
IfcCartesianTransformationOperator3DnonUniform.Scale3 ::REAL | |||
|
IfcCartesianTransformationOperator3DnonUniform.Scl2::REAL | |||
|
IfcCartesianTransformationOperator3DnonUniform.Scl3::REAL |
IFC Entities Required
- IfcAxis2Placement2d
- IfcAxis2Placement3d
- IfcCartesianTransformationOperator
- IfcCartesianTransformationOperator2D
- IfcCartesianTransformationOperator2DnonUniform
- IfcCartesianTransformationOperator3D
- IfcCartesianTransformationOperator3DnonUniform
- IfcDirection
- IfcGeometricRepresentationItem
- IfcMappedItem
- IfcRepresentation
- IfcRepresentationItem
- IfcRepresentationMap
- IfcShapeRepresentation
IFC Datatypes Required
- IfcAxis2Placement
- IfcDimensionCount
- IfcLabel
IFC Functions Required
- IfcBaseAxis
IFC Property Sets Required
- -
IDM Functional Parts Required
- fp_represent_cartesian_point
- fp_set_geometric_representation_context
EXPRESS-G
EXPRESS Schema
SCHEMA FP_MAP_REPRESENTATION;
TYPE IfcDimensionCount = INTEGER;
WHERE
WR1 : { 0 < SELF <= 3 };
END_TYPE;
TYPE IfcLabel = STRING;
END_TYPE;
TYPE IfcAxis2Placement = SELECT
(IfcAxis2Placement2d,
IfcAxis2Placement3d);
END_TYPE;
ENTITY IfcAxis2Placement2d;
RefDirection : OPTIONAL IfcDirection;
DERIVE
p : LIST [2:2] OF IfcDirection := IfcBuild2Axes(RefDirection);
WHERE
WR1 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 2);
WR2 : SELF\IfcPlacement.Location.Dim = 2;
END_ENTITY;
ENTITY IfcGeometricRepresentationItem
ABSTRACT SUPERTYPE OF (ONEOF(IfcCartesianTransformationOperator, IfcDirection))
SUBTYPE OF(IfcRepresentationItem);
END_ENTITY;
ENTITY IfcRepresentationItem
ABSTRACT SUPERTYPE OF (ONEOF(IfcGeometricRepresentationItem, IfcMappedItem));
END_ENTITY;
ENTITY IfcMappedItem
SUBTYPE OF(IfcRepresentationItem);
MappingSource : IfcRepresentationMap;
MappingTarget : IfcCartesianTransformationOperator;
END_ENTITY;
ENTITY IfcRepresentationMap;
MappingOrigin : IfcAxis2Placement;
MappedRepresentation : IfcRepresentation;
INVERSE
MapUsage : SET OF IfcMappedItem FOR MappingSource;
END_ENTITY;
ENTITY IfcRepresentation;
ContextOfItems : fp_set_geometric_representation_context;
RepresentationIdentifier : OPTIONAL IfcLabel;
RepresentationType : OPTIONAL IfcLabel;
Items : SET [1:?] OF IfcRepresentationItem;
END_ENTITY;
ENTITY IfcShapeRepresentation
SUBTYPE OF(IfcRepresentation);
WHERE
WR21 : 'IFC2X2_FINAL.IFCGEOMETRICREPRESENTATIONCONTEXT'
IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
WR22 : SIZEOF(QUERY(temp <* Items |
('IFC2X2_FINAL.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
AND (NOT(SIZEOF(
['IFC2X2_FINAL.IFCVERTEXPOINT',
'IFC2X2_FINAL.IFCEDGECURVE',
'IFC2X2_FINAL.IFCFACESURFACE'] * TYPEOF(temp)) = 1))
)) = 0;
WR23 : EXISTS(SELF\IfcRepresentation.RepresentationType);
WR24 : IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
END_ENTITY;
ENTITY IfcCartesianTransformationOperator
ABSTRACT SUPERTYPE OF (ONEOF(IfcCartesianTransformationOperator2D, IfcCartesianTransformationOperator3D))
SUBTYPE OF(IfcGeometricRepresentationItem);
Axis1 : OPTIONAL IfcDirection;
Axis2 : OPTIONAL IfcDirection;
LocalOrigin : fp_represent_cartesian_point;
Scale : OPTIONAL REAL;
DERIVE
Scl : REAL := NVL(Scale, 1.0);
Dim : IfcDimensionCount := LocalOrigin.Dim;
WHERE
WR1 : Scl > 0.0;
END_ENTITY;
ENTITY IfcCartesianTransformationOperator2D
SUBTYPE OF(IfcCartesianTransformationOperator);
DERIVE
U : LIST [2:2] OF IfcDirection := IfcBaseAxis(2,SELF\IfcCartesianTransformationOperator.Axis1,
SELF\IfcCartesianTransformationOperator.Axis2,?);
WHERE
WR1 : SELF\IfcCartesianTransformationOperator.Dim = 2;
WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR
(SELF\IfcCartesianTransformationOperator.Axis1.Dim = 2);
WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR
(SELF\IfcCartesianTransformationOperator.Axis2.Dim = 2);
END_ENTITY;
ENTITY IfcCartesianTransformationOperator2DnonUniform
SUBTYPE OF(IfcCartesianTransformationOperator2D);
Scale2 : OPTIONAL REAL;
DERIVE
Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
WHERE
WR1 : Scl2 > 0.0;
END_ENTITY;
ENTITY IfcDirection
SUBTYPE OF(IfcGeometricRepresentationItem);
DirectionRatios : LIST [2:3] OF REAL;
DERIVE
Dim : IfcDimensionCount := HIINDEX(DirectionRatios);
END_ENTITY;
ENTITY IfcCartesianTransformationOperator3D
SUBTYPE OF(IfcCartesianTransformationOperator);
Axis3 : OPTIONAL IfcDirection;
DERIVE
U : LIST [3:3] OF IfcDirection := IfcBaseAxis(3,SELF\IfcCartesianTransformationOperator.Axis1,
SELF\IfcCartesianTransformationOperator.Axis2,Axis3);
WHERE
WR1 : SELF\IfcCartesianTransformationOperator.Dim = 3;
WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR
(SELF\IfcCartesianTransformationOperator.Axis1.Dim = 3);
WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR
(SELF\IfcCartesianTransformationOperator.Axis2.Dim = 3);
WR4 : NOT(EXISTS(Axis3)) OR (Axis3.Dim = 3);
END_ENTITY;
ENTITY IfcCartesianTransformationOperator3DnonUniform
SUBTYPE OF(IfcCartesianTransformationOperator3D);
Scale2 : OPTIONAL REAL;
Scale3 : OPTIONAL REAL;
DERIVE
Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
Scl3 : REAL := NVL(Scale3, SELF\IfcCartesianTransformationOperator.Scl);
WHERE
WR1 : Scl2 > 0.0;
WR2 : Scl3 > 0.0;
END_ENTITY;
ENTITY IfcAxis2Placement3d;
Axis : OPTIONAL IfcDirection;
RefDirection : OPTIONAL IfcDirection;
DERIVE
p : LIST [3:3] OF IfcDirection := IfcBuildAxes(Axis, RefDirection);
WHERE
WR1 : SELF\IfcPlacement.Location.Dim = 3;
WR2 : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
WR3 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 3);
WR4 : (NOT (EXISTS (Axis))) OR (NOT (EXISTS (RefDirection))) OR (IfcCrossProduct(Axis,RefDirection).Magnitude > 0.0);
WR5 : NOT ((EXISTS (Axis)) XOR (EXISTS (RefDirection)));
END_ENTITY;
ENTITY fp_represent_cartesian_point;
END_ENTITY;
ENTITY fp_set_geometric_representation_context;
INVERSE
RepresentationsInContext : SET OF IfcRepresentation FOR ContextOfItems;
END_ENTITY;
FUNCTION IfcBaseAxis
(Dim : INTEGER;
Axis1, Axis2, Axis3 : IfcDirection)
: LIST [2:3] OF IfcDirection;
LOCAL
U : LIST [2:3] OF IfcDirection;
Factor : REAL;
D1, D2 : IfcDirection;
END_LOCAL;
IF (Dim = 3) THEN
D1 := NVL(IfcNormalise(Axis3), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
D2 := IfcFirstProjAxis(D1, Axis1);
U := [D2, IfcSecondProjAxis(D1, D2, Axis2), D1];
ELSE
IF EXISTS(Axis1) THEN
D1 := IfcNormalise(Axis1);
U := [D1, IfcOrthogonalComplement(D1)];
IF EXISTS(Axis2) THEN
Factor := IfcDotProduct(Axis2, U[2]);
IF (Factor < 0.0) THEN
U[2].DirectionRatios[1] := -U[2].DirectionRatios[1];
U[2].DirectionRatios[2] := -U[2].DirectionRatios[2];
END_IF;
END_IF;
ELSE
IF EXISTS(Axis2) THEN
D1 := IfcNormalise(Axis2);
U := [IfcOrthogonalComplement(D1), D1];
U[1].DirectionRatios[1] := -U[1].DirectionRatios[1];
U[1].DirectionRatios[2] := -U[1].DirectionRatios[2];
ELSE
U := [IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0, 0.0]),
IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0, 1.0])];
END_IF;
END_IF;
END_IF;
RETURN(U);
END_FUNCTION;
END_SCHEMA;