What Is IFC?
IFC — Industry Foundation Classes — is an open, vendor-neutral standard for exchanging Building Information Modeling (BIM) data between software applications in the architecture, engineering, and construction (AEC) industry. Developed by buildingSMART International (formerly IAI), IFC is standardized as ISO 16739-1:2018 and represents the primary mechanism for interoperability between the dozens of BIM software tools in use worldwide.
Where formats like DWG are proprietary to Autodesk, IFC is open: any software vendor can implement it, and the schema is publicly available. A building model designed in Autodesk Revit can be exported to IFC and opened in ArchiCAD, ALLPLAN, FreeCAD, or a structural analysis tool — without purchasing licenses for the original software.
IFC Serialization Formats
IFC data can be serialized in three ways:
| Format | Extension | Description |
|---|---|---|
| STEP Physical File | .ifc |
ASCII text, human-readable, dominant format |
| ifcXML | .ifcxml |
XML serialization of the same schema |
| ifcZIP | .ifczip |
ZIP-compressed .ifc or .ifcxml |
The STEP Physical File (SPF) format — defined by ISO 10303-21 — is by far the most common. A .ifc file is a plain text file you can open in any editor, though its STEP syntax is not designed for human authoring:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('office_building.ifc','2024-03-15T14:30:00',
('Arch Team'),(''),'IfcOpenShell 0.7.0','','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1= IFCPROJECT('3j$4Hk2mL8BvXqRt0sN7Wp',#2,'Office Building',$,$,$,$,(#20),#7);
#2= IFCOWNERHISTORY(#3,#6,$,.ADDED.,$,$,$,1710510600);
#7= IFCUNITASSIGNMENT((#8,#9,#10));
#8= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
...
Every entity is identified by a #number reference. Relationships between entities use these references — #1= IFCPROJECT(...) creates a project, and its properties reference other entity numbers.
Version History
| Version | Year | Status |
|---|---|---|
| IFC 1.0 | 1997 | Historical |
| IFC 2x | 2000 | Historical |
| IFC 2x2 | 2003 | Historical |
| IFC 2x3 | 2006 | Widely supported — still dominant in practice |
| IFC 4 (IFC 4.0) | 2013 | Current standard, ISO 16739-1:2018 |
| IFC 4.1 | 2015 | Addendum |
| IFC 4.3 | 2021 | Extended for infrastructure (roads, rails, bridges) |
IFC 2x3 remains the most commonly used version in practice because most BIM software implemented it before IFC 4 was finalized. When exchanging files, always verify which version your software supports — an IFC 4 export from Revit may not open correctly in software that only reads IFC 2x3.
Core Entity Types
IFC organizes building elements into a class hierarchy. The most important entities:
Spatial structure:
IfcProject— root entity, defines units and coordinate systemIfcSite— the geographic siteIfcBuilding— a building on the siteIfcBuildingStorey— a floor/levelIfcSpace— a room or bounded space
Building elements:
IfcWall,IfcWallStandardCase— wallsIfcSlab— floors, ceilings, roof slabsIfcColumn,IfcBeam— structural membersIfcDoor,IfcWindow— openings with componentsIfcStair,IfcRamp— vertical circulationIfcRoof— roof elements
MEP (mechanical, electrical, plumbing):
IfcPipeSegment,IfcDuctSegment— pipework and ductworkIfcLightFixture,IfcElectricDistributionBoardIfcAirTerminal,IfcBoiler,IfcChiller
Geometry Representations
IFC supports multiple geometry representations per element, ranked by complexity:
IfcProduct
└── IfcProductDefinitionShape
└── IfcShapeRepresentation (RepresentationType='SweptSolid')
└── IfcExtrudedAreaSolid
├── SweptArea: IfcRectangleProfileDef (0.25m × 3.0m)
└── ExtrudedDirection: (0,0,1) — vertical
└── Depth: 2.8 (metres)
The most common solid representation is IfcExtrudedAreaSolid — a 2D profile swept along a direction. Walls, columns, and beams are typically modeled this way. More complex shapes use IfcFacetedBrep (boundary representation with triangulated faces) or IfcMappedItem (instanced geometry for repeated elements like windows).
Property Sets (Psets)
IFC separates geometry from non-geometric data via Property Sets — standardized groups of properties attached to elements:
IfcWall #245
├── Pset_WallCommon
│ ├── Reference: "EW_200mm_RC"
│ ├── IsExternal: TRUE
│ ├── LoadBearing: TRUE
│ ├── FireRating: "REI90"
│ └── AcousticRating: "Rw 52 dB"
└── Pset_MaterialConcrete
├── CompressiveStrength: 30 MPa
└── WaterCementRatio: 0.45
Standard Psets are defined by buildingSMART — Pset_WallCommon, Pset_SlabCommon, Pset_DoorCommon etc. Custom Psets allow vendors and owners to attach project-specific data without breaking interoperability.
Reading IFC with IfcOpenShell
IfcOpenShell is the dominant open-source IFC library, available for Python, C++, and via command-line tools:
import ifcopenshell
import ifcopenshell.util.element as elem
# Open an IFC file
model = ifcopenshell.open("office_building.ifc")
print(f"Schema: {model.schema}") # IFC4 or IFC2X3
# List all walls
walls = model.by_type("IfcWall")
print(f"Wall count: {len(walls)}")
for wall in walls[:5]:
print(f" GUID: {wall.GlobalId}")
print(f" Name: {wall.Name}")
# Get property set values
psets = elem.get_psets(wall)
if "Pset_WallCommon" in psets:
print(f" External: {psets['Pset_WallCommon'].get('IsExternal')}")
print(f" Fire rating: {psets['Pset_WallCommon'].get('FireRating')}")
# Get all spaces with area
spaces = model.by_type("IfcSpace")
for space in spaces:
qsets = elem.get_psets(space, qtos_only=True)
if "Qto_SpaceBaseQuantities" in qsets:
area = qsets["Qto_SpaceBaseQuantities"].get("NetFloorArea")
print(f" {space.Name}: {area:.1f} m²")
# Extract geometry for visualization
from ifcopenshell import geom
settings = geom.settings()
settings.set(settings.USE_WORLD_COORDS, True)
shape = geom.create_shape(settings, wall)
verts = shape.geometry.verts # flat list of XYZ coordinates
faces = shape.geometry.faces # flat list of triangle indices
BlenderBIM (Bonsai add-on) provides a full IFC authoring environment inside Blender — free and native IFC, not importing to a proprietary format first.
IFC in Practice: Common Workflows
Clash detection: Export structural model as IFC from Revit, architectural model as IFC from ArchiCAD, then load both into Navisworks or Solibri for automatic clash detection between beams and walls.
Energy simulation: Export IFC from Revit, import into EnergyPlus/OpenStudio via the geometry translation layer. IFC's IfcSpace boundary entities carry thermal zone information.
Quantity take-off: Extract Qto_WallBaseQuantities (length, height, volume, net side area) from IFC walls without needing the original authoring software.
Facility management: IFC4's IfcAsset and maintenance schedule entities allow handover of the completed building model to FM software for lifecycle management.
Limitations and Gotchas
- Lossy round-trips: Exporting from Revit to IFC and back to Revit loses Revit-specific families and parameters not mapped to IFC — IFC is an exchange format, not a round-trip format
- Geometry fidelity: Parametric curves (arcs, NURBS) are tessellated to faceted approximations during IFC export — the mesh accuracy depends on the tessellation tolerance setting
- Large file sizes: Complex buildings with detailed MEP systems can produce IFC files exceeding 1 GB, making them slow to parse with naive tools
- Coordinate offset: Large site coordinates (national grid coordinates) cause floating-point precision loss; always use the
IfcMapConversionentity and work in local coordinates with a known offset
Related conversions
Frequent conversions across the catalogue: