Theme

Heck

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

The window

/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

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.

Lengths

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'.

Things

ThingIn one lineAs a block
lineline = a to bpoints; ink, width, soft
circlecircle c1 = 2' east, 2' north, 0 up; 1' - and ; north when it does not face upcenter, radius, facing; starts, sides
arc-center, radius, facing, sweep
boxbox = corner; size, and ; open top for a side left openat, size; open, paint, ink, width
rectrect = corner; size with two partsthe same
pullpull = outline; how far - pull = c1; 2' up is a cylinderpoints, by; paint
faceface = a b c d, or face = c1 for the disk in a circlepoints, hole, paint
nofacenoface = a b c d - lines that close, and are not a face-
loftloft = Big; Small - through outlines in order: a cone, a body, a transitionthrough; open, paint
solid-paint, then its points, lines and faces
group-locked, hidden, jig, data, and everything inside it
guideguide = 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 ).

Faces come from lines

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.

Box, rect, circle, pull

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.

Blocks and one-liners

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.

Names

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.

Building a model in text

Whether you type it or a program writes it, a model reads best, and is easiest to change later, built like this:

// 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.

Picking points from the sheet

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.

Jigs

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.

What a group carries

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.

Why text

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.

The rules

  1. It is data, not a program. No loops, nothing executed.
  2. One fact, one place. A line is its two points; its length is whatever that makes it.
  3. Saving loses nothing: what is read back is what was there. Every drawing sent in as a report is checked this way with each build.
  4. Only what differs from the default is written.
  5. One statement to a line, so grep and diff work on a drawing.
  6. A reader skips what it does not know.
  7. A line with = is complete; one without opens a block that end closes.
  8. Faces are what closed lines become.