If I create a regular IfcProduct
subclass, I can nominate position using ObjectPlacement
and Representation
. The ObjectPlacement
allows an IfcAxis2Placement3D
which allows a Location
, and through the Axis
and RefDirection
, it allows to specify a “rotation” as well. I do not see any ability to specify scale.
The IfcProductRepresentation
allows a list of IfcRepresentation
(one per context). One option is to directly place an IfcShapeRepresentation
. This does not give me any placement / transformation capabilities, but does allow me to share the shape representation with other products.
Alternatively, I can place an IfcRepresentationMap
using an IfcMappedItem
. The IfcRepresentationMap
allows another IfcAxis2Placement3D
, where I can specify location and rotation. The IfcMappedItem
allows me to place an IfcCartesianTransformationOperator3D
. This again allows me to specify location, rotation (this time by specifying all axis), and scale. However, scale is a single IfcReal
, so I cannot scale along an axis.
This leads to a few questions:
- Most 3D geometric systems I’ve used have a local axis, and a global axis. In IFC, as shown above, there seems to be a global axis (e.g. through the world axis), and a local axis through ObjectPlacement. However, there also seems to be additional axes through the
IfcRepresentationMap
and indirectly through theIfcMappedItem
. I wonder if the number of axes can be reduced? - How come scale can only be defined at the
IfcMappedItem
level, and not at theObjectPlacement
level? - How come scale is only defined as a single value, and not as a per-axis value? How, then, would you handle “mirroring” transformations across a particular axis? Being able to mirror a shared representation would be very useful and efficient.
- In the
IfcAxis2Placement3D
, a location is specified first, followed by 2 axes. The third axis is derived. However, in theIfcCartesianTransformationOperator3D
, the 2 axes (though not the same 2 as theIfcAxis2Placement3D
) are specified first, followed by the location and scale. And only after that the third axis is specified, whereas it could be derived. Why is there this inconsistency in attribute order and axis derivation? - The
IfcShapeRepresentation
documentation saysUsing IfcRepresentationMap is the way to share one representation (often of type IfcShapeRepresentation) by many products.
, yet it is clearly possible to simply reference the sameIfcShapeRepresentation
without needing to create a representation map, thus achieving the ability to share the representation. Admittedly, you do lose the ability to perform a cartesian transformation, but that can be applied using theObjectPlacement
assuming the transformation is the same for all representations and you don’t need to apply a scale. I only see real benefits of using this method if you have many small shape representations put together to build up a larger representation. In reality, I don’t see vendors really offering this ability.
Thoughts?