# Ifc Syntax Materials

> Use when you need to assign, read, or debug materials on IFC elements : a plain named material, a layered build-up for a wall or slab, a profiled cross-section for a beam or column, a constituent set for a window or door, or material properties. Prevents the most common material errors : attaching a layer-set or profile-set usage to a type object instead of an occurrence, manually serializing the derived TotalThickness, writing IfcMaterialList in a new IFC4 file, and using the deleted IFC2x3 material-property subtypes. Covers IfcMaterial, IfcRelAssociatesMaterial, the IfcMaterialSelect abstraction, the layered family (IfcMaterialLayerSet / IfcMaterialLayer / IfcMaterialLayerSetUsage), the profiled family (IfcMaterialProfileSet / IfcMaterialProfile / IfcMaterialProfileSetUsage / IfcCardinalPointReference), the constituent family (IfcMaterialConstituentSet / IfcMaterialConstituent), legacy IfcMaterialList, IfcMaterialProperties, and IFC2x3 / IFC4 / IFC4.3 version differences. Keywords: IFC materials, IfcMateria

- Skill: `impertio-studio/ifc-syntax-materials` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add impertio-studio/ifc-syntax-materials`
- Raw SKILL.md: https://api.skillmd.com/api/skills/impertio-studio/ifc-syntax-materials/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: Impertio-Studio (https://skillmd.com/u/impertio-studio)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/impertio-studio/ifc-syntax-materials

---


# IFC Syntax : Materials

IFC carries the material of an element with two parts : a **material definition**
(what the element is made of) and an **objectified relationship**
(`IfcRelAssociatesMaterial`) that binds that definition to one or more elements.
The material definition is never a child of the element ; it floats in the file and
is linked.

This skill covers the plain `IfcMaterial`, the three structured material families
(layered, profiled, constituent), the legacy `IfcMaterialList`, and
`IfcMaterialProperties`.

Applies to IFC2x3, IFC4, and IFC4.3. The profiled and constituent families and
several attributes are IFC4 additions : see the Version Differences section.

## Quick Reference

### The association pattern

`IfcRelAssociatesMaterial` binds a material definition to elements. Verified verbatim
(IFC4.3) :

```
ENTITY IfcRelAssociatesMaterial
 SUBTYPE OF (IfcRelAssociates);
	RelatingMaterial : IfcMaterialSelect;
 WHERE
	AllowedElements : ...RelatedObjects restricted to IfcElement,
		IfcElementType, IfcStructuralMember, IfcPort;
	NoVoidElement : RelatedObjects must not contain
		IfcFeatureElementSubtraction or IfcVirtualElement;
END_ENTITY;
```

- `RelatedObjects` (`SET [1:?] OF IfcDefinitionSelect`, inherited from
  `IfcRelAssociates`) : the elements or element types receiving the material.
- `RelatingMaterial` (`IfcMaterialSelect`) : the material definition assigned.

ALWAYS share one `IfcRelAssociatesMaterial` across many objects when they take the
same material : `RelatedObjects` is a set. NEVER point `RelatedObjects` at an
`IfcFeatureElementSubtraction` (an opening) or an `IfcVirtualElement` : the
`NoVoidElement` rule rejects it.

### IfcMaterialSelect

`IfcMaterialSelect` is the abstraction in `RelatingMaterial`. The assigned material is
not always a plain `IfcMaterial` :

```
IfcMaterialSelect (SELECT)
├── IfcMaterial                    one homogeneous substance
├── IfcMaterialLayerSet            an ordered layer stack          (for types)
├── IfcMaterialLayerSetUsage       a positioned layer stack        (for occurrences)
├── IfcMaterialProfileSet          a set of cross-section profiles (for types)   [IFC4+]
├── IfcMaterialProfileSetUsage     a positioned profile set        (for occurrences) [IFC4+]
├── IfcMaterialConstituentSet      named composite parts                          [IFC4+]
└── IfcMaterialList                a bare list of materials                  (legacy)
```

The two **usage** entities (`IfcMaterialLayerSetUsage`, `IfcMaterialProfileSetUsage`)
are restricted to element **occurrences** ; the bare **set** entities go on the
element **type**. See the set-on-type rule below.

### IfcMaterial

Verified verbatim (IFC4.3) :

```
ENTITY IfcMaterial
 SUBTYPE OF (IfcMaterialDefinition);
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	Category : OPTIONAL IfcLabel;
 INVERSE
	HasRepresentation : SET [0:1] OF IfcMaterialDefinitionRepresentation FOR RepresentedMaterial;
	IsRelatedWith : SET [0:?] OF IfcMaterialRelationship FOR RelatedMaterials;
	RelatesTo : SET [0:1] OF IfcMaterialRelationship FOR RelatingMaterial;
