An open, machine-neutral interchange format for panel furniture: board, per-edge edging, drilling/routing and assembly placement. CabCodeXF carries machining intent — a CAD system emits it; a factory imports it and generates the machine CAM.
No open, vendor-neutral format describes panel/cabinet machining intent the way BTLx does for timber. Machine formats like WoodWOP .mpr or Biesse .cix are post-processor output; DXF is geometry without machining semantics. CabCodeXF fills that gap: a CAD vendor emits intent, and the consuming factory owns the CAM step — so writing a CabCodeXF post-processor is cheap.
<Header>).A/B (the two faces) plus four edges named by the coordinate they sit on: X0, Xmax, Y0, Ymax.x runs 0..length) — not the saw "longer side" convention.through="true" overrides it.| <Header> | units (mm), producer, timestamp |
| <Materials> | board definitions, referenced by id (neutral manufacturer/decor/finish/thickness) |
| <EdgeMaterials> | edge-band definitions, referenced by id |
| <Part> | one panel: length/width/thickness, grain, material; holds edging + operations |
| <Edging> | per-edge banding (edges X0/Xmax/Y0/Ymax) |
| <Bore> | drilling — face bore (A/B) or edge bore; optional repeat <Pattern> |
| <Route> | routing — a path of <Line> and <Arc> segments; toolSide left/right puts the cutter beside the finished edge, centre cuts a groove |
| <Pocket> | pocketing — a rectangular recess by its centre, size, corner radius and angle |
| name / note | optional on every operation — a short label and a note for the operator; never changes what is machined |
| <Assembly> | optional: places each part instance (position + orientation) for viewing |
One part (a cabinet gable) with board, edging, the three operation primitives, and an assembly instance:
<?xml version="1.0" encoding="UTF-8"?>
<CabCodeXF xmlns="https://cabcode.uk/cabcodexf/1.0" version="1.0">
<Header units="mm" angleUnit="deg" producer="AcmeCAD / CabCodeXF post-processor 1.0"/>
<Materials>
<Material id="M2" token="U960" manufacturer="Egger" decor="U960"
finish="ST9" type="MFC" thickness="18"/>
</Materials>
<EdgeMaterials>
<EdgeMaterial id="E1" kind="ABS" thickness="2.0"/>
</EdgeMaterials>
<Part id="P1" name="Gable" quantity="2"
length="720" width="300" thickness="18" grain="length" material="M2">
<Edging>
<Edge edge="Y0" as="W1" edgeMaterial="E1"/>
</Edging>
<Operations>
<Bore face="A" diameter="5" depth="12"> <!-- shelf line-boring -->
<At x="100" y="37"/>
<Pattern count="5" dx="32" dy="0"/>
</Bore>
<Bore face="Xmax" diameter="8" depth="30" z="9"> <!-- edge dowels -->
<At u="60"/><At u="240"/>
</Bore>
<Route face="B" toolWidth="4" depth="10"> <!-- back groove -->
<Line x1="8" y1="285" x2="712" y2="285"/>
</Route>
</Operations>
</Part>
<Assembly id="CAB-1" name="600 Base Unit" units="mm">
<Instance part="P1" id="GABLE-L">
<Position x="0" y="0" z="0"/>
<Orientation localX="+Z" localY="+Y" localZ="+X"/>
</Instance>
<!-- …further instances… -->
</Assembly>
</CabCodeXF> Every CabCodeXF document validates against the XSD schema at /cabcodexf/cabcodexf-1.0.xsd (target namespace https://cabcode.uk/cabcodexf/1.0). Validate locally with xmllint:
xmllint --noout --schema cabcodexf-1.0.xsd your-cabinet.cabcodexfA producer's post-processor is considered CabCodeXF-conformant when its output validates against this schema and the sample files above round-trip through a reference consumer.
CabCodeXF is stewarded by CabCode and published as an open spec, free to produce and consume. The format and schema may be implemented by any CAD or machine vendor without fee. Questions, conformance and implementation support: drilling@cabcode.uk.