# Ifc Syntax Geometry Profiles

> Use when you need to define, choose, or debug a 2D cross-section profile in an IFC model : a rectangle or circle profile, a standard steel section (I, L, U, T, C, Z), a hollow section, an arbitrary free-form outline, a profile with holes, or a composite or derived profile. Prevents feeding a CURVE-type or open profile into a solid sweep, using an IfcLine as a profile boundary, declaring a hollow wall thicker than its radius, nesting a composite profile inside another composite, and mixing AREA and CURVE profiles in one composite. Covers IfcProfileDef and IfcProfileTypeEnum, IfcParameterizedProfileDef and the eleven concrete parameterized profiles, IfcArbitraryClosedProfileDef, IfcArbitraryOpenProfileDef, IfcArbitraryProfileDefWithVoids, IfcCompositeProfileDef, IfcDerivedProfileDef, and the IFC2x3 / IFC4 / IFC4.3 version differences. Keywords: IFC profile, IfcProfileDef, IfcProfileTypeEnum, AREA, CURVE, IfcParameterizedProfileDef, IfcRectangleProfileDef, IfcCircleProfileDef, IfcIShapeProfileDef, IfcLShapeProfi

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

---


# IFC Syntax : Geometry Profiles

A profile is the 2D cross-section that an IFC swept solid moves through space to
produce a 3D shape. Walls, slabs, beams, columns, footings, and pipes are nearly all
modelled as a profile plus a sweep. This skill covers the profile entities, the
required-versus-optional attributes, the `WHERE` rules they must satisfy, and the
IFC2x3 / IFC4 / IFC4.3 version differences.

Applies to IFC2x3, IFC4, and IFC4.3. A few attributes and subtypes changed across
versions : see the Version Differences section.

A profile carries the shape only; the sweep that turns it into a solid is covered by
`ifc-syntax-geometry-swept-solid`.

## Quick Reference

### IfcProfileDef : the supertype

`IfcProfileDef` is the abstract supertype of every profile. Verified verbatim
(IFC4.3) :

```
ENTITY IfcProfileDef
 SUPERTYPE OF (ONEOF
	(IfcArbitraryClosedProfileDef
	,IfcArbitraryOpenProfileDef
	,IfcCompositeProfileDef
	,IfcDerivedProfileDef
	,IfcOpenCrossProfileDef
	,IfcParameterizedProfileDef));
	ProfileType : IfcProfileTypeEnum;
	ProfileName : OPTIONAL IfcLabel;
 INVERSE
	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
	HasProperties : SET [0:?] OF IfcProfileProperties FOR ProfileDefinition;
END_ENTITY;
```

- `ProfileType` is required and is an `IfcProfileTypeEnum` value : `AREA` (the
  profile encloses a region and can be swept into a solid) or `CURVE` (the profile
  is a 1D outline, swept only into a surface).
- `ProfileName` is an optional human-readable designation (e.g. `'HEA200'`).
- `HasProperties` (inverse) links the profile to `IfcProfileProperties` carrying
  structural section properties.

ALWAYS set `ProfileType = AREA` for a profile that feeds a solid sweep. NEVER feed a
`CURVE`-type profile into an `IfcSweptAreaSolid` : the `SweptAreaType` `WHERE` rule
rejects it.

`IfcOpenCrossProfileDef` is an IFC4.3 addition and is out of scope for this skill.

### IfcParameterizedProfileDef : standard sections

`IfcParameterizedProfileDef` is abstract. It adds one attribute and is the supertype
of the eleven standard sections. Verified verbatim (IFC4.3) :

```
ENTITY IfcParameterizedProfileDef
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAsymmetricIShapeProfileDef
	,IfcCShapeProfileDef
	,IfcCircleProfileDef
	,IfcEllipseProfileDef
	,IfcIShapeProfileDef
	,IfcLShapeProfileDef
	,IfcRectangleProfileDef
	,IfcTShapeProfileDef
	,IfcTrapeziumProfileDef
	,IfcUShapeProfileDef
	,IfcZShapeProfileDef))
 SUBTYPE OF (IfcProfileDef);
	Position : OPTIONAL IfcAxis2Placement2D;
END_ENTITY;
```

- `Position` is the 2D placement coordinate system in which the named parameters are
  interpreted. In **IFC4 and IFC4.3** it is `OPTIONAL`; in **IFC2x3** it is required.
  See Version Differences.