END_ENTITY;
```

- `Name` is required ; `Description` and `Category` are optional.
- `Category` is a broad grouping (`'concrete'`, `'steel'`, `'aluminium'`).
- In **IFC2x3** `IfcMaterial` had only `Name` : `Description` and `Category` are
  IFC4 additions.

### Layered materials : walls, slabs, roofs, plates

`IfcMaterialLayerSet` is the ordered stack ; `IfcMaterialLayer` is one layer ;
`IfcMaterialLayerSetUsage` positions the stack relative to the element.

```
ENTITY IfcMaterialLayerSet
 SUBTYPE OF (IfcMaterialDefinition);
	MaterialLayers : LIST [1:?] OF IfcMaterialLayer;
	LayerSetName : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
 DERIVE
	TotalThickness : IfcLengthMeasure := IfcMlsTotalThickness(SELF);
END_ENTITY;
```

`TotalThickness` is **DERIVED** : it is computed from the layer thicknesses by the
function `IfcMlsTotalThickness`. NEVER serialize a value for it.

```
ENTITY IfcMaterialLayer
 SUBTYPE OF (IfcMaterialDefinition);
	Material : OPTIONAL IfcMaterial;
	LayerThickness : IfcNonNegativeLengthMeasure;
	IsVentilated : OPTIONAL IfcLogical;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	Category : OPTIONAL IfcLabel;
	Priority : OPTIONAL IfcInteger;
 WHERE
	NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
END_ENTITY;
```

- `LayerThickness` is required. `IsVentilated` is `TRUE` for a ventilated air gap,
  `UNKNOWN` for a non-ventilated air gap, `FALSE` for solid material.
- `Priority` (when present) MUST be in `[0..100]` (`NormalizedPriority` rule) ; it
  governs which layer wins at element joints.
- `IfcMaterialLayerSetUsage` carries `ForLayerSet`, `LayerSetDirection`
  (`IfcLayerSetDirectionEnum` : `AXIS1` / `AXIS2` / `AXIS3`), `DirectionSense`
  (`IfcDirectionSenseEnum` : `POSITIVE` / `NEGATIVE`), `OffsetFromReferenceLine`
  (`IfcLengthMeasure`), and optional `ReferenceExtent`.

In **IFC2x3** `IfcMaterialLayer` had only `Material`, `LayerThickness` (typed
`IfcPositiveLengthMeasure`), and `IsVentilated` : `Name`, `Description`, `Category`,
and `Priority` are IFC4 additions, and `LayerThickness` was widened to
`IfcNonNegativeLengthMeasure` in IFC4.

Full layered-family signatures : see `references/methods.md`.

### Profiled materials : beams, columns, members, piles  (IFC4+)

The profiled family was **introduced in IFC4** and does NOT exist in IFC2x3.

```
ENTITY IfcMaterialProfileSet
 SUBTYPE OF (IfcMaterialDefinition);
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	MaterialProfiles : LIST [1:?] OF IfcMaterialProfile;
	CompositeProfile : OPTIONAL IfcCompositeProfileDef;
END_ENTITY;
```

```
ENTITY IfcMaterialProfile
 SUBTYPE OF (IfcMaterialDefinition);
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	Material : OPTIONAL IfcMaterial;
	Profile : IfcProfileDef;
	Priority : OPTIONAL IfcInteger;
	Category : OPTIONAL IfcLabel;
 WHERE
	NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
