Introduction
In FME 2026.1, we are simplifying the geometry model by extracting geometry instance functionality from IFMEAggregate into a new dedicated class, IFMEGeometryInstance. Prior to 2026.1, IFMEAggregate could represent either a collection of geometries or a single geometry instance. bool IFMEAggregate::hasGeometryInstance(bool) const; could be used to distinguish between the two states.
Summary of Changes
IFMEAggregate now only contains a collection of IFMEGeometry objects. The following methods on IFMEAggregate, which were specific to the deprecated geometry instance state, have been marked as deprecated and will return false or perform no operations:
Deprecated IFMEAggregate Methods:
bool hasGeometryInstance(bool recursive) constbool setGeometryDefinitionReference(const FME_UInt32 gdReference)bool getGeometryDefinitionReference(FME_UInt32& gdReference) constvoid setGeometryInstanceLocalOrigin(FME_Real64 x, FME_Real64 y, FME_Real64 z)bool getGeometryInstanceLocalOrigin(FME_Real64 &x, FME_Real64 &y, FME_Real64 &z) constvoid setGeometryInstanceMatrix(const FME_Real64 m[3][4])bool getGeometryInstanceMatrix(FME_Real64 m[3][4]) const
To get equivalent geometry instance support, any code that used these methods should be updated to use the new IFMEGeometryInstance class, which provides equivalent methods. This might involve adding an extra FME_Status visitGeometryInstance(IFMEGeometryInstance& geometryInstance) or FME_Status visitGeometryInstance(const IFMEGeometryInstance& geometryInstance) method to any existing geometry visitors.
Impact & Recommended Action
| Impact | Recommended Action |
|---|---|
Deprecated methods on IFMEAggregate no longer perform any actions. | Replace usage with the equivalent methods on IFMEGeometryInstance. |
| Existing geometry visitor implementations do not handle geometry instances explicitly. | Update visitors to add visitGeometryInstance(...) handlers. |
Migration Steps
1. Update SDK
Point your project to the FME 2026.1 SDK include and library paths.
2. Search & Replace
For each occurrence of
hasGeometryInstance(...)
setGeometryDefinitionReference(...)
setGeometryInstanceMatrix(...)
3. Replace with IFMEGeometryInstance
Refactor affected code to explicitly create and work with IFMEGeometryInstance.
4. Update Geometry Visitors
If your code uses geometry visitors, add support for geometry instances by implementing one or both of the following methods:
FME_Status visitGeometryInstance(IFMEGeometryInstance& geometryInstance)
FME_Status visitGeometryInstance(const IFMEGeometryInstance& geometryInstance)
5. Review ::isCollection() Behaviour
Prior to 2026.1, IFMEAggregate::isCollection() would always return true.
In 2026.1, IFMEGeometryInstance::isCollection() returns true only if the geometry definition referenced by the geometry instance is itself a collection.
Third-party developers should review any logic that depends on isCollection() and verify that this change in behavior does not affect program flow or assumptions made about geometry structure.
Before / After Example
// ----- Pre-2026.1 -----
if (aggregate.hasGeometryInstance(false))
{
aggregate.setGeometryInstanceLocalOrigin(x, y, z);
}
// ----- 2026.1 Migration -----
IFMEGeometryInstance* geometryInstance = gFMEGeometryTools.createGeometryInstance();
geometryInstance->setLocalOrigin(x, y, z);Where gFMEGeometryTools is a reference to your IFMEGeometryTools object