Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Inspector

The inspector is the right-hand panel, and it is where you edit. It shows three things at once: the component you have open, the child or compartment selected inside it, and the vertex selected inside that. The upper section is the component; the lower section is the selection. Drag the boundary between the two, or the panel’s left edge, to give whichever you are working in more room — both are remembered.

The header

The header names the open component and carries the three actions that apply to the component as a whole.

The name is editable in place and commits when you press Enter or click away. A name that is empty, already taken, or not a valid identifier is refused, and the field returns to the real name.

The star sets the component as the design’s root — its top-level component, the one the file opens at. It is disabled, and stays gray, when the component already is the root.

The trash deletes the component. The deletion is refused if the component is the root, or if another component places it; the button is disabled and the tooltip says which of the two applies.

A component opened from Libraries is another file’s definition, so the header drops to a plain heading marked built-in component (read-only) and no edit controls appear.

If the open component cannot be built — an expression that does not type-check, a missing argument — the reason appears in red under the header and stays there while you fix it. The viewport goes on showing the last version that built.

The tabs

The component has four tabs: Params, Computed, Pins and Body. A tab carries a count when there is something behind it. The + on the tab strip adds to the tab you are looking at, and appears only on Params and Computed — pins and children are created elsewhere. The tab you pick stays picked as you move between components. A built-in shows three tabs; it has no authored body.

Params

name │ type │ default │ 🗑

These are the component’s inputs — what someone placing it can set. + adds a row.

The type dropdown commits as soon as you pick. The default editor matches that type: drag a number and the viewport follows, release to commit; typed values commit on Enter or focus loss. A parameter loaded without a default reads (required) and is not editable here. Deleting a parameter that something refers to is refused, and the tooltip lists what refers to it.

Computed

name │ (type) │ expression │ 🗑

These are values derived from the parameters by expression. You author the name and the expression; the type is inferred rather than declared, which is why the type column is parenthesized and read-only. It reads (?) while the component does not type-check — the error under the header says why.

The expression commits on Enter or focus loss. One that does not parse does not take effect.

Pins

name │ source │ 🗑

These are the connection points the component exposes to whoever places it — its published contract, and nothing else. What a terminal is — whether it is a world port, how big its punch is — sits in the terminal’s own detail, reached by selecting it here or in Body.

The name renames on Enter or focus loss. It locks, with the references in its tooltip, while another component refers to the pin — a rename would break it. The source names the terminal behind the pin (← p1, ← mixer / out); it is hidden when it would only repeat the pin name. Clicking anywhere on the row selects that terminal, and hovering it lights the terminal in the viewport.

There is no + here. You expose a pin from the terminal itself: right-click a point or a placed component’s pin, or use the Expose button in its detail block.

Body

The tab shows the component’s children as a tree: placed components, channels, points and regions, with a region’s compartments nested beneath it.

This is the same selection the viewport uses, so a row click and a click on the geometry are interchangeable, and selecting in the viewport scrolls the matching row into view. Hovering a row lights the child. The trash on a row deletes it, and is refused with a reason when something refers to the child by label.

The selection

The lower section shows what is selected. It is always there, and with nothing selected it says so.

The breadcrumb

Pinned at the top of the section, the breadcrumb names the chain of scopes down to what you are editing — child, compartment, vertex. Every crumb above the last is clickable, so it is also how you step back out. A compartment leaf carries a trash beside the chain, and it removes what that last crumb names; a child is deleted from the Body tab and a vertex from its own group below, so neither puts a trash here.

A selected child

What the detail shows depends on what kind of child it is.

A placed component shows its pos, rot and layer placement rows, then its args, one row per parameter of the component it places. Each args row has a checkbox that overrides the parameter or returns it to the placed component’s own default. Below those sits one row per pin the placed component exposes, with an Expose button that forwards the pin through the component you are editing, or a readout of the name it is already forwarded as.

