Capabilities and status
This page is deliberately conservative. It exists so that an engineer — or a coding agent — can scope work against what the code does, not against what the IFC schema contains or a crate name suggests.
Status vocabulary
| Term | Meaning |
|---|---|
| Implemented | Executable behaviour with tests. Safe to build on. |
| Partial | A real vertical slice exists; named gaps return typed errors. |
| Scaffold | Module and crate ownership exist. No behaviour. Files are doc-comment placeholders that reserve a name so the architecture is reviewable. |
| Absent | Not present in the workspace at all. Not even a reserved name. |
A scaffold crate compiles, publishes, and appears in the feature list. It does not read, write, or interpret the entities its module names refer to.
Workspace census
Generated from the source tree by scripts/sync-capabilities.py, not estimated. "Stub files" counts source files of twelve lines or fewer — the placeholder shape described above. scripts/gate.sh fails if these numbers drift from the code.
| Crate | Source LOC | Files | Stub files | Test files | Status |
|---|---|---|---|---|---|
ifc-geometry | 31,395 | 103 | 3 | 34 | Partial |
ifc-structural | 3,397 | 33 | 14 | 12 | Implemented |
ifc-style | 3,322 | 31 | 0 | 5 | Implemented |
ifc-properties | 3,119 | 30 | 14 | 3 | Implemented |
ifc-alignment | 2,909 | 29 | 11 | 5 | Partial |
ifc-template-catalog | 2,726 | 29 | 3 | 10 | Implemented |
ifc-resource | 2,647 | 29 | 9 | 9 | Partial |
ifc-validate | 2,493 | 23 | 0 | 2 | Implemented |
ifc-material | 2,398 | 24 | 0 | 8 | Implemented |
ifc-classification | 2,203 | 20 | 4 | 3 | Implemented |
ifc-model | 2,083 | 25 | 5 | 10 | Implemented |
ifc-cost | 2,001 | 16 | 0 | 2 | Implemented |
ifc-schedule | 1,691 | 24 | 14 | 1 | Implemented |
ifc-systems | 1,586 | 20 | 5 | 2 | Implemented |
ifc-georef | 1,423 | 18 | 9 | 2 | Partial |
ifc-schema | 1,306 | 11 | 4 | 4 | Implemented |
ifc-constraint | 1,230 | 6 | 0 | 1 | Implemented |
ifc-spatial | 1,122 | 9 | 1 | 9 | Implemented |
ifc-xml | 1,045 | 6 | 0 | 3 | Implemented |
ifc-approval | 915 | 5 | 0 | 1 | Implemented |
openbim-ifc | 901 | 6 | 0 | 14 | Implemented |
ifc-author | 729 | 8 | 3 | 3 | Implemented |
ifc-step | 516 | 5 | 0 | 3 | Implemented |
0 of 23 crates are scaffolds.
They exist because the layering decision (see ADR 0005) prefers declaring the intended home of a domain up front over discovering it later, but they must never be mistaken for working code.
Core: model, codecs, schema
| Capability | Status | Evidence |
|---|---|---|
| Entity graph with positional attributes | Implemented | ifc-model::Model |
| Round-trip of entities the build does not understand | Implemented | openbim-ifc/tests/costing_roundtrip.rs (runs with no domain crate compiled) |
STEP (.ifc) read and write | Implemented | ifc-step; deterministic model order, finite scalar safeguards, generic syntax delegated to openbim-step |
| ifcXML read and write | Implemented | ifc-xml; explicit strict IFC4 ADD2 TC1 namespace profile and path-rich typed diagnostics; compatibility dialect is not claimed as generic XSD conformance |
| IFC-JSON | Absent | Would be a third Codec impl; no crate exists |
| EXPRESS schema metadata, subtype queries | Implemented | ifc-schema |
| GlobalId base-64 encode/decode | Implemented | ifc-model::guid |
| Spatial containment tree traversal | Implemented | ifc-spatial::SpatialTree; facade feature spatial. See below. |
| Objectified relationship traversal | Implemented | All 42 concrete IfcRel* families are read. Spatial composition, containment, coverings, space boundaries, element connection and interference, assignment, declaration and system service in ifc-spatial; association and definition in ifc-classification, ifc-material, ifc-properties, ifc-resource, ifc-approval and ifc-constraint; connectivity in ifc-systems and ifc-structural; sequencing in ifc-schedule and ifc-cost; feature attachment in the openbim-ifc reachability check. Slot positions are asserted against the shipped IFC2x3/IFC4/IFC4x3 schemas in ifc-spatial/tests/slot_layout.rs, and openbim-ifc/tests/relationship_census.rs fails if a family loses its reader. |
| Distribution systems, ports and connectivity | Implemented | ifc-systems reads systems and membership, ports through both IfcRelNests and the legacy IfcRelConnectsPortToElement, the connection network, flow roles and direction, zones with their WR1 membership rule, spatial containment vs referencing, and direction-aware upstream/downstream queries. Relationship-only: no geometry is read, so a geometry-free file still yields a full network. |
| Cost items, rates and rollups | Implemented | ifc-cost reads IfcCostItem nesting, IfcCostValue component trees with arithmetic operators, and totals a cost tree. Currencies are compared, never converted: a rollup mixing EUR and USD is refused. Typed drafts stage selected IFC4 values, items, schedules, nesting, and schedule assignments atomically. |
| Work schedules, tasks and sequencing | Implemented | ifc-schedule reads IfcWorkPlan/IfcWorkSchedule, IfcTask with IfcTaskTime, IfcRelSequence with signed lag, work calendars and events, and produces a deterministic execution order. Cycles report the offending path. |
| Transactional authoring | Implemented | ifc-model::Transaction stages structural edits, validates them against the projected end state, and applies them as a unit. A removal that would orphan a surviving reference is refused, as is a commit against a model whose revision moved since the transaction opened. ifc-model remains schema-agnostic; typed staging helpers live in domain crates, including classification, documents, libraries, materials, quantities, cost, style, structural, and resources. |
| Quantity authoring | Implemented | ifc-properties stages quantity writes onto a caller-owned transaction, so a takeoff spanning many elements lands atomically. The declared measure type is preserved on every write. |
| Schema validation | Implemented | ifc-validate checks references, required slots, aggregate shape, entity types, abstract instantiation, scalar forms and STRING(n) FIXED widths against the exact schema the file declares (IFC2x3 TC1, IFC4 ADD2 TC1, or IFC4X3 ADD2). Eighteen registered rule IDs cover ten native checks under a hard findings-storage cap, including external-reference identity, sequence endpoints, decomposition and assignment self-reference, material and path-connection priority bounds, and space-boundary physicality across all three concrete IfcRelSpaceBoundary subtypes. Aggregate bounds, arbitrary EXPRESS WHERE expressions, INVERSE semantics and other known gaps remain explicitly unsupported and reported; a clean report never implies full EXPRESS conformance. |
| Property sets and every property value family | Implemented | ifc-properties reads single, enumerated, bounded, list, table, reference and complex properties. The declared measure type (IfcLengthMeasure and friends) is retained, because it is the only statement of what a bare number means. |
| Occurrence/type property precedence | Implemented | An occurrence property set overrides a same-named set inherited from the object's type. The shadowed type set is kept, so a checker can explain why an effective value differs from the type default. |
| Quantities and unit resolution | Implemented | Simple and complex quantities, SI prefixes carried as exact decimal exponents, conversion-based and derived units. WR21 (unit matches quantity kind) and WR22 (non-negative value) breaches are reported; ifcopenshell.validate checks neither. Quantities are read as authored assertions and never computed from geometry. |
Type index (ids_of_type, of_type) | Implemented | Model::ids_of_type, backed by index/type_index.rs |
| Reverse-reference index ("who references me") | Implemented | ifc-model::ReverseIndex, built on demand; records the attribute slot |
| Bounded graph traversal with cycle reports | Implemented | ifc-model::{depth_first, breadth_first, find_cycle} with Budget/Stop |
| Dangling-reference detection | Implemented | Model::dangling_references |
| Schema-checked entity construction (authoring) | Implemented | ifc-author::EntityBuilder; facade feature author. See below. |
Authoring
Applications that generate IFC name attributes; the schema decides positions.
use ifc::EntityBuilder; // feature = "author"
let id = EntityBuilder::new(&schema, "IfcAnnotation")
.text("GlobalId", "3vB2YO$MX4xv5uCqZZG05x")
.text("Name", "Brandwand")
.insert(&mut model)?;Slot order comes from Schema::attributes, which returns inherited attributes first — the ordering positional STEP records depend on. IfcAnnotation gets seven slots because IFC4 declares seven, not because the caller counted.
Construction is refused, rather than silently accepted, for:
| Failure | Example |
|---|---|
| Unknown entity | IfcAnnotaton (typo) |
| Unknown attribute | IfcAnnotation.RefLatitude (belongs to IfcSite) |
| Attribute set twice | two Name calls, instead of a silent overwrite |
| Required attribute unset | IfcAnnotation with no GlobalId |
| Declared-type mismatch | a string where IfcLengthMeasure is declared |
| Scalar/aggregate confusion | a scalar where LIST OF is declared |
| Malformed GlobalId | not 22 characters in IFC's base-64 alphabet |
A refused build leaves the model untouched.
What this is not. WHERE rules, inverse attributes, uniqueness, and cross-entity consistency need a whole model rather than one entity; ifc-validate owns those. Value checking is deliberately permissive where a declared type cannot be resolved — see ADR 0007 for why authoring is a schema-layer concern and not a model-layer one.
Model::push remains public and unchecked, for the case where an application must write an entity the schema does not declare.
Spatial traversal
IFC stores no parent pointers: a wall does not name its storey, a relationship entity names both ends. ifc-spatial reads those relationships into a tree.
use ifc::{SpatialKind, SpatialTree}; // feature = "spatial"
let tree = SpatialTree::build(&model);
for storey in tree.of_kind(SpatialKind::Storey) {
for element in tree.elements_of(storey.id) {
// every element placed directly on this storey
}
}
tree.container_of(wall); // which storey is this wall on?
tree.ancestors(storey.id); // storey -> building -> site -> project
tree.elements_recursive(root); // everything beneath a containerThe trap this closes. The two relationships that build the tree disagree about slot order — IfcRelAggregates puts the parent in slot 4, IfcRelContainedInSpatialStructure puts it in slot 5. Reading one like the other inverts containment silently. The constants are asserted against IFC2x3, IFC4 and IFC4x3 in ifc-spatial/tests/slot_layout.rs; see ADR 0008.
Real files, not the ideal shape. Omitted sites, elements hung directly off a building, duplicate storeys, relationships naming absent entities, and containment cycles are all handled and, where they are defects, reported through orphans() and dangling() rather than dropped. One corpus fixture turned out to use IfcRelAggregates exclusively with no containment relationship at all; that case is pinned in tests/real_files.rs.
What this is not. It reports what the file says and never rejects it — cardinality and WHERE rules belong to ifc-validate. It groups elements; it does not interpret their geometry or properties.
Construction resources
With facade feature resource, ifc-resource selects IFC4 from the model header and exposes borrowed views for labor, equipment, crew, construction material, construction product, and subcontract occurrences. It resolves authored IfcResourceTime, validates and queries IfcRelAssignsToResource including its authored RelatedObjectsType category constraint, and walks resource composition through IfcRelNests with authored order plus explicit cycle, multiple-parent, depth, and node failures. Selected records and relationships can be created through schema-checked transaction-staged drafts; they reject duplicate GlobalId values and cycle/second-parent creation before staging. See the construction-resource guide.
This is a partial, deliberately bounded profile covering IFC4 and IFC4X3. It does not level or schedule resources, calculate costs/durations/quantities, interpret calendars, or claim IFC2X3 support (the schema does not declare the entities this crate projects).
Geometry
ifc-geometry is the one substantial domain crate. It resolves IFC units, placements, profiles, and representation relationships, then lowers implemented families into the neutral axiolid-model DAG.
Representation-item lowering
The dispatcher keeps coverage as data so it is auditable from one table (ifc-geometry/src/lower/dispatch.rs):
| Family | Status |
|---|---|
IfcExtrudedAreaSolid | Implemented |
IfcRevolvedAreaSolid | Implemented |
IfcBooleanResult | Implemented |
IfcBooleanClippingResult | Implemented |
IfcMappedItem | Implemented |
IfcFacetedBrep | Implemented |
IfcFacetedBrepWithVoids | Implemented |
IfcAdvancedBrep | Implemented |
IfcAdvancedBrepWithVoids | Implemented |
IfcHalfSpaceSolid | Implemented |
IfcBoxedHalfSpace | Implemented |
IfcPolygonalBoundedHalfSpace | Implemented |
IfcTriangulatedFaceSet | Implemented |
IfcPolygonalFaceSet | Implemented |
IfcCsgSolid | Implemented |
IfcSweptDiskSolid | Implemented |
IfcSweptDiskSolidPolygonal | Implemented |
IfcSurfaceCurveSweptAreaSolid | Implemented |
IfcBlock | Implemented |
IfcSphere | Implemented |
IfcRightCircularCylinder | Implemented |
IfcRightCircularCone | Implemented |
IfcRectangularPyramid | Implemented |
IfcBoundingBox | Implemented |
IfcExtrudedAreaSolidTapered | Implemented |
IfcRevolvedAreaSolidTapered | Implemented |
IfcFixedReferenceSweptAreaSolid | Implemented |
IfcSectionedSpine | Implemented |
IfcShellBasedSurfaceModel | Implemented |
IfcFaceBasedSurfaceModel | Implemented |
IfcGeometricSet | Implemented |
IfcGeometricCurveSet | Implemented |
IfcLine | Implemented |
IfcCircle | Implemented |
IfcEllipse | Implemented |
IfcPolyline | Implemented |
IfcIndexedPolyCurve | Implemented |
IfcCompositeCurve | Implemented |
IfcCompositeCurveOnSurface | Implemented |
IfcBoundaryCurve | Implemented |
IfcOuterBoundaryCurve | Implemented |
IfcTrimmedCurve | Implemented |
IfcOffsetCurve2D | Implemented |
IfcOffsetCurve3D | Implemented |
IfcPcurve | Partial — 2 authored form(s) refused; see variants |
IfcSurfaceCurve | Partial — 1 authored form(s) refused; see variants |
IfcIntersectionCurve | Implemented |
IfcSeamCurve | Implemented |
IfcBSplineCurveWithKnots | Implemented |
IfcRationalBSplineCurveWithKnots | Implemented |
IfcPlane | Implemented |
IfcCylindricalSurface | Implemented |
IfcSphericalSurface | Implemented |
IfcToroidalSurface | Implemented |
IfcSurfaceOfLinearExtrusion | Implemented |
IfcSurfaceOfRevolution | Implemented |
IfcRectangularTrimmedSurface | Implemented |
IfcCurveBoundedPlane | Implemented |
IfcCurveBoundedSurface | Implemented |
IfcBSplineSurfaceWithKnots | Implemented |
IfcRationalBSplineSurfaceWithKnots | Implemented |
IfcPointOnCurve | Implemented |
IfcPointOnSurface | Implemented |
Partially supported variants
Families marked Partial above lower some authored forms exactly and refuse others by name. This table is generated from the PARTIAL catalog in ifc-geometry/src/lower/dispatch.rs, and tests/lower_dispatch_corpus.rs drives the real lowering path for every row -- so a wrong disposition here fails CI rather than merely misinforming a reader.
Some of these refusals exist because the schema permits a combination the geometry cannot honour, rather than because the feature is unimplemented. Those are listed with their reasoning in Schema looseness.
| Family | Variant | Status | Rationale |
|---|---|---|---|
IfcPcurve | reference curve is an IfcPolyline | Admitted | an ordered 2D point sequence needs no evaluation |
IfcPcurve | reference curve is an IfcIndexedPolyCurve with no explicit Segments, or only IfcLineIndex segments | Admitted | reads identically to a plain ordered point sequence |
IfcPcurve | reference curve is an IfcLine, IfcCircle or IfcEllipse positioned by an IfcAxis2Placement2D | Admitted | defining values are read verbatim in the surface's own (u, v) domain with no unit conversion |
IfcPcurve | reference conic positioned by an IfcAxis2Placement3D | Refused | a 3D placement's axis has no meaning in a 2D parameter domain; admitting it would require inventing a projection |
IfcPcurve | reference curve is an IfcIndexedPolyCurve with an explicit IfcArcIndex segment | Admitted | a three-point arc composes exactly from a parameter-space circumcentre into Circle2 plus a Cartesian trim, mirroring the 3D path with no approximation |
IfcPcurve | reference curve is an explicit-knot IfcBSplineCurveWithKnots or IfcRationalBSplineCurveWithKnots | Admitted | every field is dimensionless or a curve parameter; knots already pass through the 3D path unscaled, and control points are read as raw (u, v) pairs |
IfcPcurve | reference curve is a trimmed or composite curve | Admitted | trim parameters and segments stay in the surface (u, v) domain, unscaled, so no dimensional contract is needed |
IfcPcurve | reference curve is a convention-only IfcBSplineCurve | Refused | a base spline carries no authored knot vector to preserve |
IfcSurfaceCurve | MasterRepresentation is Curve3D, PCurveS1, or PCurveS2 with the named side present | Admitted | each side pairs a surface with its own p-curve, so the neutral MasterRepresentation names S1 and S2 exactly |
IfcSurfaceCurve | MasterRepresentation is PCurveS2 with only one associated p-curve | Refused | the master names a parametric side the curve does not have; the schema calls this inconsistent, so it is refused rather than resolved to the remaining p-curve |
Coverage below is generated
The table above is derived from ifc-geometry/src/lower/dispatch.rs by scripts/sync-capabilities.py, and scripts/gate.sh fails when this page and that source disagree. It cannot drift from the code without breaking the build.
Unimplemented families return a typed GeometryError::Unsupported naming the source entity and the specific missing capability — never a panic, and never a silently substituted approximate shape.
Profile lowering
Swept solids reference a profile, so profile coverage bounds how much of a real model lowers. Steel sections carry their fillet radii, edge radii and flange slopes into the neutral model rather than being reduced to an outline, because a section without them has the wrong area and the wrong section modulus.
| Profile family | Status |
|---|---|
IfcArbitraryClosedProfileDef | Implemented |
IfcArbitraryOpenProfileDef | Implemented |
IfcArbitraryProfileDefWithVoids | Implemented |
IfcAsymmetricIShapeProfileDef | Implemented |
IfcCenterLineProfileDef | Implemented |
IfcCircleHollowProfileDef | Implemented |
IfcCircleProfileDef | Implemented |
IfcCompositeProfileDef | Implemented |
IfcCShapeProfileDef | Implemented |
IfcDerivedProfileDef | Implemented |
IfcEllipseProfileDef | Implemented |
IfcIShapeProfileDef | Implemented |
IfcLShapeProfileDef | Implemented |
IfcMirroredProfileDef | Implemented |
IfcRectangleHollowProfileDef | Implemented |
IfcRectangleProfileDef | Implemented |
IfcRoundedRectangleProfileDef | Implemented |
IfcTShapeProfileDef | Implemented |
IfcTrapeziumProfileDef | Implemented |
IfcUShapeProfileDef | Implemented |
IfcZShapeProfileDef | Implemented |
IfcProfileDef | Refused — generic profile declaration carries no concrete geometry to lower |
IfcArbitraryOpenProfileDef is implemented through the explicit lower_open_profile_node authored-path API. It is not an area profile and is therefore still refused when an extrusion or other area-based solid requests lower_profile.
Curves and placement
| Capability | Status | Module |
|---|---|---|
IfcPolyline, IfcIndexedPolyCurve | Implemented | exact line and three-point arc segments |
IfcCircle, IfcEllipse | Implemented | curve/conic.rs |
IfcLine | Implemented | curve/line.rs |
IfcTrimmedCurve | Implemented | curve/trimmed.rs |
IfcCompositeCurve | Implemented | curve/composite.rs |
Convention-only IfcBSplineCurve | Partial | typed view only; lowering does not invent absent knots |
IfcBSplineCurveWithKnots, IfcRationalBSplineCurveWithKnots | Implemented | curve/bspline.rs representation + exact neutral lowering |
IfcOffsetCurve2D/3D | Implemented | curve/offset.rs |
IfcPcurve, IfcSurfaceCurve, IfcIntersectionCurve | Partial | exact supported forms; typed refusal otherwise |
IfcAxis2Placement2D/3D | Implemented | resource/placement.rs |
IfcCartesianTransformationOperator* | Implemented | resource/operator.rs |
| Unit resolution (SI, conversion-based) | Implemented | units.rs |
Curves lower in nested and curve-representation paths
lower/curve.rs lowers polylines/indexed poly-curves, conics, lines, trims, composites, offsets and surface-associated curves, plus explicit-knot polynomial/rational B-splines into the neutral graph. Convention-only base splines remain unsupported. Curves reach this lowerer through a sweep directrix, a surface boundary, a B-rep edge, or an IfcGeometricCurveSet member.
Bare curves are dispatch targets for Curve2D, Curve3D, and plan representations. Selection remains explicit: callers choose Body or Plan; a plan curve never silently replaces a body.
Explicit-knot surfaces
| Capability | Status | Module |
|---|---|---|
Convention-only IfcBSplineSurface | Partial | typed view only. Lowering requires an explicit knot vector, so IfcBSplineSurfaceWithKnots lowers and the convention-only parent form does not: deriving the implied knots would be inventing geometry the file did not state. |
Representation selection
Two selectors, deliberately disagreeing:
use ifc::{select_shape_representation, select_plan_representation};
select_shape_representation(&model, wall)?; // -> the Body (3D viewer)
select_plan_representation(&model, wall)?; // -> the FootPrint (drawing)select_shape_representation prefers Body, then Facetation, then an unnamed representation, and refuses Axis/FootPrint so a 2D curve never silently replaces a solid.
select_plan_representation is its inverse. It prefers, in order:
- a
PLAN_IDENTIFIERSmatch inside aPLAN_VIEWsub-context — drawable geometry the author explicitly targeted at a plan; - otherwise the best
PLAN_IDENTIFIERSmatch in any context:Plan,Annotation,FootPrint,Axis.
The two rules are intersected, not ordered. Authorial intent selects between drawable candidates; it does not make a bounding box drawable. ArchiCAD writes Box/BoundingBox representations inside PLAN_VIEW sub-contexts, so a context-first rule returns those boxes and never reaches the identifier list.
It returns None for a solid-only or box-only product. That is the honest answer, not a failure: deriving a plan from a solid requires sectioning, which this library does not do — see R9b/R10 on the roadmap.
Representation context
| Capability | Status | Evidence |
|---|---|---|
IfcGeometricRepresentationContext | Implemented | RepresentationContext; identifier, type, precision, placement |
IfcGeometricRepresentationSubContext | Implemented | parent, target scale, target view |
TargetView (PLAN_VIEW, MODEL_VIEW, ...) | Implemented | typed enum; unknown constants preserved, not flattened |
| Authoring a plan sub-context | Partial | constructible via EntityBuilder; no dedicated helper |
use ifc::plan_contexts;
for context in plan_contexts(&model) {
context.target_scale(); // Some(0.01) for 1:100
context.precision(&model); // inherited from the parent context
}The * trap this closes. A sub-context redeclares six inherited attributes as DERIVED, and real files write them as *:
IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#1,$,.MODEL_VIEW.,$)* is not $ — it means "read this from my parent". Accessors that take &model (precision, world_coordinate_system, coordinate_space_dimension, true_north) walk ParentContext to resolve it. A consumer reading the slot directly gets the marker and loses the project's precision and placement. See ADR 0009.
Slot positions are asserted against IFC2x3, IFC4 and IFC4x3 in ifc-geometry/tests/context_slots.rs, including that the sub-context still inherits exactly six attributes — the off-by-six that would read TargetScale as the target view.
Presentation, annotation, and external references
These are the areas most relevant to drawing production and document/approval workflows. Presentation and annotation now have schema-resolved typed views and bounded transaction-staged authoring; rendering, drawing layout, and the approval resource remain outside the current domain contracts. External classification/document/library references have typed read/query/authoring coverage.
| Entity / concept | Status | Note |
|---|---|---|
IfcAnnotation | Implemented | Strict borrowed view and transaction-staged authoring; IFC4X3 PredefinedType remains version-conditional |
IfcTextLiteral, IfcTextLiteralWithExtent | Implemented | Strict literal/placement/path/extent views and transaction-staged authoring |
IfcAnnotationFillArea | Implemented | Type-checked outer/inner boundary views and transaction-staged authoring |
IfcCurveStyle, IfcFillAreaStyle | Implemented | Schema-resolved curve/font/fill/hatch/tile views; no rendering claim |
IfcSurfaceStyle and children | Implemented | RGB/factor, shading, rendering, lighting, refraction, and texture views; core surface graph authoring |
IfcPresentationLayerAssignment | Implemented | Layer membership/style/visibility view and styled-layer authoring |
IfcStyledItem | Implemented | Strict direct assignment view/writer and deterministic direct-over-layer resolution; IFC2x3 wrappers are explicit |
IfcShapeRepresentation | Absent | Generic Representation view exists; the subtype does not |
IfcGeometricRepresentationSubContext | Partial | Strict inherited view and plan-context query exist; authoring uses generic EntityBuilder, not a dedicated helper |
IfcLibraryReference | Implemented | Strict borrowed view and transaction-staged authoring |
IfcLibraryInformation | Implemented | Strict borrowed view and transaction-staged authoring |
IfcRelAssociatesLibrary | Implemented | Deterministic object lookup and transaction-staged authoring |
IfcExternalReference and IfcLibrarySelect | Implemented | Inherited fields are exposed by concrete views; select targets are type-checked |
IfcExternalReferenceRelationship | Implemented | ifc-classification owns strict selected projections, deterministic lookup, and transaction-staged authoring |
IfcApproval and selected approval relationships | Implemented | ifc-approval owns bounded IFC4 projections, queries, and transaction-staged authoring; the whole IfcApprovalResource schema is not claimed |
IfcMetric, IfcObjective, and selected constraint relationships | Implemented | ifc-constraint preserves typed metric values and stages bounded IFC4 authoring without evaluating constraints |
IfcClassificationReference | Implemented | Bounded hierarchy, explicit occurrence/type sources, and authoring |
Because ifc-model round-trips entities structurally, every row above reads and re-exports without loss. The status distinguishes that baseline from typed interpretation and authoring; only rows marked implemented expose those domain contracts.
Explicit non-goals
- A CAD modelling kernel. Booleans, tessellation, and NURBS evaluation live in Axiolid or its providers.
- Rendering, drawing layout, or paper-space composition.
- Vendored ISO or buildingSMART schema payloads (the contributing guide).
- Any C++ in the dependency graph.
How to verify a claim on this page
- Read the crate's public API and its
tests/directory. - Read the crate's PLAN.md — it records implementation state, unlike AGENTS.md which records stable contracts.
- Run the gate:
scripts/gate.sh. - For geometry coverage, read
ifc-geometry/src/lower/dispatch.rs; theIMPLEMENTEDandPLANNEDconstants are asserted by tests.