### The concrete parameterized profiles

Every profile below also inherits `ProfileType`, `ProfileName`, and `Position`. The
required-attribute summary (IFC4.3) :

| Profile | Required attributes | Use |
|---------|--------------------|-----|
| `IfcRectangleProfileDef` | `XDim`, `YDim` | rectangular sections, walls, slabs |
| `IfcCircleProfileDef` | `Radius` | round bars, columns, pipes |
| `IfcEllipseProfileDef` | `SemiAxis1`, `SemiAxis2` | elliptical sections |
| `IfcIShapeProfileDef` | `OverallWidth`, `OverallDepth`, `WebThickness`, `FlangeThickness` | I / H steel beams |
| `IfcLShapeProfileDef` | `Depth`, `Thickness` | steel angle sections |
| `IfcUShapeProfileDef` | `Depth`, `FlangeWidth`, `WebThickness`, `FlangeThickness` | channel / U sections |
| `IfcTShapeProfileDef` | `Depth`, `FlangeWidth`, `WebThickness`, `FlangeThickness` | tee sections |
| `IfcCShapeProfileDef` | `Depth`, `Width`, `WallThickness`, `Girth` | cold-formed lipped channels |
| `IfcZShapeProfileDef` | `Depth`, `FlangeWidth`, `WebThickness`, `FlangeThickness` | Z / zed sections |

`IfcRectangleHollowProfileDef` (subtype of `IfcRectangleProfileDef`) adds
`WallThickness`. `IfcCircleHollowProfileDef` (subtype of `IfcCircleProfileDef`) adds
`WallThickness`. Full attribute lists, optional attributes, and `WHERE` rules : see
`references/methods.md`.

### The arbitrary profiles

For cross-sections that no parameterized profile describes :

- `IfcArbitraryClosedProfileDef` : a single closed outline. Attribute `OuterCurve`
  (`IfcCurve`). Subtype of `IfcProfileDef` directly, so it has no `Position`.
- `IfcArbitraryProfileDefWithVoids` : subtype of `IfcArbitraryClosedProfileDef`,
  adds `InnerCurves` (`SET [1:?] OF IfcCurve`) for holes.
- `IfcArbitraryOpenProfileDef` : an open outline. Attribute `Curve`
  (`IfcBoundedCurve`). Its `WHERE` rule forces `ProfileType = CURVE`.

Verified verbatim (IFC4.3) :

```
ENTITY IfcArbitraryClosedProfileDef
 SUPERTYPE OF (ONEOF (IfcArbitraryProfileDefWithVoids))
 SUBTYPE OF (IfcProfileDef);
	OuterCurve : IfcCurve;
 WHERE
	WR1 : OuterCurve.Dim = 2;
	WR2 : NOT('IFC4X3_DEV.IFCLINE' IN TYPEOF(OuterCurve));
	WR3 : NOT('IFC4X3_DEV.IFCOFFSETCURVE2D' IN TYPEOF(OuterCurve));
END_ENTITY;
```

ALWAYS give `OuterCurve` a closed 2D curve (`IfcPolyline`, `IfcCompositeCurve`, or
`IfcIndexedPolyCurve`). NEVER use an `IfcLine` : `WR2` rejects it because a line is
not closed.

### Composite and derived profiles

- `IfcCompositeProfileDef` : two or more profiles combined into one. Attribute
  `Profiles` (`SET [2:?] OF IfcProfileDef`), optional `Label`.
- `IfcDerivedProfileDef` : a profile produced by applying a 2D transformation to a
  parent. Attributes `ParentProfile` (`IfcProfileDef`), `Operator`
  (`IfcCartesianTransformationOperator2D`), optional `Label`.

Verified verbatim (IFC4.3) :

```
ENTITY IfcCompositeProfileDef
 SUBTYPE OF (IfcProfileDef);
	Profiles : SET [2:?] OF IfcProfileDef;
	Label : OPTIONAL IfcLabel;
 WHERE
	InvariantProfileType : SIZEOF(QUERY(temp <* Profiles |
		temp.ProfileType <> Profiles[1].ProfileType)) = 0;
	NoRecursion : SIZEOF(QUERY(temp <* Profiles |
		'IFC4X3_DEV.IFCCOMPOSITEPROFILEDEF' IN TYPEOF(temp))) = 0;
END_ENTITY;
```

### Version differences (compact)

