Skip to content

Element Catalog

Every element has a typed, validated spec in millimeters. Parametric physical elements build analytical brepjs solids in local coordinates; civil spatial elements are body-less, and Earthworks Fill accepts an arbitrary validated body. Placement is applied downstream via IfcLocalPlacement.

ElementMethodNotes
WalladdWallLength along axisX, openings cut via addDoor / addWindow
SlabaddSlabFLOOR / ROOF / LANDING / BASESLAB; slab openings via parseSlabOpeningInput
BeamaddBeamProfile extruded along axisX by length
ColumnaddColumnProfile extruded along axisZ by height
RoofaddRoofFlat slab, or shaped (shed / gable / hip / dome) when pitch is present
Curtain walladdCurtainWallPanel and mullion grid
SpaceaddSpaceRoom volumes for zoning and COBie
Footing / pileaddFooting / addPileFoundations
StairaddStairOne or more flights, each a stepped sawtooth solid with its own placement
RampaddRampFlights like stairs, inclined slabs
RailingaddRailingPosts + rails with infill: 'POSTED', or a single swept panel
CoveringaddCoveringFinishes: flooring, cladding, ceilings
BridgeaddBridgeIFC4X3 spatial facility; no independent Body
Bridge partaddBridgePartIFC4X3 recursive spatial part with mandatory usage type
Earthworks filladdEarthworksFillIFC4X3 typed arbitrary Product Body, material, and spatial containment
ProxyaddProxyAnything else, carrying arbitrary brepjs geometry

Doors and windows are not free-standing: addDoor / addWindow take a host wall, cut the opening as a boolean void, and wire IfcRelVoidsElement + IfcRelFillsElement.

Profiles

Beams and columns extrude a profile, one vocabulary shared by both:

  • Core: RECTANGULAR, CIRCULAR, I_BEAM (with optional root filletRadius)
  • Extended: L / T / U / Z / C shapes, asymmetric I, ellipse, trapezium, hollow rectangular and circular sections, and arbitrary polygons with voids

Every named profile emits its own parametric IFC profile def, extended kinds included: IfcRectangleProfileDef / IfcCircleProfileDef / IfcIShapeProfileDef for the core three, and IfcLShapeProfileDef, IfcTShapeProfileDef, IfcUShapeProfileDef, IfcZShapeProfileDef, IfcCShapeProfileDef, IfcAsymmetricIShapeProfileDef, IfcEllipseProfileDef, IfcTrapeziumProfileDef, IfcRectangleHollowProfileDef and IfcCircleHollowProfileDef for the rest. The section stays editable parametric data in the exported file rather than a baked outline.

Only the two point-list kinds serialize as outlines, which is inherent to what they are: ARBITRARY_CLOSED becomes IfcArbitraryClosedProfileDef and ARBITRARY_WITH_VOIDS becomes IfcArbitraryProfileDefWithVoids.

On the brepjs side, extendedProfileToFace builds the section face for the solid and extendedProfileArea gives closed-form areas for takeoff.

Shaped roofs

pitch opts a roof into shaped geometry for its predefinedType: a right-trapezoid prism (shed), a house-pentagon prism (gable), a convex-hull hip with the ridge along the longer side, or a faceted dome. Without pitch the roof is a flat slab whatever the type says. Shaped roofs and posted railings serialize as tessellated bodies; everything else stays parametric IfcExtrudedAreaSolid.

Placement and display

Element geometry is unplaced template geometry. A wall's Body starts at the local origin and runs along local +X regardless of where the wall stands; origin / axisX / axisZ live in the spec and become IfcLocalPlacement. Wall and railing .geometry is a ProductBody: narrow geometry.kind to distinguish one PARAMETRIC solid from a non-empty EXACT solid collection. bodySolids() borrows Product-local handles from either branch. Do not dispose them.

Use takeExactProductBody() to replace a parametric wall or railing Body. A successful call transfers ownership of every supplied solid to the model; a failed call leaves the model and caller ownership unchanged. Register wall openings first. Once a wall has an exact Body, later addDoor() and addWindow() calls return EXACT_WALL_BODY_IMMUTABLE.

familiesToBim() performs that sequence automatically for civil-semantic walls and railings when given bodyEvaluator (or proxyEvaluator). Those routes require an evaluator: missing it returns FAMILIES_PRODUCT_BODY_EVALUATOR_REQUIRED instead of falling back to a parametric envelope. Conventional archetype walls and railings remain specification-authoritative. When the evaluator is present, the adapter compares the evaluated authored Body with the post-opening parametric Body in Product-local coordinates. Coincident bodies stay parametric; different bodies preserve every exact item without losing their typed category.

placedSolids(element) returns fresh, caller-owned solids transformed by the element's own placement. For an element beneath a placed spatial structure, pass its cumulative frame as placedSolids(element, { parentFrame }) to obtain world coordinates for display or clash checks. Exact Product Bodies return one placed copy per Body item. Stairs and ramps return one per flight, and curtain walls return their panels and mullions. Elements that are purely relational (doors, windows, groups, spatial containers) return an empty list rather than an error.

Data layers

Beyond geometry, elements carry: property sets from IFC pset templates with typed measures, quantity sets for takeoff, materials (simple, layer sets, profile sets), classification references (Uniclass, OmniClass, and friends), surface styles, and zone / system membership. Stable identity comes from deterministic GUIDs: deriveIfcGuid for content-derived ids, newIfcGuid for random ones.

Released under the Apache 2.0 License.