A channel has no placement rows — its placement is fixed, anchored to the terminals at its ends, and the panel says so. Instead it shows an ends block: one row per end, naming what that end connects to (end 0 · at p1), each carrying that end’s width control, which is either inherited or explicit. Hovering an end row lights the terminal it connects to.

A selected terminal inside a placed component — a pin row in Body — shows its own section under the component’s detail: an offer row, the world port tick and the bore rows. The offer row is the point’s own count and all tick plus a floor, since a terminal inside a component has no layer row of its own to anchor to; unticked, it reads the offer the component published, dimmed and marked · component. Both numbers are relative to the terminal, and the absolute range they work out to is echoed after them.

Every terminal, wherever it is selected from, carries the same three blocks under whatever else its detail shows: the world port tick with the face it exits by beside it, the offer row, and the bore rows.

punch size is the hole’s diameter, operation is what cuts it (punch, drill, or molded in by the tool itself), stage is whether it is cut before or after the layers are bonded, and pad offset is how far the channel is widened where the hole lands, so the tool has something to hit. Each row is an override checkbox: unticked, it shows the value it inherits, dimmed and marked with where that came from — · point for a value the point behind a component’s pin authors, · process for the shop’s default. Ticking seeds the value already showing, so the tick alone changes nothing.

The rows describe the opening this terminal would form, so they stay editable on a terminal that forms none, with a line above them saying nothing opens there yet. Two openings answer stage themselves and the row greys out saying which: a molded-in hole is made with the part, and a via buried between two layers has no way in once the stack is bonded, so both are cut before assembly whatever the row was set to. What you authored is kept underneath and applies again if the opening stops being either. See Channels & points for what forms an opening in the first place.

A point shows its placement, its offer and width, and whether it is exposed as a pin. The offer row is a count of layers with an all tick beside it, and the range it works out to is echoed after them; a wall-bound point rides one slab, so its row is greyed — with an Expose as pin button when it is not. The detail also carries Dissolve into channel, disabled with a reason where the point does not qualify. See Channels & points for what it merges.

A region is edited one compartment at a time, so its detail is the compartment’s.

A selected compartment

The outermost compartment is the region child, so its detail opens with the region’s own placement rows. A nested one opens with a name field — leave it empty and it falls back to the derived label shown dimmed beside it — plus dx, dy and rot. See Regions & compartments for what those rows move and why a nested compartment has no layer row.

Under those, region · N vertices names the ring, and the fill control below it says what the compartment is: void is a carved pocket, material is untouched slab. Switching a void compartment to material is how you make a hole; switching it back makes a pocket. The material direction is disabled where it would leave material inside material, and on a region’s outermost compartment, which is always void; the tooltip says which case applies.

Fabrication

Void compartments and channels carry a fabrication group of override rows; a point carries the same group with the two corner-radius rows alone. Each row has a checkbox: ticked, the value is this child’s own; unticked, it is inherited, and the effective value is shown dimmed beside the name of what it came from. Ticking seeds the override from whatever the row is displaying, so ticking alone changes no geometry. Unticking clears it and returns to tracking the inherited value.

face chooses which side of the slab the shape is formed from, and appears only at the scope that is the child itself. depth in µm is what makes a chamber deeper than the channels running into it, or a pocket a step in that chamber’s floor. walls is the wall profile — its second row appears only when the profile has a parameter to set. The two corner-radius rows close the group, inner and outer.

face, depth and walls inherit from the child’s layer; corner radii inherit from the process forming it. A child sitting off the stack has no layer to inherit from, so its unset rows read — and cannot be ticked. Existing overrides stay removable either way.

A selected vertex

Selecting a single vertex adds a group at the very bottom, titled with what it is (Selected vertex — rg · hole 1 · vertex 2 / 5) and carrying the delete for it. A channel’s vertex shows its pos and width; a region’s shows its position local to the compartment. A channel’s vertex carries both corner-radius rows; a region’s carries one, for the class its own corner takes. Either overrides the child’s.

Deleting a region vertex is refused at three — a region needs at least three vertices. A channel’s interior vertex always deletes; removing one straightens the channel through it.

See also