| Item | IFC2x3 | IFC4 | IFC4.3 |
|------|--------|------|--------|
| `IfcParameterizedProfileDef.Position` | required | `OPTIONAL` | `OPTIONAL` |
| Fillet / edge radius measure type | `IfcPositiveLengthMeasure` | `IfcNonNegativeLengthMeasure` | `IfcNonNegativeLengthMeasure` |
| Optional edge-radius / slope attributes on I / U / T / L / Z profiles | absent | present | present |
| `IfcAsymmetricIShapeProfileDef` | subtype of `IfcIShapeProfileDef` | direct subtype of `IfcParameterizedProfileDef` | direct subtype |
| `IfcMirroredProfileDef` | absent | present | present |
| `IfcCraneRailFShapeProfileDef`, `IfcCraneRailAShapeProfileDef` | present | removed | removed |
| `IfcOpenCrossProfileDef` | absent | absent | present |

Full per-version detail : see `references/methods.md`.

## Decision Trees

### Which profile entity do I need?

```
What cross-section are you modelling?
|
+-- A simple rectangle or square
|   --> IfcRectangleProfileDef (XDim, YDim).
|
+-- A circle, a round bar, a solid column
|   --> IfcCircleProfileDef (Radius).
|
+-- A standard hot-rolled steel section
|   --> I/H beam   --> IfcIShapeProfileDef
|       angle      --> IfcLShapeProfileDef
|       channel    --> IfcUShapeProfileDef
|       tee        --> IfcTShapeProfileDef
|       cold C     --> IfcCShapeProfileDef
|       zed        --> IfcZShapeProfileDef
|
+-- A hollow section (tube)
|   --> rectangular --> IfcRectangleHollowProfileDef
|       circular    --> IfcCircleHollowProfileDef
|
+-- A free-form closed outline (no parameters fit)
|   --> IfcArbitraryClosedProfileDef (OuterCurve).
|
+-- A free-form outline with holes in it
|   --> IfcArbitraryProfileDefWithVoids (OuterCurve + InnerCurves).
|
+-- An open outline to sweep a SURFACE (not a solid)
|   --> IfcArbitraryOpenProfileDef (Curve, ProfileType = CURVE).
|
+-- Two or more profiles acting as one section
|   --> IfcCompositeProfileDef (Profiles).
|
+-- A copy of an existing profile, transformed
    --> IfcDerivedProfileDef (ParentProfile + Operator).
```

### AREA or CURVE for ProfileType?

```
Will this profile be swept into a SOLID?
|
+-- YES --> ProfileType = AREA. The profile must be a CLOSED region.
|           Required for every profile feeding an IfcSweptAreaSolid.
|
+-- NO, it sweeps a SURFACE only --> ProfileType = CURVE.
|           Used with IfcArbitraryOpenProfileDef.
|
+-- A profile with voids --> ProfileType = AREA always (WR1 enforces it).
```

### Closed or open profile?

```
Does the cross-section enclose an area?
|
+-- YES, it is a closed loop
|   --> IfcArbitraryClosedProfileDef (or a parameterized profile).
|       OuterCurve is a closed 2D curve, never an IfcLine.
|
+-- NO, it is an open strip (e.g. a sheet-metal centre line)
    --> IfcArbitraryOpenProfileDef. ProfileType MUST be CURVE.
        This profile can NEVER feed an IfcSweptAreaSolid.
```

## Patterns

### Pattern : Match the profile entity to the section

ALWAYS use the dedicated parameterized profile for a standard section : an
`IfcIShapeProfileDef` for an I or H beam, an `IfcLShapeProfileDef` for an angle, an
`IfcCircleProfileDef` for a round bar.
ALWAYS reach for `IfcArbitraryClosedProfileDef` only when no parameterized profile
fits the section. A parameterized profile carries semantic meaning (a downstream
tool reads `OverallDepth`); an arbitrary profile carries only an outline.
NEVER approximate a circle or rectangle with an arbitrary polyline when the exact
parameterized profile exists.

### Pattern : Set ProfileType to AREA for a solid sweep

ALWAYS set `ProfileType = AREA` on any profile that becomes the `SweptArea` of an
`IfcExtrudedAreaSolid`, `IfcRevolvedAreaSolid`, or any other `IfcSweptAreaSolid`.
NEVER set `ProfileType = CURVE` on such a profile : the `SweptAreaType` `WHERE` rule
on `IfcSweptAreaSolid` states `SweptArea.ProfileType = IfcProfileTypeEnum.Area` and a
`CURVE` profile fails it.

