The drawing as text you can read - and type.
Heck is a description language for drawings: it says what a drawing is, never how to make it. Plain text - a file format you can read - with sums in it but no program: nothing loops, nothing runs, and the program works out the rest. Not a programming language, not a scripting language, not G-code; its kin are CSS and a spreadsheet. The programming goes in a jig, in any language, and a jig prints Heck. Writing Heck is the whole language on one page.
The file is Heck. Since 30 September the .hsk file
the program saves is Heck - a block for each sheet, and in it the drawing as
this page describes it, with the sheet's scale, snap, view and camera on
top. It is what /source shows, and what it reads back when you
press Apply. A file saved before then - a line of numbers per
thing - no longer opens: open it in v2026.10.02.2 or earlier and save it
again, and it is Heck. The language is
young: its words may still change, and when they do the program will go on
reading what it wrote.
HeckerSketch 2 units = ft in sheet 'Shop' scale = '1/4"' view = 3d ... rect = 0 east, 0 north, 0 up; 20' east, 12' north end
/source opens a window beside the drawing with the sheet
written out in Heck. It follows the drawing: draw a line and its text
appears; pick a face and its line lights up; click a line of text, or drag
over several, and those things are picked on the sheet. Right-click a
line for Center in view.
Type into it and press Apply: the drawing becomes what the text
says. A mistake is marked on its line and nothing changes until it is
fixed; Revert puts the text back. As you type it offers words -
Ctrl+Space asks for them, /source complete off stops them
coming by themselves - and a statement taken from the list comes with its
parts to fill in: box = <corner>; <size>.
Edit outside opens the sheet's Heck in the editor your computer uses for text files. Each time you save it there the drawing follows, and a mistake is listed in the window instead; a change made in the drawing is written back to the file. It follows the one sheet; another sheet stops it.
A place is three lengths and the way each goes, always all three, so the height is there to be seen:
2' east, 3' north, 0 up on the floor 2' east, 3' north, 4' up four feet above it 3' west, 2' south, 6" down
east, north and up are the red,
green and blue axes; west, south and
down go the other way, so no number is ever negative. A place
can be said from another: b = a + 4' east, or in a list,
to + 4' east. x, y and
z are read too, for anyone who prefers them.
Written the way a tradesman says them: 4',
2 1/2", 1' 6", 1200mm,
1.2m. A number with no mark is inches on a feet-and-inches
sheet and millimeters on a metric one. Sums
are allowed - 4' + 2", (Width - 1') / 2 - and a
const block names numbers: Width = 4'.
| Thing | In one line | As a block |
|---|---|---|
line | line = a to b | points; ink, width, soft |
circle | circle c1 = 2' east, 2' north, 0 up; 1' - and ; north when it does not face up | center, radius, facing; starts, sides |
arc | - | center, radius, facing, sweep |
box | box = corner; size, and ; open top for a side left open | at, size; open, paint, ink, width |
rect | rect = corner; size with two parts | the same |
pull | pull = outline; how far - pull = c1; 2' up is a cylinder | points, by; paint |
face | face = a b c d, or face = c1 for the disk in a circle | points, hole, paint |
noface | noface = a b c d - lines that close, and are not a face | - |
loft | loft = Big; Small - through outlines in order: a cone, a body, a transition | through; open, paint |
solid | - | paint, then its points, lines and faces |
group | - | locked, hidden, jig, data, and everything inside it |
guide | guide = a to b, or one place | - |
dim, note | - | from, to, off; at, text |
Notes go in // ... or { ... }. A note above a
thing, or at the end of its line, belongs to that thing and is written back
with it; one inside a block goes above the block, since the program writes a
block's insides afresh. Notes above the sheet line and before
its end stay there. A list too long for a line runs from
( to ).
As on the sheet: close a loop of lines and the face appears. So a
plain face is never written - a cube is its eight corners and twelve
edges, and typing twelve lines that close gives you the six faces. A
face is written only when something about it is not automatic: it is
painted, it has a hole the lines would not cut, it faces the other way.
A loop of lines that is not a face - one you rubbed out - is
written noface, so it stays that way.
These are shorthand, not extra things. box = 0 east, 0 north, 0
up; 4' east, 3' north, 2' up reads as the twelve lines and six faces
a rectangle pulled up would have made, and a block that is still exactly a
box - square, unpushed, no hole, one paint or none - is written that way.
Nudge a corner and it is written as its lines again. A circle drawn on a
box's top is the box's hole, and the two of them are two lines:
circle c1 = 2' east, 2' north, 4' up; 1' box = 0 east, 0 north, 0 up; 4' east, 4' north, 4' up
pull is what push/pull makes of any flat outline: its
corners, or a circle by name, and how far it went. pull = c1; 2'
up is a cylinder.
One rule covers the grammar: a line with = is complete;
a line without one opens a block, and end closes it. The
program writes the one-liner when nothing about the thing is unusual and
the block when something is - a paint, a width, a name. You may type
either.
Any thing can have a name after its kind - box Lid,
solid Hinge, pull Fin, line Rafter,
circle Hole, group 'Left turbine' - in quotes when
it has spaces. A name you give is yours: it is kept through every save,
and a copy keeps it too. A circle keeps its name for faces and pulls to
call it by; the ones you did not name are c1, c2.
A solid's corners keep the names you gave them too. The ones nobody
named, the program names by where they stand - floor1 to
floor4 and top1 to top4 on a block,
ra1.. round a ring - so line = floor1 to top1 is an
upright. Lines that belong to no solid are written with their places, not
names.
Whether you type it or a program writes it, a model reads best, and is easiest to change later, built like this:
box LegSW, solid Lid - and a note above a part
saying what it is. Picking a thing on the sheet lights up its lines in the
source window, notes included.open = top, and any other opening a
noface - not a face rubbed out afterwards.box for blocks,
pull for a profile pushed some distance, circle
and pull = Hole; 2' up for round things.// a planter: an open tray on four legs
group 'Planter'
group 'Tray'
// open at the top
box Tray
at = 0 east, 0 north, 1' up
size = 3' east, 1' north, 10" up
open = top
paint = brown
end
end
group 'Legs'
box LegSW = 0 east, 0 north, 0 up; 2" east, 2" north, 1' up
box LegSE = 2' 10" east, 0 north, 0 up; 2" east, 2" north, 1' up
box LegNE = 2' 10" east, 10" north, 0 up; 2" east, 2" north, 1' up
box LegNW = 0 east, 10" north, 0 up; 2" east, 2" north, 1' up
end
end
open = top leaves the tray its bottom and four sides. A
shape that is not a box is left open the same way with noface
and the corners of the loop that is not to be a face.
Press Pick and the sheet becomes a point picker: each click,
snapped exactly as the line tool snaps, is typed into the line the caret
is on - the next <part> if the line has them, or a
place, then to and a place for a line, ; and a
step for a box, ; and a radius for a circle. Esc on the sheet
ends it.
A jig - Just Include Geometry - is any program that prints Heck: a batch file, a shell script, Python, Perl, Pascal. A group can be made by one:
group 'Hangers' jig = 'hangers' with Count = 6, Spacing = 16", Drop = 4' end
Jigs live in your own jigs folder beside the program; the
drawing names one and never carries it, and nothing runs when a drawing
opens - you press the play mark beside the line, or Run jigs for
all of them. Save a jig in your editor while its drawing is open, and the
groups on that sheet that it makes are made again; Ctrl+Z puts them back. What the jig printed folds shut under its line.
/source sample puts a sample drawing in the window and writes
its jigs to the folder for you to look at.
A group a tool made can carry that tool's own record in a data
block - the radiant wizard keeps its whole job there, so a zone opens in the
wizard again:
group 'Radiant zone 1 - Shop'
data
radiant = 1
title = 'Parts Store'
floor
name = 'Shop'
outline = 0 0 0, 20 0 0, 20 30 0, 0 30 0
end
end
...
end
Lines of name = value, and a name alone opening a block of
them to its end. Heck keeps every line as it came, whether or not
it knows the names, and writes it back - leave it alone unless you know what
reads it.
Two reasons beyond reading it. A drawing that is text is a drawing under git: one statement to a line, so a diff says this corner moved four inches and nothing else, and history, blame and branches come with the tools a programmer already has - a revision browser with a preview of each version is where the source window is heading. And because nothing in a drawing is hidden, anyone can write a program that reads or writes it.
grep and diff work
on a drawing.= is complete; one without opens a block that
end closes.