END_ENTITY;
```

- `Profile` (`IfcProfileDef`) is the required cross-section. See
  `ifc-syntax-geometry-profiles` for `IfcProfileDef`.
- `IfcMaterialProfileSetUsage` carries `ForProfileSet`, optional `CardinalPoint`
  (`IfcCardinalPointReference`), and optional `ReferenceExtent`.

`IfcCardinalPointReference` is a **defined type over INTEGER**, NOT an enumeration :

```
TYPE IfcCardinalPointReference = INTEGER;
 WHERE
	GreaterThanZero : SELF > 0;
END_TYPE;
```

Index meaning : `1`-`9` bounding-box points (bottom / mid-depth / top, each
left / centre / right) ; `10`-`14` geometric centroid and aligned variants ;
`15`-`19` shear-centre and aligned variants ; `20` lowest point inside a pipe or
channel profile. Other index values are outside the specification's scope.

### Constituent materials : windows, doors, composite parts  (IFC4+)

For composite elements that are **neither layered nor profiled** (a window : frame +
glazing + sealant). `IfcMaterialConstituentSet` and `IfcMaterialConstituent` were
**introduced in IFC4** ; they replace `IfcMaterialList` for this purpose.

```
ENTITY IfcMaterialConstituentSet
 SUBTYPE OF (IfcMaterialDefinition);
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	MaterialConstituents : OPTIONAL SET [1:?] OF IfcMaterialConstituent;
END_ENTITY;
```

```
ENTITY IfcMaterialConstituent
 SUBTYPE OF (IfcMaterialDefinition);
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	Material : IfcMaterial;
	Fraction : OPTIONAL IfcNormalisedRatioMeasure;
	Category : OPTIONAL IfcLabel;
END_ENTITY;
```

`IfcMaterialConstituent.Material` is required ; `Fraction` is the fraction of total
volume or weight as an `IfcNormalisedRatioMeasure` (`[0..1]`).

### IfcMaterialList : the IFC2x3 legacy mechanism

```
ENTITY IfcMaterialList;
	Materials : LIST [1:?] OF IfcMaterial;
END_ENTITY;
```

`IfcMaterialList` is a bare ordered list of materials with no per-part semantics,
fractions, thicknesses, or geometry. It is the **IFC2x3** composite mechanism. It is
retained in IFC4 only for round-tripping IFC2x3 data. ALWAYS use
`IfcMaterialConstituentSet` for a new IFC4+ composite. An `IfcMaterialList` in a new
IFC4 file is a smell : see `references/anti-patterns.md`.

### IfcMaterialProperties

```
ENTITY IfcMaterialProperties
 SUBTYPE OF (IfcExtendedProperties);
	Material : IfcMaterialDefinition;
