-
Notifications
You must be signed in to change notification settings - Fork 20
Symbol Editor
The Symbol Editor authors .snxsym files — Signex's native schematic
symbol format. A single .snxsym is a container: it holds many
symbols, each with its own UUID, pins, body geometry and metadata.
That's Altium SchLib parity, not one-file-per-symbol.
Shipped through v0.13.0 (unified Active Bar, .snxsym TOML
envelope) and extended in v0.14.0 with first-class multi-unit
parts — per-unit pins and per-unit body geometry.
- Double-click a
.snxsymin the project tree (single click only highlights; a second click within 500 ms opens) - Right-click a
.snxliblibrary node → Add New ▸ Symbol Library — mints a fresh.snxsymand opens it - Right-click a project root → Add New to Project ▸ Symbol Library
- Open Symbol Editor on the Symbol pane of a Component Preview tab
A .snxsym opens as a normal tab, so it can be undocked into its own
window like any other — see Multi-window Editing.
┌───────────────────────────────────────────────────────────────┐
│ [Fit] [←] Part 1 / 2 [→] [+] [−] [Save *] │ ← toolbar
├───────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────────────┐ │
│ │ [Filter▾][Snap▾][Place▾][Select▾][Align▾] │ ← Active Bar
│ │ [Pin▾][Text▾][Shapes▾] ║ [Select] [Place Pin]│ │
│ └──────────────────────────────────────────────┘ │
│ │
│ canvas │
│ │
├───────────────────────────────────────────────────────────────┤
│ X: +2.540 mm Y: -1.270 mm │ 100% │ 8 pins │ Tool: Select │… │ ← status
└───────────────────────────────────────────────────────────────┘
| Button | Action |
|---|---|
| Fit | Zoom to fit the symbol |
| ← / → | Previous / next unit |
| Part n / m | Active unit out of declared units |
| + | Add a unit |
| − | Remove the active unit |
| Save | Save. Reads Save * while the file is dirty |
Cursor X / Y in the active measurement unit, zoom percent, pin count, active tool, and two buttons: Grid: ON / Grid: OFF toggles the grid, and the spacing button cycles 0.635 mm → 1.27 mm → 2.54 mm → 5.08 mm (25 / 50 / 100 / 200 mil).
The hint on the right changes with the selection — with something selected it reads "Del removes · drag to move · scroll zooms · right-drag pans · Home fits", otherwise "Ctrl+Z undo · Ctrl+Y redo · scroll zooms · right-drag pans · Home fits".
The symbol editor uses the same floating Active Bar widget as the schematic editor — same root highlight, same dropdown panels, same chevron, same right-click behaviour. See Active Bar for the general pattern.
Eight chevron-bearing dropdown triggers sit at the front of the bar, then a separator, then two direct tool buttons:
| Button | Left-click | Right-click |
|---|---|---|
| Selection Filter | opens the menu | opens the menu |
| Snap Options | opens the menu | opens the menu |
| Place / Move | (stub) | opens the menu |
| Select | arms the Select tool | opens the selection-mode menu |
| Align / Distribute | (stub) | opens the menu |
| Pin | arms Place Pin | opens the pin-variant menu |
| Text | arms Place Text (String) | opens the menu |
| Shapes | opens the menu | opens the menu |
| Select (after the separator) | arms the Select tool | — |
| Place Pin (after the separator) | arms Place Pin | — |
Clicking anywhere outside an open dropdown dismisses it.
Be aware: a lot of the dropdown rows are placeholders. Signex ships the full Altium-shaped menu, and a row that isn't implemented logs a "coming soon" note and closes the menu rather than doing something surprising. What actually works today:
| Menu | Live rows | Stub rows |
|---|---|---|
| Shapes | Line, Arc, Ellipse / Circle, Rectangle | Round Rectangle, Polygon, Bezier, Pie Chart, Elliptical Arc |
| Pin | Place Pin | Input / Output / Passive / Bidirectional / Power (set these on the pin after placing, from the Properties panel) |
| Text | String | Text Frame |
| Selection Filter | the seven per-kind chips toggle | the All On / All Off chip |
| Snap Options | — | all four (Pin Tips, Line Endpoints, Arc Centres, Text Origins) |
| Place / Move | — | all six |
| Align / Distribute | — | all ten |
| Select | — | all nine |
The Selection Filter chips (Pins, Drawings, Texts, Designators, Values, Parameters, Other) toggle and redraw, but nothing reads them during hit-testing yet — they do not filter what you can select. Don't rely on them.
Every shape tool is click-to-click; none of them need a drag. New geometry is scoped to the active unit.
| Tool | Gesture |
|---|---|
| Line | Click the start point, click the end point |
| Rectangle | Click one corner, click the opposite corner (either direction — corners are normalised) |
| Ellipse / Circle | Click the centre, click a point on the radius |
| Arc | Click the centre, click to set radius + start angle, click to set the end angle |
A live preview tracks the cursor between clicks. Esc cancels an in-progress shape, and so does a right-click — right-clicking with a shape half-drawn cancels the shape instead of starting a pan.
Arcs handle sweeps past ±180° correctly: the end angle is tracked unwrapped as you move, so a wide arc is stored as you drew it rather than flipping to the short way round.
Rectangles and circles can take a solid fill — set it from the Properties panel; new shapes start unfilled.
Arm Place Pin (the Active Bar's Pin button, or the bar's trailing Place Pin button) and click. Each new pin gets:
- the next free integer number (one above the highest numeric pin
number, or
1on an empty symbol) - the name
PIN<n> - length 2.54 mm, orientation Right, direction Unspecified
- the active unit as its part number
Everything after that is a Properties-panel edit — the placement tool deliberately doesn't ask you 12 questions up front.
Select a pin and the right-edge Properties Panel shows its full field set:
| Field | Notes |
|---|---|
| Designator | the pin number — the key that binds to a footprint pad |
| Name | the label drawn beside the pin |
| Electrical | Input, I/O, Output, Open Collector, Passive, HiZ, Open Emitter, Power, Not Connected, Unspecified |
| X / Y | the tip position in mm |
| Orientation | Right, Up, Left, Down |
| Length | the drawn stub length (2.54 mm on a new pin) |
| Part Number | which unit the pin belongs to (0 = shared) |
| Description | free text stored on the pin |
| Function | alternate names for multi-function pins, comma-separated (MOSI, PA7) |
| Designator visible / Name visible | the Altium "eye" toggles |
| Hidden (Pin Hide) | stored on the pin — see the note below |
| Locked | stored on the pin — see the note below |
Be aware: Hidden and Locked toggle and persist to the file, but nothing acts on them yet — a hidden pin is still drawn on the canvas, and a locked pin can still be dragged and deleted. Treat them as metadata you're recording for later, not as protection.
Under Symbols, four IEEE glyph slots — Inside, Inside Edge, Outside Edge, Outside — each take one of: None, Dot (active-low bubble), Clock edge, Active-low input, Active-low output, Schmitt trigger, Analog (≈), Digital (square wave), Shift-right (▷), Shift-left (◁), Pi (π), Sigma (Σ), Open collector, Open emitter, Hi-Z (tri-state). The inverted-pin dot conventionally goes in Outside Edge.
With nothing selected, the panel shows the symbol itself, in three sections:
-
Symbol — Design Item ID (editable name), plus read-only
UUID, Pins count, Graphics count, and Part (reads
Part 1 / of Parts 2, orSingle-part). - Graphical — a Mirrored toggle.
- Local Colors — per-symbol overrides for Fills, Lines and Pins; cleared, they inherit the theme.
This is deliberately visual and geometric only. Component metadata — designator, comment, description, component type, parameters — lives on the component row in the library, not on the symbol, so it's edited from the Library Browser and the Component Preview tab.
- Click a pin or a graphic to select it. Clicking a graphic selects only that graphic.
- Drag on empty space for an AutoCAD-style rubber-band box select. The drag direction picks the mode: drag left → right for a window box (items must be fully inside), or right → left for a crossing box (anything the box touches is caught). If the box catches every item visible on the active unit, the selection promotes to select-all.
- Ctrl+A selects the whole symbol.
- Clicking an item that's already part of a multi-selection drags the whole group.
- Rectangles show corner and edge handles — drag to resize, with the cursor switching to the matching resize hint. Lines, arcs, circles and text anchors have grab handles too.
- Hit-testing uses the raw cursor position, not the snapped one, so an object sitting off-grid is still clickable. Placement tools snap.
Two behaviours are worth knowing before they surprise you:
-
Deletedoes nothing while select-all is active. That's a deliberate guard against wiping a symbol with one keystroke. Delete a box-selection or an individual item instead. -
Dragging with select-all active moves every pin and graphic in the
active symbol — including the units you aren't looking at. (Other
symbols in the same
.snxsymare untouched.) Box-select the active unit's items if you only want to move those.
By default only a pin's body/tip is grabbable. Tools ▸ Preferences… ▸ Appearance ▸ Pin Selection switches this to Text and pin, which makes the name/number labels grabbable too and glows them with the selected pin. Default is Pin only (Altium parity).
Read out of the canvas input handler — these are the bindings that actually fire:
| Key | Action |
|---|---|
Esc |
Cancel the in-progress shape |
Delete / Backspace
|
Delete the selection (no-op under select-all) |
Home |
Fit the view |
Ctrl+A |
Select all |
Space |
Rotate the selected item clockwise |
Shift+Space |
Rotate counter-clockwise |
Alt+Space |
Rotate a graphic about its own geometry centre instead of the symbol origin |
Ctrl+Z |
Undo |
Ctrl+Y / Ctrl+Shift+Z
|
Redo |
Rotation acts on one selected pin or graphic. A rotated pin pivots its tip around the body end, so the point where the pin meets the body stays put, and its orientation steps round with it. Rotating a multi-selection or a select-all is not implemented — the keystroke is ignored.
| Mouse | Action |
|---|---|
| Left click | Place / select, per the armed tool |
| Left drag | Move the selection, or rubber-band select from empty space |
| Right drag | Pan |
| Right click | Cancel an in-progress shape (otherwise starts a pan) |
| Scroll | Zoom at the cursor |
Keyboard shortcuts are configurable — Tools ▸ Preferences… ▸ Keyboard Shortcuts (v0.14). See Keyboard Shortcuts.
A multi-unit symbol is one component drawn as several sub-parts — the four gates of a 74HC00, the two halves of a dual op-amp. Signex models this the way Altium does, and as of v0.14 it is first-class on both pins and body geometry.
Unit scoping. Every pin and every graphic carries a part number:
-
0— Part Zero. Shared: drawn and editable on every unit. This is where power and ground pins usually go. -
1..=N. Scoped to that one unit.
Drawing, rendering and hit-testing are all scoped to the active unit, so editing Part 2 can't disturb Part 1's body. New pins and new shapes take the active unit automatically. Box-select only catches what's visible on the active unit. (The one exception is a Ctrl+A select-all, which spans every unit of the symbol — see Selection and movement.)
Legacy files whose geometry predates unit scoping load with part number
0 and keep drawing on every unit — exactly as they did before.
Navigating. The toolbar's ← / Part n / m / → navigator
switches units. Switching drops the current selection so a stale index
can't act (via Delete or Space) on geometry that just went hidden.
The SCH Library panel expands the active
multi-unit symbol into one clickable row per unit — Part 0 (shared)
when the symbol has Part Zero pins, then Part 1 … Part N.
Adding. + on the toolbar, or Tools ▸ New Part. The new unit becomes active immediately. The declared unit count is stored in the file, so an empty new unit survives navigate-and-save — it isn't inferred from whether any pin happens to claim it.
Removing. − on the toolbar, or Tools ▸ Remove Part. Removing a unit drops its pins and its graphics, renumbers every higher unit down by one, and decrements the declared count.
Remove only acts on Part 2 or higher. Part 0 (shared) and Part 1 are never removed, and neither is the last remaining unit — with Part 1 active the button silently does nothing rather than leave you with a symbol that has no units. To drop a unit, navigate to it first.
Both are undoable.
A .snxsym is a TOML envelope with TSV bulk blocks — the same
shape as .snxsch / .snxpcb / .snxlib:
format = "snxsym/v1"
file_uuid = "018f2c3a-…"
display_name = "Analog"
[[symbols]]
uuid = "018f2c3b-…"
name = "OPAMP-DUAL-8"
designator = "U?"
comment = "*"
part_count = 2
version = "0.0.1"
released = false
pins_tsv = '''
number name electrical pos_x pos_y orientation length … part_number
1 OUT1 Output 5.08 2.54 Right 2.54 … 1
2 IN1- Input -5.08 1.27 Left 2.54 … 1
'''The pin table is TSV so it diffs line-by-line in git and opens in a spreadsheet. Graphics, parameter maps and per-symbol metadata stay inline TOML — they're variant-shaped or sparse, and TSV would only make them worse.
The format token is snxsym/v1. Adding or reordering a pin column is a
wire-format break and bumps it.
Every symbol carries its own semver version and a released flag, stored per-symbol and independent of any component row that binds it. Neither field is edited from the symbol canvas today — the editor's Save writes the file as-is and does not bump the version for you.
The parser checks the format token and refuses anything it doesn't
recognise rather than half-reading it. Pre-envelope JSON .snxsym
files from early builds do not load in v0.14 — the reader is
TOML-only.
Known gaps as of v0.14.0:
-
A symbol you author cannot yet be placed on a schematic. The
conversion from a
.snxsymsymbol to the schematic's placed-symbol representation does not exist — issue #365 and issue #364. This is the single biggest gap in the symbol workflow: you can draw the symbol, bind it to a component row, and preview it, but not place it. Per-unit bodies are affected by the same gap. - Most Active Bar dropdown rows are stubs — see the table above. Place / Move, Align / Distribute, Select-mode and Snap menus are entirely placeholder today.
- The Selection Filter chips don't filter anything. They toggle, but hit-testing ignores them.
- A pin's Hidden and Locked flags aren't enforced — they persist to the file, but the canvas draws hidden pins and moves locked ones.
- The SCH Library panel's Place and Edit buttons are greyed stubs.
- Polygon, Bezier, Round Rectangle, Pie Chart and Elliptical Arc are not implemented — Line / Arc / Ellipse / Rectangle are the shape set.
- Rotation is single-item only and Delete is disabled under select-all (see above).
- The designator / value field drags on canvas are no-ops — those fields belong to the component row, not the symbol.
-
Component Libraries — the
.snxliblibraries a.snxsymlives in, and the component rows that bind it - Active Bar — the shared floating-toolbar pattern
- Properties Panel — where every pin and symbol field is edited
- Keyboard Shortcuts — the configurable keymap
- Themes — the symbol canvas follows the active theme
Signex v0.14.0 · Apache-2.0 · Issues · Discussions · Website