---
title: "Cross-sections"
canonical: "https://help.twinfinity.com/space/HCFD/1655439366/Cross-sections"
format: markdown
---
A clip plane hides everything on one side of a plane so you can see *into* a
model. A **cross-section** goes further: it computes the actual lines and faces
where a plane cuts through the geometry, giving you a real 2D drawing — a floor
plan or a building section — rather than just a sliced 3D view.

Twinfinity has two ways to produce one, depending on what you're after.

## Slab sections (a horizontal plan cut)

A *slab section* cuts one floor horizontally, a short distance above the floor
level (the usual ~1.2 m plan-section height), and returns the section lines
split into **cut**, **visible** and **hidden** categories — exactly what a CAD
floor plan distinguishes. Use this when you want a plan view of a single level.

Try it in the playground: [Slab section](https://playground.twinfinity.dev/?pgId=sections/slab-section)

## Plane sections (any plane)

A *plane section* cuts along an arbitrary plane — vertical for a building
section/elevation, or any orientation you like — and can fill the exposed cut
faces in each product's own colour, so the result reads like the model.

Try it in the playground: [Plane section](https://playground.twinfinity.dev/?pgId=sections/plane-section)

The core is two calls: `computePlaneSectionsForProducts` does the geometry, and
`PlaneSectionVisual` turns it into meshes in the scene.

```ts
import { Plane, Vector3 } from '@babylonjs/core';
import { computePlaneSectionsForProducts } from '@twinfinity/product-geometry';
import { PlaneSectionVisual } from '@twinfinity/scene-visuals';

// A vertical plane through the model, expressed for the geometry maths.
const point = new Vector3(45, 0, 0);
const normal = new Vector3(-1, 0, 0).normalize();
const d = -Vector3.Dot(normal, point);
const geometryPlane = { normal: [normal.x, normal.y, normal.z], d };

// Cut every product that has geometry (skip the space volumes).
const products = [];
api.ifc.foreach((p) => {
  if (p.hasGeometry && !p.class.is('space')) products.push(p);
});

const section = await computePlaneSectionsForProducts(products, geometryPlane);

// Draw it: filled cut faces with black outlines on top.
new PlaneSectionVisual(api.viewer.scene, section, {
  plane: new Plane(normal.x, normal.y, normal.z, d),
  fill: { enabled: true },
  line: { enabled: true, width: 2 }
});
```

## Which one?

- Reach for a **slab section** when you want a plan of one floor with proper
cut/visible/hidden line work.
- Reach for a **plane section** when you need an arbitrary cut (a vertical
building section) or filled faces coloured like the model.

Once you have a section you can also export it as a print-ready drawing — see the
playground's [Export plan to SVG](https://playground.twinfinity.dev/?pgId=export/slab-section-svg)
example.