END_ENTITY;
```

Supertype chain : `IfcPropertyAbstraction` → `IfcExtendedProperties` →
`IfcMaterialProperties`. It inherits `Name` (`OPTIONAL IfcIdentifier`), `Description`
(`OPTIONAL IfcText`), and `Properties` (`SET [1:?] OF IfcProperty`).

**IFC4 change :** in IFC2x3 material properties used specialised abstract subtypes
(`IfcMechanicalMaterialProperties`, `IfcThermalMaterialProperties`,
`IfcHygroscopicMaterialProperties`, `IfcGeneralMaterialProperties`,
`IfcOpticalMaterialProperties`). IFC4 **deleted all of those**, made
`IfcMaterialProperties` a single non-abstract entity, and widened `Material` from
`IfcMaterial` to `IfcMaterialDefinition` so properties can attach to layers,
profiles, constituents, and their sets. NEVER write the deleted subtypes in IFC4+.

### The set-on-type, usage-on-occurrence rule

For layered and profiled elements the model splits the material across two levels :

- The element **type** (`IfcWallType`, `IfcBeamType`, ...) is associated with the
  bare set (`IfcMaterialLayerSet` or `IfcMaterialProfileSet`).
- Each element **occurrence** (`IfcWall`, `IfcBeam`, ...) is associated with a
  **usage** (`IfcMaterialLayerSetUsage` / `IfcMaterialProfileSetUsage`) that points
  back at the same set via `ForLayerSet` / `ForProfileSet` and adds placement.

ALWAYS put the usage on the occurrence and the bare set on the type. NEVER associate
an `IfcMaterialLayerSetUsage` or `IfcMaterialProfileSetUsage` with an element type :
the IFC specification restricts the usage entities to occurrences.

### Version differences (compact)

| Item | IFC2x3 | IFC4 | IFC4.3 |
|------|--------|------|--------|
| `IfcMaterial.Description`, `.Category` | absent | present | present |
| `IfcMaterialLayer.Name/.Description/.Category/.Priority` | absent | present | present |
| `IfcMaterialLayer.LayerThickness` type | `IfcPositiveLengthMeasure` | `IfcNonNegativeLengthMeasure` | `IfcNonNegativeLengthMeasure` |
| `IfcMaterialLayerSet.Description` | absent | present | present |
| Profiled family (`IfcMaterialProfileSet` etc.) | absent | present | present |
| Constituent family (`IfcMaterialConstituentSet` etc.) | absent | present | present |
| `IfcMaterialProperties` | abstract, typed subtypes | one non-abstract entity | one non-abstract entity |
| `IfcMaterialList` | composite mechanism | legacy, retained | legacy, retained |

## Decision Trees

### Which material definition for a given element?

```
What is the element made of?
|
+-- One homogeneous substance (a solid concrete footing)
|   --> IfcMaterial, associated directly.
|
+-- Parallel layers with thickness (wall, slab, roof, plate)
|   --> IfcMaterialLayerSet on the type;
|       IfcMaterialLayerSetUsage on each occurrence.
|
+-- A cross-section profile extruded along an axis (beam, column, pile)  [IFC4+]
|   --> IfcMaterialProfileSet on the type;
|       IfcMaterialProfileSetUsage on each occurrence.
|
+-- Named composite parts, not layered, not profiled (window, door)  [IFC4+]
|   --> IfcMaterialConstituentSet with one IfcMaterialConstituent per part.
|
+-- A plain list of materials, IFC2x3 round-trip only
    --> IfcMaterialList. NEVER author this fresh in IFC4+.
```

### Set or usage : which goes where?

```
Are you associating a layer-set or profile-set?
|
+-- The target is an element TYPE (IfcWallType, IfcBeamType)
|   --> associate the bare set (IfcMaterialLayerSet / IfcMaterialProfileSet).
|
+-- The target is an element OCCURRENCE (IfcWall, IfcBeam)
    --> associate the usage (IfcMaterialLayerSetUsage / IfcMaterialProfileSetUsage),
        whose ForLayerSet / ForProfileSet points back at the type's set.
```

### Is this attribute mine to write?

```
About to write a value for IfcMaterialLayerSet.TotalThickness?
|
+-- ALWAYS stop : TotalThickness is DERIVED (IfcMlsTotalThickness).
    The reader computes it from the layer thicknesses. NEVER serialize it.
