IfcIO.Scene is not part of this release. nuget.org refused IfcIO.Scene 0.11.0 because the upper bound of its IOScene range, 0.2.0-0, is not a version nuget.org accepts in a dependency; IfcIO 0.11.0 and IfcIO.Cli 0.11.0 were published. IfcIO.Scene is first published with 0.11.1.
Added
IfcIO.Scene: IfcSceneReader converts an IFC file or IfcModel into an IOScene SceneDocument in metres with Z up (GlobalIds as SourceId and IfcGuid, storeys as levels and tree nodes, property and quantity sets keyed ifc:, materials, 4D schedules), with diagnostics for elements without geometry. See docs/scene-adapter.md.
IfcIO.Scene NuGet package: published on the IfcIO release tag and depends on exactly the same IfcIO version ([X.Y.Z]). It references IOScene with the range [0.1.0, 0.2.0-0); a release that would depend on an IOScene preview fails.
Fixed
- World placement of geometry read from IFC (
IfcModel.Open): element meshes are now in world coordinates. Previously object placements were ignored and every element sat at its local origin.
IfcLocalPlacement chains (PlacementRelTo) are resolved up to the root, relative to the WorldCoordinateSystem of the 3D Model representation context.
IfcMappedItem applies MappingOrigin and MappingTarget (IfcCartesianTransformationOperator 2D/3D, uniform and non-uniform scale, mirroring).
- The full
IfcAxis2Placement3D of extruded and revolved solids is applied (it was location only), as are rotated IfcAxis2Placement2D profile positions of extrusions and non-vertical extrusion directions. IfcAxis1Placement locations of revolution axes are read (they were always zero).
- The first operand of
IfcBooleanResult / IfcBooleanClippingResult honours a rotated Position; such an operand is kept as FirstMesh instead of a misoriented FirstSolid.
- All items of the
Body representation are merged (only the first item was read). IfcFaceBasedSurfaceModel and IfcShellBasedSurfaceModel are read.
IfcDistributionPort.Position and Direction are the port's world placement (they were always the origin and +Z).
- Length unit read from IFC:
IfcModel.LengthUnit comes from the project's IfcUnitAssignment (IfcSIUnit with any prefix, IfcConversionBasedUnit). It was always Millimetre. Units with no IfcLengthUnit value (for example centimetres) are converted to metres while reading, together with storey elevations.
- MEP elements are read: IFC2x3
IfcFlowSegment, IfcFlowFitting, IfcFlowTerminal, IfcFlowController, IfcFlowMovingDevice, IfcFlowStorageDevice, IfcFlowTreatmentDevice, IfcEnergyConversionDevice, IfcDistributionChamberElement, IfcDistributionControlElement and IFC4 IfcPipeFitting, IfcDuctFitting were skipped.
Changed
- GLB export follows glTF 2.0 units and axes: positions are written in metres (converted from
IfcModel.LengthUnit) with +Y up (IFC (x, y, z) becomes (x, z, -y)). Vertices are stored relative to the centre of the model, and the root node carries that centre as translation, so georeferenced models keep millimetre precision in 32-bit floats. GLB files of millimetre models were previously 1000 times too large and lying on their side.
- OBJ export is unchanged: model length units, Z up, now with world-placed geometry.
IfcElement.Solid, RevolvedSolid and BooleanResult of read elements still describe the first body item in its own coordinates (only the Mesh is world-placed). Writing a read model back therefore still places those solids without the element placement, as before.
- Malformed placement data (a
PlacementRelTo cycle, an IfcMappedItem cycle or mapping nested deeper than 64 levels) makes IfcModel.Open throw InvalidDataException. So does geometry that expands to more than 1,000,000 + 256 vertices per STEP entity, which guards against nested IfcMappedItem amplification.
- For length units without an
IfcLengthUnit value, only geometry and storey elevations are converted to metres; quantities and property values stay in file units. Such elements get no Solid / RevolvedSolid / BooleanResult (those would stay in file units), so saving writes the metre Mesh.
- Documentation: the README lists the frozen extras (HTML viewer, GLB/OBJ export, clash, measure, grids, diff, BCF), which get bug fixes only, and their planned replacements.