Project file
A project (.chipload) is a JSON file. Chipload writes every field; when you write one by hand or with a script, the fields marked no may be left out. Lengths are in mm, angles in radians, feeds in mm/min. chipload schema project prints the JSON Schema this page is made from.
Schema version 29. Older files load through Chipload’s migrations; this schema describes only the current version.
The file
| Field | Type | Required | Meaning |
|---|---|---|---|
active_part | integer or null | no | The part new operations go into (its id). Null or no such part: the first part. Only the app and the command line read it; it changes nothing that is cut. |
drawing | Drawing | yes | The drawing: the shapes Chipload cuts, imported from a DXF or drawn in Chipload. |
machine | Machine | yes | The machine: post-processor, safe height, limits and zero. |
operations | list of Operation | yes | The operations, cut in this order: grouped by part, in the parts’ order. |
parts | list of Part | yes | The parts: groups of operations, each cut with its copies before the next part. At least one. |
schema_version | 29 | yes | The version of the file format. Chipload upgrades older files when it reads them, and refuses newer ones. |
stock | Stock | yes | The material on the machine. |
tools | list of Tool | yes | The tools the operations cut with. |
written_by | string or null | no | The Chipload version that wrote the file, for reference. |
ArcSegment
From start_angle through sweep radians (positive = counter-clockwise).
| Field | Type | Required | Meaning |
|---|---|---|---|
center | 2 × number | yes | Centre, mm. |
radius | number | yes | Radius, mm. |
start_angle | number | yes | Where the arc starts, radians from +X, counter-clockwise. |
sweep | number | yes | How far it turns, radians: positive counter-clockwise. |
AutoThreshold
The word “auto”.
One of: "auto".
Bone
What a chosen corner gets.
One of: "none", "dogbone", "tbone".
Copies
A grid of copies of a part: copy (column c, row r) is the part moved by (c·dx, r·dy) mm.
| Field | Type | Required | Meaning |
|---|---|---|---|
columns | integer | yes | Copies along X, at least 1. |
dx | number | yes | Distance from copy to copy along X, mm; negative grows to the left. |
dy | number | yes | Distance from copy to copy along Y, mm; negative grows downwards. |
order | CopyOrder | no | by_operation: each operation on every copy, then the next; by_copy: every operation on one copy, then the next copy. |
rows | integer | yes | Copies along Y, at least 1. |
CopyOrder
In which order the copies are cut.
-
"by_operation": Each operation on every copy, then the next operation. -
"by_copy": Every operation on one copy, then the next copy. Calledby_partbefore parts came (schema 22).
CornerChoice
A corner with its own bone, chosen by the user.
| Field | Type | Required | Meaning |
|---|---|---|---|
along | Wall or null | no | The wall a T-bone runs along, longer or shorter: the notch is in the other. Required with a T-bone; null otherwise. |
at | 2 × number | yes | The corner, in drawing coordinates (mm). |
bone | Bone | yes | none (the corner stays round), dogbone or tbone. |
Corners
How the tool reaches into the inside corners it would leave round, so a square part fits: every corner on the tool’s side up to max_angle.
"type": "dogbone"
In along the corner’s bisector.
| Field | Type | Required | Meaning |
|---|---|---|---|
max_angle | number | yes | Only corners this sharp or sharper, radians (1.745 = 100°). |
"type": "tbone"
In along the longer wall: the notch is in the shorter one.
| Field | Type | Required | Meaning |
|---|---|---|---|
max_angle | number | yes | Only corners this sharp or sharper, radians (1.745 = 100°). |
CustomPost
A user post-processor’s config and template, exactly as read from the posts folder.
| Field | Type | Required | Meaning |
|---|---|---|---|
config | string | yes | The post’s settings file (TOML), as copied. |
template | string | yes | The post’s template, as copied. |
Direction
One of: "climb", "conventional".
Drawing
The project’s drawing: shapes in millimetres, or (only for jobs from before v4) a reference to a DXF that still has to be embedded.
| Field | Type | Required | Meaning |
|---|---|---|---|
dxfs | list of DrawingSource | no | The DXFs the imported shapes came from, each as at its last import or update, with its own placement. |
hidden | list of string | no | Groups and layers not drawn on the canvas (they are still cut): dxf:1, dxf:1/layer:Cut, image:1, text:1, drawn:circle, drawn:rectangle, drawn:polyline. |
images | list of Image | no | Pictures traced into shapes, for V-carving. |
next_shape_id | integer | yes | The id the next new shape gets. Ids are never reused. |
shapes | list of Shape | yes | The shapes, imported and drawn. |
texts | list of Text | no | Texts written into shapes, for V-carving, pocketing or profiling. Left out of the file when there are none, so projects without text open in older versions. |
DrawingSource
Provenance of the imported shapes.
| Field | Type | Required | Meaning |
|---|---|---|---|
file | string | yes | The DXF’s file name. |
flattened | object | no | How many curves of each type (splines, ellipses) were turned into arcs. |
id | integer | yes | The DXF’s id, which its shapes and selectors name. |
ignored | object | no | How many entities of each type were left out (text, dimensions, …). |
imported | object | no | How many entities of each type were imported. |
issues | list of SourceIssue | no | What the import found: the import report. |
name | string | yes | Its name in the Browser and messages; the file’s name without its extension at first. |
placement | Placement | yes | How the imported drawing was moved, turned and scaled on the stock. |
sha256 | string | yes | The DXF’s SHA-256, to tell whether it changed. |
units | Units | yes | The DXF’s units: mm or inch. Inch drawings are converted to mm on import. |
units_from | UnitsFrom | yes | Where the units came from: the DXF itself, or the user’s choice. |
Entry
How the tool goes down into the material at the start of each pass, for pockets and follow paths (a profile always spirals: its ramp_angle).
"type": "plunge"
Straight down: needs a centre-cutting tool. An empty struct variant, as Rings.
"type": "ramp"
Down along the path and back, never steeper than ramp_angle (radians, 0 < angle <= 30°).
| Field | Type | Required | Meaning |
|---|---|---|---|
ramp_angle | number | yes | The steepest the ramp goes, radians: more than 0, at most 30° (0.5236). |
"type": "helix"
Pockets only: down round a circle of radius (the tool centre’s), never steeper than ramp_angle.
| Field | Type | Required | Meaning |
|---|---|---|---|
radius | number | yes | The helix’s radius, mm: less than the tool radius. |
ramp_angle | number | yes | The steepest the helix goes, radians: more than 0, at most 30° (0.5236). |
Finish
A finishing pass on a profile.
| Field | Type | Required | Meaning |
|---|---|---|---|
stock | number | yes | Left on the wall by the roughing passes, mm: more than 0, less than the tool radius. |
HoleMethod
How a Holes operation cuts.
"type": "drill"
Straight down at the hole’s centre, peck mm at a time.
| Field | Type | Required | Meaning |
|---|---|---|---|
peck | number or null | no | Drill this many mm at a time, lifting out between pecks to clear chips. Null: in one go. |
"type": "bore"
A helix at the wall, at most step_down mm per turn and never steeper than ramp_angle (radians, 0 < angle <= 30°), then one level circle.
| Field | Type | Required | Meaning |
|---|---|---|---|
direction | Direction | yes | climb or conventional, as for a profile inside the hole. |
ramp_angle | number | yes | The steepest the helix goes, radians: more than 0, at most 30° (0.5236). |
step_down | number | yes | The most the helix goes down per turn, mm. |
Image
A picture traced into shapes: the picture itself, where it goes, and how it becomes black and white. Its traced shapes are path shapes on its layer that name it in image.
| Field | Type | Required | Meaning |
|---|---|---|---|
arcs | boolean | yes | Traced edges are fitted with arcs as well as lines. |
blur | number | yes | Blur before the threshold, in pixels, 0 to 10; 0: none. |
data | string | yes | The picture file itself (PNG, JPEG or BMP), base64-encoded. |
file | string | yes | The picture’s file name. |
id | integer | yes | The image’s id, which its traced shapes name. |
invert | boolean | yes | Carve the light parts instead of the dark ones. |
layer | string | yes | The layer its traced shapes go on. |
min_area | number | yes | Black or white specks smaller than this are dropped, mm², 0 to 100. |
rotation | number | yes | Turned counter-clockwise about the picture’s centre, degrees, at least 0 and less than 360. x, y and width are before the turn; the traced shapes are turned after the trace. |
sha256 | string | yes | The picture’s SHA-256. |
smoothing | number | yes | How far a traced edge may be simplified away from the picture’s edge, mm, 0.01 to 1. |
threshold | ImageThreshold | yes | Grey values below this (0–255) are black: 1 to 254, or “auto” to pick it from the picture (Otsu’s method). |
trace | ImageTrace | yes | What it is traced into: the black parts’ outlines (for a V-carve) or their centre lines (for a follow path). |
width | number | yes | The picture’s width on the stock, mm; its height follows from the picture. |
x | number | yes | X of the picture’s lower-left corner on the stock, mm. |
y | number | yes | Y of the picture’s lower-left corner on the stock, mm. |
ImageThreshold
Where grey turns black: “auto” or a grey value.
-
AutoThreshold: Picked from the picture.
-
integer: Grey values below this are black, 1 to 254.
ImageTrace
What a picture is traced into.
-
"outline": Closed outlines round the black parts, black inside. -
"centre_line": Open (or closed) paths along the black strokes’ middles.
IssueSeverity
One of: "warning", "error".
Lead
Quarter-circle lead-in and lead-out.
| Field | Type | Required | Meaning |
|---|---|---|---|
radius | number | yes | Radius of the lead arcs, mm: more than 0, at most 10 tool diameters. Smaller where there’s no room. |
LineSegment
| Field | Type | Required | Meaning |
|---|---|---|---|
end | 2 × number | yes | End point, mm. |
start | 2 × number | yes | Start point, mm. |
Machine
| Field | Type | Required | Meaning |
|---|---|---|---|
custom_post | CustomPost or null | no | Your own post-processor, copied into the project when chosen, so it gives the same G-code anywhere. Null: post is a built-in one. |
gcode_units | Units | yes | The units the G-code is written in: mm (G21) or inch (G20). Everything else in the project stays in mm. Since schema 28. |
library_uid | string or null | no | The uid of the machine profile these values came from, for reference; nothing that cuts reads it. Null: not from a profile. |
max_feed | number or null | no | The machine’s fastest feed, mm/min: higher feeds are refused, and the cycle time uses it for rapids. Null: unknown. |
name | string or null | no | The machine profile these values came from, for reference; nothing reads it. |
post | string | yes | The post-processor: grbl, linuxcnc, mach3, or the name of your own. |
safe_z | number | yes | The height for rapid moves sideways, mm above Z0. Above the stock top. |
spindle | Spindle | yes | The spindle’s direction: cw (M3) or ccw (M4). |
tool_change | ToolChange | yes | With several tools: files (one file per tool) or program (one file with tool changes). |
travel | Travel or null | no | The machine’s travel, mm. When set, a program that moves farther is refused. Null: not checked. |
work_zero | WorkZero | no | The point of the drawing that becomes X0 Y0 in the G-code. Missing: the drawing’s origin. |
Operation
"type": "profile"
| Field | Type | Required | Meaning |
|---|---|---|---|
clearance | number | yes | How far the cut moves into the material that is kept, mm: positive removes more (a larger pocket, a smaller part), negative leaves material. Less than the tool radius. |
corner_choices | list of CornerChoice | no | Corners with their own bone, whatever corners says. Missing or empty: none. Left out when empty. |
corners | Corners or null | no | Dogbones or T-bones in the inside corners, so square parts fit. Null: the corners stay round. |
direction | Direction | yes | climb or conventional milling. |
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | Where the cut ends, mm down from the stock top. More than the start depth; below the stock bottom only within stock.max_overcut. |
feed | number | yes | The cutting feed, mm/min. |
finish | Finish or null | no | A finishing pass: the roughing passes leave stock mm on the wall, and one last lap at full depth takes it off. Null: none. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). |
plunge_feed | number | yes | The feed going down into the material, mm/min. |
ramp_angle | number | yes | The steepest the spiral ramp goes down along the contour, radians: more than 0, at most 30° (0.5236). A profile always spirals down (docs/specs/profile-always-spiral.md). |
select | Selector | yes | What the operation cuts: the shapes on a layer, or shapes by id. |
side | Side | yes | Which side of the line the tool cuts: outside (cutting a part out), inside (a hole) or on the line. |
skin | Skin or null | no | An onion skin: the passes stop thickness mm above the end depth, and one last lap cuts through it. Null: none. |
start_depth | number | yes | Where the cut starts, mm down from the stock top: 0 for the top, more when an earlier operation already cut down to there. |
starts | list of 2 × number | no | Where the cut starts, as points in drawing coordinates (mm): each moves the start of the ring (contour) nearest to it. Empty: chosen by Chipload. |
step_down | number | yes | The deepest each pass goes, mm. The passes are equal, and the last one ends exactly at the end depth. |
tabs | Tabs or null | no | Holding tabs left at the bottom of the cut, so a part cut out doesn’t come loose. Null: none. |
tool | integer | yes | The id of the project tool it cuts with (tools). |
"type": "pocket"
| Field | Type | Required | Meaning |
|---|---|---|---|
clearance | number | yes | How far the cut moves into the material that is kept, mm: positive removes more (a larger pocket, a smaller part), negative leaves material. Less than the tool radius. |
corner_choices | list of CornerChoice | no | Corners with their own bone, whatever corners says. Missing or empty: none. Left out when empty. |
corners | Corners or null | no | Dogbones or T-bones in the inside corners, so square parts fit. Null: the corners stay round. |
direction | Direction | yes | climb or conventional milling. |
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | Where the cut ends, mm down from the stock top. More than the start depth; below the stock bottom only within stock.max_overcut. |
entry | Entry | no | How the tool goes down at the start of each pass: plunge (straight down; needs a centre-cutting tool) or ramp along the path; pockets also helix. Missing: plunge. |
feed | number | yes | The cutting feed, mm/min. |
lead | Lead or null | no | A quarter-circle lead-in and lead-out from the cleared side onto the wall. Null: none. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). |
plunge_feed | number | yes | The feed going down into the material, mm/min. |
rest | Rest or null | no | Rest machining: clear only what a larger tool leaves in these shapes. Null: the whole pocket. |
rest_passes | list of RestPass | no | Rest passes: smaller endmills that clear what this pocket’s tool (or the pass before) leaves, in its shapes and depths. Missing or empty: none. Left out when empty. |
select | Selector | yes | What the operation cuts: the shapes on a layer, or shapes by id. |
start_depth | number | yes | Where the cut starts, mm down from the stock top: 0 for the top, more when an earlier operation already cut down to there. |
starts | list of 2 × number | no | Where each wall ring starts, as points in drawing coordinates (mm): each moves the start of the wall ring nearest to it. Empty: chosen by Chipload. |
step_down | number | yes | The deepest each pass goes, mm. The passes are equal, and the last one ends exactly at the end depth. |
stepover | number | yes | The distance between the clearing rings, as a fraction of the tool diameter: more than 0, at most 1. |
tool | integer | yes | The id of the project tool it cuts with (tools). |
"type": "vcarve"
V-carve: a V-bit follows the centre line of closed shapes, as deep as makes the cut exactly as wide as the shape.
| Field | Type | Required | Meaning |
|---|---|---|---|
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | The deepest the V-bit’s tip may go, mm down from the stock top. Strokes that need more are carved to it, narrower than drawn, with a warning. |
feed | number | yes | The feed, mm/min, for moves no steeper than 45°. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). |
plunge_feed | number | yes | The feed for moves steeper than 45°, mm/min. |
select | Selector | yes | What the operation cuts: the shapes on a layer, or shapes by id. |
start_depth | number | yes | The surface carved, mm down from the stock top: 0 for the top, more to carve on a floor an earlier pocket cut. |
step_down | number or null | no | Carve in passes no deeper than this, mm. Null: one pass. |
tool | integer | yes | The id of the project tool it cuts with (tools). |
"type": "path"
Follow path: the tool centre on the selected shapes, open or closed.
| Field | Type | Required | Meaning |
|---|---|---|---|
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | Where the cut ends, mm down from the stock top. More than the start depth; below the stock bottom only within stock.max_overcut. |
entry | Entry | yes | How the tool goes down at the start of each pass: plunge or ramp along the path. |
feed | number | yes | The cutting feed, mm/min. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). |
plunge_feed | number | yes | The feed going down into the material, mm/min. |
select | Selector | yes | What the operation cuts: the shapes on a layer, or shapes by id. |
start_depth | number | yes | Where the cut starts, mm down from the stock top: 0 for the top, more when an earlier operation already cut down to there. |
step_down | number | yes | The deepest each pass goes, mm. The passes are equal, and the last one ends exactly at the end depth. |
tool | integer | yes | The id of the project tool it cuts with (tools). |
"type": "holes"
Holes: drilled with a drill, bored with a helix with an endmill.
| Field | Type | Required | Meaning |
|---|---|---|---|
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | Where the hole ends, mm down from the stock top. For a drill, the depth of its point. |
feed | number | yes | A bore’s feed round its helix and bottom circle, mm/min. A drill doesn’t use it. |
method | HoleMethod | yes | How the holes are cut: drill with a drill, or bore (a helix) with an endmill. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). |
plunge_feed | number | yes | A drill’s feed down, or a bore’s feed straight down to the start depth, mm/min. |
select | Selector | yes | What the operation cuts: the circles among the shapes on a layer, or shapes by id. Other shapes are skipped with a note. |
start_depth | number | yes | Where the cut starts, mm down from the stock top: 0 for the top, more when an earlier operation already cut down to there. |
tool | integer | yes | The id of the project tool it cuts with (tools). |
"type": "surface"
Surface: the whole stock top taken down flat, in straight passes back and forth.
| Field | Type | Required | Meaning |
|---|---|---|---|
enabled | boolean | no | False: the operation stays in the project but isn’t cut. Missing: true. |
end_depth | number | yes | How far down the stock top is taken, mm. At most the stock thickness. |
feed | number | yes | The cutting feed, mm/min. |
name | string | no | A name for the operation, shown in the list and on the setup sheet. Empty: none. |
part | integer | yes | The id of the part it belongs to (parts). The stock is faced once, whatever copies the part has. |
plunge_feed | number | yes | The feed going down beside the stock to each depth, mm/min. |
start_depth | number | yes | Where the cut starts, mm down from the stock top: 0 for the top. |
step_down | number | yes | The deepest each pass goes, mm. The passes are equal, and the last one ends exactly at the end depth. |
stepover | number | yes | The distance between passes, as a fraction of the tool diameter: at least 0.1, at most 0.9. |
tool | integer | yes | The id of the project tool it cuts with (tools): an endmill. |
Part
A part: a named group of operations, cut together, with its own copies (docs/specs/parts.md §2). It owns no geometry: its operations select the shapes.
| Field | Type | Required | Meaning |
|---|---|---|---|
copies | Copies or null | no | Cut the part several times in a grid. Null: once. |
enabled | boolean | yes | False: the part and all its operations stay in the project but aren’t cut. |
id | integer | yes | Its number, unique in the project: what operations name it by. |
name | string | yes | Its name, unique in the project, shown in the Browser, the report and the sheet. |
PathSegment
-
object:
-
object:
Placement
Where the imported drawing is put: a DXF point p goes to scale · rotate(p) + (dx, dy), turned and scaled about the DXF’s origin.
| Field | Type | Required | Meaning |
|---|---|---|---|
dx | number | yes | Then moved along X, mm. |
dy | number | yes | Then moved along Y, mm. |
rotation | number | yes | Turned counter-clockwise about the DXF’s origin, degrees, at least 0 and less than 360, after the scale. Multiples of 90 are exact. |
scale | number | yes | Scaled about the DXF’s origin by this factor, 0.001 to 1000; 1: as drawn. |
Rest
Rest machining: the pocket clears only the material the larger tool after_tool can’t reach in its shapes.
| Field | Type | Required | Meaning |
|---|---|---|---|
after_tool | integer | yes | The id of the larger project tool whose leftovers this pocket clears. |
RestPass
One rest pass of a pocket (docs/specs/rest-passes.md §2): it takes the pocket’s shapes, depths, clearance and direction, and clears only what the tool before it leaves.
| Field | Type | Required | Meaning |
|---|---|---|---|
enabled | boolean | no | False: kept, but not cut. Missing: true. |
entry | Entry | yes | How the tool goes down: plunge, ramp or helix. |
feed | number | yes | The cutting feed, mm/min. |
plunge_feed | number | yes | The feed going down into the material, mm/min. |
step_down | number | yes | The deepest each pass goes, mm. |
stepover | number | yes | The distance between the clearing rings, as a fraction of the tool diameter. |
tool | integer | yes | The id of the project tool it cuts with (tools): an endmill smaller than the tool before it. |
Selector
| Field | Type | Required | Meaning |
|---|---|---|---|
dxf | integer or null | no | Only shapes from this DXF (an id in drawing.dxfs). |
exclude | list of integer or null | no | Shapes of that DXF, image or text left out (ids); with dxf, image or text only. A contour with any of them isn’t cut. A traced image’s, or a text’s, are found again when it is made again. |
image | integer or null | no | Only shapes traced from this image (an id in drawing.images). |
layer | string or null | no | Every shape on this layer (upper or lower case don’t matter). |
shapes | list of integer or null | no | These shapes, by id. |
text | integer or null | no | Only the letters of this text (an id in drawing.texts). |
Shape
One shape of the drawing: imported from a DXF (path: lines and arcs, one shape per DXF entity), or drawn in Chipload (circle, rectangle, polyline). One flat object: id, layer, kind, then the fields of that kind.
| Field | Type | Required | Meaning |
|---|---|---|---|
angle | number or null | no | rectangle: its rotation about the centre, radians, counter-clockwise. |
bulges | list of number or null | no | polyline: one per segment, as in DXF: tan(sweep / 4); 0 straight, 1 a counter-clockwise half circle, -1 clockwise. |
center | 2 × number or null | no | circle, rectangle: the centre, mm. |
closed | boolean or null | no | path, polyline: whether it ends where it starts. |
corner_radius | number or null | no | rectangle: the radius of its corners, mm; 0 for sharp ones. |
dxf | integer or null | no | path: the DXF it was imported from (its id in drawing.dxfs). |
dxf_handle | string or null | no | path: the handle of the DXF entity it came from, which keeps its id when the DXF is updated. |
dxf_type | string or null | no | path: the DXF entity’s type, e.g. LWPOLYLINE. |
id | integer | yes | The shape’s id, which operations select it by. |
image | integer or null | no | path: the image it was traced from; absent for shapes from a DXF. |
kind | ShapeKind | yes | path (imported from a DXF), or a shape drawn in Chipload: circle, rectangle, polyline. |
layer | string | yes | Its layer. |
length | number or null | no | rectangle: its size along its own X axis, mm. |
name | string or null | no | circle, rectangle, polyline: its name in the Browser; left out when it has none. |
points | list of 2 × number or null | no | polyline: its points, mm. |
radius | number or null | no | circle: the radius, mm. |
segments | list of PathSegment or null | no | path: its lines and arcs, mm. |
text | integer or null | no | path: the text it is a letter of (its id in drawing.texts). |
width | number or null | no | rectangle: its size along its own Y axis, mm. |
ShapeKind
One of: "path", "circle", "rectangle", "polyline".
Side
One of: "inside", "outside", "on".
Skin
An onion skin on a profile.
| Field | Type | Required | Meaning |
|---|---|---|---|
thickness | number | yes | Left above the end depth until the last lap, mm: more than 0, at most the step down. |
SourceIssue
An import-time issue that can’t be recomputed from the shapes.
| Field | Type | Required | Meaning |
|---|---|---|---|
code | string | yes | What kind of issue, e.g. duplicate or open_contour (see the import page of the guide). |
message | string | yes | What it is, in words. |
severity | IssueSeverity | yes | warning or error. |
Spindle
-
"cw": M3 -
"ccw": M4
Stock
| Field | Type | Required | Meaning |
|---|---|---|---|
max_overcut | number | yes | How far a cut may go below the stock bottom, into the spoilboard, mm. |
origin | StockOrigin | no | Where the stock lies around the drawing’s origin: its bottom_left corner or its center there. |
thickness | number | yes | Thickness, mm. Depths count down from the top. |
x | number | yes | Size along X, mm. |
y | number | yes | Size along Y, mm. |
z_zero | ZZero | no | Where Z0 is: the stock top or bottom. |
StockCorner
One of: "center", "bottom_left", "bottom_right", "top_left", "top_right".
StockOrigin
One of: "bottom_left", "center".
Tabs
| Field | Type | Required | Meaning |
|---|---|---|---|
at | list of 2 × number | no | Tab centres placed by hand, in drawing coordinates (mm): a contour with points gets exactly those tabs, one without gets count, evenly spaced. Left out when empty. |
count | integer | yes | Tabs per contour, at least 1. |
flank_angle | number | yes | The slope of the tab’s sides, radians: π/2 (90°) straight, less for sloped tabs a ramped profile follows. |
height | number | yes | The bridge’s thickness, up from the bottom of the cut, mm. |
width | number | yes | The bridge left on the part, along its edge, mm (the flat top of a sloped tab). |
Text
A text written into shapes: what it says, its font and size, and where it goes. Its letters are path shapes on its layer that name it in text, made again when it changes; the font is needed only for that, not to cut them.
| Field | Type | Required | Meaning |
|---|---|---|---|
align | TextAlign | yes | How the lines line up against each other. |
anchor | TextAnchor | no | What x and y are: the box’s lower-left corner (before the turn), or its centre. A centred text stays centred there when its words, font or size change. Missing: the corner. |
font | string | yes | A built-in font: FreeSans, FreeSans Bold, FreeSerif, FreeSerif Bold, FreeMono or FreeMono Bold (chipload text fonts). |
height | number | yes | The height of a capital letter, mm. |
id | integer | yes | The text’s id, which its letters name. |
layer | string | yes | The layer its letters go on. |
line_spacing | number | yes | From one line’s base to the next, in capital heights. |
rotation | number | yes | Turned counter-clockwise about the box’s centre, degrees, at least 0 and less than 360. |
spacing | number | yes | Extra space between letters, mm; 0: the font’s own spacing, kerning included. |
text | string | yes | What it says; a line break (“\n”) starts a new line. |
x | number | yes | X of the text’s anchor on the stock, mm: the lower-left corner of its box (before the turn) or its centre. |
y | number | yes | Y of the text’s anchor on the stock, mm. |
TextAlign
How a text’s lines line up.
One of: "left", "center", "right".
TextAnchor
What a text’s position is (docs/specs/text.md §3).
-
"corner": The lower-left corner of the text’s box, before the turn. -
"center": The centre of the text’s box (the turn keeps it in place).
Tool
| Field | Type | Required | Meaning |
|---|---|---|---|
angle | number or null | no | V-bits: the included angle, radians. Null: unknown; a V-carve then refuses the tool. |
center_cutting | boolean or null | no | Whether it can plunge straight down. False: profiles ramp in and pockets go down round a helix. Null: unknown. |
diameter | number | yes | Diameter, mm. For a V-bit, its widest cutting diameter. |
flutes | integer or null | no | Number of flutes, for the chip load. Null: unknown. |
id | integer | yes | The tool’s number: what operations name it by, and its T number in the G-code. |
library_uid | string or null | no | The uid of the library tool it came from, for reference; nothing that cuts reads it. Null: not from the library. |
name | string or null | no | The library tool it came from, for reference. |
rpm | number or null | no | Spindle speed, rpm. Needed to generate. |
tip_diameter | number or null | no | V-bits: the flat tip’s diameter, mm. Null: pointed. |
type | ToolType | no | endmill, drill or vbit. |
ToolChange
How a job with several tools is written.
-
"files": One G-code file per tool group; the user changes the tool and sets Z zero between. -
"program": One file withT<n> M6at each change, for a sender that handles it.
ToolType
One of: "endmill", "drill", "vbit".
Travel
| Field | Type | Required | Meaning |
|---|---|---|---|
x | number | yes | Travel along X, mm. |
y | number | yes | Travel along Y, mm. |
z | number | yes | Travel along Z, mm. |
Units
One of: "mm", "inch".
UnitsFrom
-
"dxf": Declared by the DXF ($INSUNITS). -
"user": The DXF declared none; the user chose.
Wall
One of a corner’s two walls, by length.
One of: "longer", "shorter".
WorkZero
Where the G-code’s X0 Y0 is. The geometry never moves; only the output is translated.
-
object: The drawing’s own origin (the only choice before work_zero existed). An empty struct variant, not a unit one, so serde refuses stray fields here too.
-
object: A corner or the centre of the stock, as placed by
stock.origin. -
object: Any point, in drawing coordinates (mm).
ZZero
One of: "top", "bottom".