Drawing modifiers — ortho, polar tracking, dynamic input
These apply across all draw tools (rect, polygon, path, circle, arc) and the Move/Stretch translation modes.

| Modifier | Default | Toggle | What it does |
|---|---|---|---|
| Ortho mode | off | F8 or status-bar ORTHO |
Constrains the next vertex / drag offset to the nearest 45° ray (0°/45°/90°/…). Hold Shift to invert (Shift always means "the opposite of current ortho"). |
| Polar tracking | off | F10 or status-bar POLAR n° |
Locks the cursor onto the nearest n-degree ray from the previous vertex when within tolerance. The default step is 45°; change it in File → Setup → Settings (1–180°). |
| Dynamic input HUD | always on during drafts | n/a | A small floating panel shows the live distance and angle from the previous vertex while drawing. See §10.1 for the typed-input grammar. |
Shift / Alt while drawing. Each draw tool reads the modifier keys the same way:
| Tool | Shift |
Alt |
|---|---|---|
| Rect | Constrain to a square | Grow from the center (the click point is the rect's middle, not a corner) |
| Circle | Polar-lock the radius cursor to a 45° ray (purely a cue — the circle itself is radially symmetric) | — |
| Arc | Lock the start angle (click 2) and the sweep (click 3) to 45° increments | — |
| Polygon / Path | Toggle ortho-lock — Shift always means "the opposite of the current ortho mode" for that one click |
— |
Shift+Alt on Rect combines: a square centered on the click. Modifier behavior is consistent with the surrounding ortho/polar settings — F8 (ortho) flips Shift's meaning for Poly/Path/Circle/Arc the same way it always has.
Cancel an in-progress draft any time with Esc, which works mid-drag (Rect / Circle), between vertex clicks (Poly / Path), or between arc phase clicks. Right-click also cancels — except while drawing a polygon, where a right-click instead closes the shape (commits the boundary as drawn, exactly like Enter). Right-clicking with nothing in flight opens the normal context menu.
Object snap (OSNAP) in Polygon and Path. Within 8 px of the pointer, a vertex click lands exactly on the nearest target. The targets, in order of preference, are: an existing vertex (a path's ends included), an edge crossing, an edge midpoint, a circle centre, and the perpendicular foot from the previous vertex. A small marker shows the target's kind before you click: a square for a vertex, a triangle for a midpoint, an X for a crossing, a circle for a centre, ⊥ for a perpendicular. The click commits exactly the marked point, rounded to the nearest nanometre, and the rubber band ends there too. Object snap is judged from where you point, so it wins over the grid, and it applies to the first vertex as well. Ortho / Shift applies after it. The segment keeps the previous vertex's coordinate on the locked axis exactly, and only the free axis follows the grid; at 45° it steps along the diagonal in whole grid steps. Only a snap target on that axis counts: any other is ignored, so it neither moves the point nor hides a target on the axis (such as the perpendicular foot) behind it. The Stretch tool's drags snap the same way (see Stretch). Measure snaps its ends and clicks the same way, with no marker. Box takes the grid and its alignment guides, and Circle / Arc take the grid; neither uses object snap. Only shapes you can see are targets: shapes on a hidden layer are not, locked layers are, and at a minimum hierarchy level of 1 or more the active cell's own shapes (not drawn then) are not. To place a vertex exactly where you mean with no snap at all, type its coordinates (Tab, or Enter before the first point): drawing tools never snap a typed point. To stop snapping to geometry altogether, untick Snap to objects in the toolbar's Snap settings popover (the chevron beside the magnet), or run Object snap from the command palette (Ctrl+K). Off, no drawing, measuring, moving or placing gesture snaps to existing shapes, and no marker is shown; the grid still applies. Port snapping when placing a component is not affected. It is on by default and is not saved between sessions.
Draw boolean mode — merge / subtract while drawing
The Properties panel shows a Draw mode picker (Normal / Merge / Subtract) whenever the Box, Polygon, Path, Circle, or Arc tool is active — a live, at-commit boolean, CleWin-style, not a separate command (the Connector, Text, Measure, Select, Stretch, Match properties, and Slice tools don't show it). It's session-sticky: it stays set across tool switches, but it's never saved with the document, never on the undo stack, and resets on reload — the same session-state class as ortho/polar mode above.
- Normal (default) — draws add a new shape, exactly as everywhere else in this manual.
- Merge — on commit, unions the new shape with every shape it overlaps on the same (layer, datatype) pair. A shape that overlaps nothing there is just added, same as Normal.
- Subtract — on commit, cuts the new shape's area out of every overlapping same-pair shape, then discards the shape you drew — it is never itself added. Consuming everything underneath is legal and leaves nothing behind. If it overlaps nothing, nothing changes; if the drawn shape can't cut at all (a zero-width path, for example), Glyph says so instead of silently doing nothing.
Same-(layer, datatype)-pair only — for a cross-layer merge or subtract, use (Arrange) instead. Whichever mode is active, one commit is one undo step, and a large merge/subtract runs on the same cancellable background worker as the selection-based booleans (Arrange) — if the drawing changes while it's running, the result is discarded rather than applied to geometry that has moved.
10.1 Coordinate input grammar (Dynamic Input HUD)
A step line above the fields names the current gesture (e.g. "Box · drag, or type @W,H to size it exactly", "Polygon · click the next vertex · 3 placed"; Path says "point" instead of "vertex", matching the status hint row below the canvas), a trailing chip echoes the point already committed (e.g. [corner 5.00, -8.00 µm]), and — while a Polygon or Path is mid-gesture — a second row of clickable chips ("Undo vertex" — "Undo point" on a Path — "Close"/"Finish", "Cancel") mirrors the Backspace/Enter/Esc keys; "Close"/"Finish" is disabled (and says why, in its tooltip) until the gesture has enough points to actually close/finish — 3 for a polygon, 2 for a path. While dragging a Box's second corner, a second read-out line leads with the live W <value> × H <value> the drag has already produced (c126, C126-T1tb) — the exact numbers a novice asks for, which the Distance/Angle fields below never show on their own (a diagonal length and a bearing, not a width and a height); typing @W,H into the Distance field (e.g. @100,50) commits an EXACT width × height, relative to the first corner — the plain absolute W,H form lands at that world point instead, which is only the same box if the first corner happened to be the origin. On a small canvas the chip row, the W×H read-out and the committed-point chip all stand down, the step line shrinks to just the tool name and its running count (e.g. "Polygon · 8") plus a compact ⌫ ↵ Esc hint, and the "Tab ↹ to type" hint disappears too — so the HUD itself can never grow large enough to sit over the next vertex you're about to place. The HUD has two fields: distance (left, with its own unit suffix — µm/mm/nm, whichever the document is set to) and angle (right, suffixed °). Enter commits, Esc cancels. Tab/Shift+Tab move focus forward/backward between the two fields like any ordinary input pair — Tab from Distance goes to Angle and Shift+Tab from Angle goes back to Distance, but Shift+Tab on Distance and Tab on Angle leave the HUD entirely (there's nothing before the first field or after the last one) rather than bouncing back and forth; clicking a mid-gesture chip with the MOUSE never moves keyboard focus off the canvas, so "Tab ↹ to type" stays true immediately after. It also holds with an earlier shape still selected: while a drawing tool is armed that shape's size badges drop out of the Tab order, so Tab lands in the Distance field, and after a typed commit keyboard focus goes back to the canvas, ready for the next Enter or Tab. By default the distance field accepts a plain number and uses the live cursor angle, but it ALSO accepts AutoCAD-style coordinate strings — just type them into the distance field:
A Box click with no drag keeps that point as the first corner and puts the cursor in the Distance field ("Box · click the opposite corner, or type @W,H"), so B, a click, @100,50, Enter draws a 100 × 50 box; a second click places the opposite corner instead, and Esc drops the kept corner.
| Syntax | Meaning | Example | Resolves to |
|---|---|---|---|
x,y |
Absolute world point in the active display unit | 5,3 (in µm mode) |
(5000, 3000) nm |
@dx,dy |
Relative offset from the reference point (the previous vertex of the in-progress polyline / drag origin) | @5,3 after a vertex at (10,10) |
(15, 13) |
@d<θ |
Polar — distance d at angle θ (degrees CCW from +x) from the reference point |
@5<45 |
reference + (5cos45°, 5sin45°) |
Whitespace is ignored. Decimals are accepted (@2.5,1.5). Negative numbers work (@-5,0 for "5 units to the left"). Distances honour the active display unit (nm / µm / mm — File → Setup → Settings); angles are unitless degrees regardless.
The HUD picks the parser path automatically: if the string contains any of @, ,, or <, it's treated as a coord. Otherwise it's a plain numeric distance combined with the live cursor angle.
When does the parser run? While drafting any of:
- Polygon / Path: each click activates the HUD with the new vertex as the reference point. Type the next vertex's coord and press
Enterinstead of clicking. - Box / Circle: HUD activates on the first click; the second corner / radius point is what you type. A Box finished by a typed corner keeps the Box tool armed, so
Enterstarts the next typed box straight away (a box finished by a mouse drag returns to Select as before); press the Select key (Vby default) or click Select to leave it —Esccancels a box in progress but does not leave the Box tool. - Arc: HUD activates after the first two clicks (centre, then radius/start) — type the next point instead of clicking; the sweep-end entry completes the arc and closes the HUD. A typed radius/start or sweep point is never ortho-locked to 45° the way a
Shift-held click is (typing an exact point already states your intent precisely, so there's nothing to snap); holdShifton the click itself for ortho-locking. - Stretch translate & Move drags: the current cursor anchor is the reference; type a delta to translate the marked vertices by an exact offset.
Keyboard-only start (no click at all). With Box, Circle, Polygon, Path, or Arc armed and nothing drawn yet, press Enter instead of clicking: it opens the HUD to type the FIRST anchor as an absolute point (plain x,y — the reference point is meaningless before anything exists to measure from), auto-focused so you can start typing immediately, and submitting it starts the draft exactly as if you'd clicked there. Every later vertex/corner works the same as the click-started flow above (including Arc's ortho limitation just above). This is the only way to draw a shape with no pointing device at all; Esc from this first-anchor HUD closes it with nothing drawn (there's no in-progress gesture yet to fall back to).
Typed points here are literal. Every typed draw/arc anchor lands at exactly the value you typed — no grid-snap, no object-snap — because typing already states the point precisely (the same reasoning behind Arc's ortho limitation above). This is a deliberate difference from Measure's typed points (Measuring), which instead replay the same grid/object-snap pipeline a click would. Documented, not unified: see Measuring's matching note.
Examples:
- Drawing a 10 µm × 5 µm rectangle from the origin: click
(0,0), then in the HUD type@10,5and pressEnter. - A 30° offset of 12 µm from the previous vertex: type
@12<30and pressEnter. - Place a polygon vertex at the absolute point
(100, 200)µm: type100,200and pressEnter.
Parser source: src/canvas/coordParse.ts. Returns { kind: 'absolute' | 'relative' | 'polar' | 'invalid' }; the HUD's resolveCoord step converts to a world-nm point using the active display unit and the reference. Invalid input falls through to the live-angle numeric interpretation, so a typo doesn't cancel your draft — it just commits at the cursor.