```

## Patterns

### Pattern : Associate a plain material

ALWAYS create one `IfcMaterial` with a required `Name`, then bind it with one
`IfcRelAssociatesMaterial` whose `RelatingMaterial` is that `IfcMaterial` and whose
`RelatedObjects` lists the elements.
ALWAYS reuse one `IfcRelAssociatesMaterial` across every element that shares the
material : `RelatedObjects` is a set.
NEVER duplicate an identical `IfcMaterial` per element : create it once and reference
it.

### Pattern : Build a layered wall or slab

ALWAYS model a layered element with `IfcMaterialLayerSet` holding an ordered
`MaterialLayers` list ; each `IfcMaterialLayer` carries a `Material` and a
`LayerThickness`.
ALWAYS associate the bare `IfcMaterialLayerSet` with the element **type** and an
`IfcMaterialLayerSetUsage` with each **occurrence** ; the usage's `ForLayerSet`
points at the same `IfcMaterialLayerSet`.
NEVER write a value for the derived `TotalThickness`.
NEVER attach the `IfcMaterialLayerSetUsage` to the type : usage is occurrence-only.

### Pattern : Build a profiled beam or column  (IFC4+)

ALWAYS model a profiled element with `IfcMaterialProfileSet` holding
`MaterialProfiles` ; each `IfcMaterialProfile` carries a required `Profile`
(`IfcProfileDef`) and an optional `Material`.
ALWAYS associate the bare `IfcMaterialProfileSet` with the element type and an
`IfcMaterialProfileSetUsage` with each occurrence ; set `CardinalPoint` to align the
profile to the member axis when needed.
NEVER use the profiled family in an IFC2x3 file : it does not exist before IFC4.

### Pattern : Build a constituent set for a window or door  (IFC4+)

ALWAYS model a non-layered, non-profiled composite with `IfcMaterialConstituentSet` ;
add one `IfcMaterialConstituent` per part (frame, glazing, sealant), each with a
required `Material` and an optional `Name` naming the part.
NEVER use `IfcMaterialList` for a new composite : `IfcMaterialConstituentSet` carries
the per-part names, fractions, and categories that `IfcMaterialList` cannot.

### Pattern : Attach material properties

ALWAYS attach material properties with `IfcMaterialProperties`, whose `Material`
references the `IfcMaterialDefinition` (a material, layer, profile, or constituent)
and whose `Properties` set holds `IfcProperty` instances.
ALWAYS use the single non-abstract `IfcMaterialProperties` entity in IFC4 and IFC4.3.
NEVER write `IfcMechanicalMaterialProperties`, `IfcThermalMaterialProperties`,
`IfcHygroscopicMaterialProperties`, `IfcGeneralMaterialProperties`, or
`IfcOpticalMaterialProperties` in IFC4+ : those subtypes were deleted in IFC4.

### Pattern : Honour the version differences

ALWAYS check the target schema before writing a material structure : the profiled
and constituent families and several attributes are IFC4 additions.
ALWAYS write only `IfcMaterial.Name` in IFC2x3 : `Description` and `Category` were
added in IFC4.
NEVER carry an `IfcMaterialList` into a freshly authored IFC4+ model : it is a legacy
artefact kept only for round-tripping IFC2x3 data.

## Reference Links

- `references/methods.md` : the complete verified entity definitions for the layered,
  profiled, and constituent families side by side, `IfcRelAssociatesMaterial`,
  `IfcMaterial`, `IfcMaterialProperties`, `IfcMaterialList`, the `IfcMaterialSelect`
  and `IfcMaterialDefinition` trees, the `IfcCardinalPointReference` index table, and
  the per-version difference matrix.
- `references/examples.md` : worked STEP scenarios : a plain material association, a
  three-layer wall with type and occurrence, a steel beam profile set, a window
  constituent set, material properties, and an IFC2x3 `IfcMaterialList`.
- `references/anti-patterns.md` : the failure modes this skill prevents, each with the
  reason it fails.

### Official sources

- IfcMaterial : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterial.htm
- IfcRelAssociatesMaterial : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRelAssociatesMaterial.htm
- IfcMaterialLayerSet : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialLayerSet.htm
- IfcMaterialLayer : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialLayer.htm
- IfcMaterialLayerSetUsage : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialLayerSetUsage.htm
- IfcMaterialProfileSet : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialProfileSet.htm
- IfcMaterialProfile : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialProfile.htm
- IfcMaterialProfileSetUsage : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialProfileSetUsage.htm
- IfcCardinalPointReference : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcCardinalPointReference.htm
- IfcMaterialConstituentSet : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialConstituentSet.htm
- IfcMaterialConstituent : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialConstituent.htm
- IfcMaterialProperties : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcMaterialProperties.htm
- IfcMaterialList (IFC2x3) : https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifcmaterialresource/lexical/ifcmateriallist.htm

### Related skills

- `ifc-syntax-geometry-profiles` : `IfcProfileDef`, the cross-section that
  `IfcMaterialProfile.Profile` requires.
- `ifc-syntax-property-sets` : `IfcProperty` and the property entities that
  `IfcMaterialProperties.Properties` holds.
- `ifc-impl-data-enrichment` : the workflow for adding materials to an existing model.
- `ifc-errors-property-set-mistakes` : material and property failure modes in real
  files.