See `ifc-syntax-geometry-swept-solid` for the sweep entities that consume the
profile.

### Pattern : Give arbitrary profiles a valid closed curve

ALWAYS give `IfcArbitraryClosedProfileDef.OuterCurve` a closed, 2-dimensional curve :
an `IfcPolyline` whose last point equals its first, an `IfcCompositeCurve`, or an
`IfcIndexedPolyCurve`.
NEVER use an `IfcLine` for `OuterCurve` or for any `InnerCurves` member : `WR2`
rejects an `IfcLine` because a single line is not a closed region. NEVER use an
`IfcOffsetCurve2D` for `OuterCurve` : `WR3` rejects it.

### Pattern : Model holes with IfcArbitraryProfileDefWithVoids

ALWAYS model a cross-section with one or more holes as an
`IfcArbitraryProfileDefWithVoids` : a closed `OuterCurve` plus an `InnerCurves` set
of closed 2D curves. The holes in the profile become voids in the swept solid.
ALWAYS set `ProfileType = AREA` on a profile with voids : its `WR1` rule requires it.
NEVER model a hole with an open curve : every `InnerCurves` member must itself be
closed, 2D, and not an `IfcLine`.

### Pattern : Keep hollow-section wall thickness valid

ALWAYS keep the `WallThickness` of `IfcCircleHollowProfileDef` strictly smaller than
the `Radius` : the `WR1` rule states `WallThickness < Radius`.
ALWAYS keep the `WallThickness` of `IfcRectangleHollowProfileDef` smaller than half
of both `XDim` and `YDim` : the `ValidWallThickness` rule enforces it.
NEVER declare a hollow profile whose wall consumes the whole section : a wall as
thick as the radius leaves no void and fails schema validation.

### Pattern : Build composite profiles without recursion

ALWAYS make every member of an `IfcCompositeProfileDef.Profiles` set share one
`ProfileType` : the `InvariantProfileType` rule rejects a set that mixes `AREA` and
`CURVE` profiles.
NEVER place an `IfcCompositeProfileDef` inside another `IfcCompositeProfileDef` : the
`NoRecursion` rule forbids a composite that contains a composite.

### Pattern : Honour the version differences

ALWAYS supply `IfcParameterizedProfileDef.Position` in an IFC2x3 file : there the
attribute is required, not optional. In IFC4 and IFC4.3 it may be omitted.
ALWAYS type fillet and edge radii as `IfcNonNegativeLengthMeasure` in IFC4 and
IFC4.3, and as `IfcPositiveLengthMeasure` in IFC2x3.
NEVER write the IFC4 optional edge-radius or slope attributes (`FlangeEdgeRadius`,
`FlangeSlope`, `WebSlope`, `LegSlope`) into an IFC2x3 profile : those attributes did
not exist in IFC2x3. See `ifc-impl-version-migration`.

## Reference Links

- `references/methods.md` : the complete verified attribute lists and `WHERE` rules
  for every profile entity, the inherited attributes, and the per-version difference
  detail.
- `references/examples.md` : worked STEP scenarios : a rectangle profile, an I-shape
  steel section, a hollow section, an arbitrary outline, a profile with a void, a
  composite profile, and a derived profile.
- `references/anti-patterns.md` : the failure modes this skill prevents, each with
  the `WHERE` rule or version rule it violates.

### Official sources

- IfcProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcProfileDef.htm
- IfcParameterizedProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcParameterizedProfileDef.htm
- IfcRectangleProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRectangleProfileDef.htm
- IfcIShapeProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcIShapeProfileDef.htm
- IfcLShapeProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcLShapeProfileDef.htm
- IfcArbitraryClosedProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcArbitraryClosedProfileDef.htm
- IfcArbitraryProfileDefWithVoids : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcArbitraryProfileDefWithVoids.htm
- IfcCompositeProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcCompositeProfileDef.htm
- IfcDerivedProfileDef : https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDerivedProfileDef.htm

### Related skills

- `ifc-syntax-geometry-swept-solid` : the sweep entities that consume an `AREA`
  profile to produce a 3D solid.
- `ifc-syntax-geometry-representations` : how the resulting solid is wrapped in an
  `IfcShapeRepresentation`.
- `ifc-syntax-materials` : `IfcMaterialProfileSet` binds a material to a profile.

