BOM Panel
The BOM panel is the bill of materials: one line per part placed in the document, then one
line per harness wire, each wire carrying the length an automatic wire-cutting machine cuts
it to. It is a dock tab titled BOM (panel id assemblyBom), shown in the
Assembly, Wire harness and
All workbenches.
Header
- Packed (the default) shows one line per part, rolling placements together only when every visible occurrence column matches. Unpacked shows one line per placement. Wire lines are never rolled together.
- Expand all / Collapse all open or fold every line that has nested sub-assembly components.
- Cut margin is added to every wire's routed length to give its cut length. It appears
once the document has a wire, or already stores a margin other than 0. It is saved with the
harness (
cutMarginin thewireHarnessblock, see File formats), and a drag or typed value is written when the edit ends, as one undo step. - The summary
N rows / M occurrences, followed by/ K wireswhen the document has wires.
Component lines
The Item column shows the part name, or the part name and its placement id when unpacked.
Click a line to select its components; Ctrl (Cmd) or Shift adds or removes a line. Lines
of a sub-assembly's own components show beneath it, at every depth, with their proper part
names, and they select the same way: the selection is that occurrence's solids in every
placement the line stands for. A Solid, Face or Edge pick on a nested part in the viewport
marks that part's own line. A Component pick selects the top-level component, so it marks
the top-level line. The cell and a right-click anywhere on the line open its menu:
the shared component menu — the same one the selection context bar and the viewport's
right-click show: Make Work Part, Open part, Save part as… (a part with no file of its own only),
Edit feature, Move, Unfix and Move (a fixed component only), Move Copy,
Replace…, Fix or Unfix, Hide or Show, Info and Delete.
An action that a line cannot honour, for example Move on a packed line of several
placements, or Move on a part inside a sub-assembly, is greyed out with the reason. Fix
and Unfix on a packed line act on every placement it stands for, as one undo step (it
reads Unfix when any of them is fixed).
Nested lines show their part. columns (the part's own attributes) and their occurrence.
columns (the placement inside its sub-assembly). Editing a nested part. cell writes the
part's definition everywhere it is used, as one undo step. Editing a nested occurrence.
cell writes the placement inside the sub-assembly's definition. When that sub-assembly is
placed more than once, the edit would change every placement, so the cell is shown
read-only and its tooltip says why. A nested PLM part's part. cell is sent to the PLM
like a top-level line's and every copy takes the value once the server accepts it; its part
number, revision and lifecycle state are the PLM's own and read-only. A sub-assembly inside a
sub-assembly starts folded: its box, or Expand all, opens it.
Work part (edit in context)
Double-click a part line, at any depth, or choose Make Work Part (in the line's menu, or on a component's right-click menu and context bar in the 3D view), to edit that part in place. The document tab stays the assembly's. The modeling tools and the history are the part's; the rest of the assembly stays in the same camera, drawn translucent. Double-click another line to switch the Work part. A packed line uses its first placement; use the unpacked view to choose a particular one.
A bar above the viewport shows where you are as a breadcrumb, for example
Work part: top › plate-asm › plate-part (ACOMP1:ACOMP1). To leave or move up:
- Click the assembly's name, press Return to assembly, or double-click empty space in the viewport.
- Press Esc. The first Esc clears a selection; with nothing selected and no sketch or pick active, Esc returns.
- For a part inside a sub-assembly, click the sub-assembly's name, or press Up, to make that sub-assembly the Work part. The part's edits are applied first, and the sub-assembly opens once the assembly has updated.
The rest of the assembly is there for reference:
- Show the rest of the assembly hides or shows it. Hidden, it is neither drawn nor picked. The slider beside it sets how solid it looks.
- A face of another part can be selected (it lights like a selection, but no feature can reference it). With one selected, Sketch on this face and Datum here make a datum on it in the Work part, and the sketch. The datum is copied, not linked: it stays where it is if that part moves.
- While sketching, the sketch's edge pick tool copies another part's edges into the sketch
as plain lines, arcs or circles, noted "copied from
, not linked".
Every edit to the Work part updates the assembly while you stay in the part:
- Each settled edit is written into the assembly's embedded definition of that part, and into every other copy with the same source, at every depth. The assembly re-runs, so other instances of the part change too.
- Assembly constraints that reference the edited geometry re-solve in that same run. A pin mated concentric to a hole follows the hole when the hole moves.
- A constraint that is no longer satisfied, for example one whose hole was deleted, is listed in the bar by its id, type and status.
- An edit that lands while the assembly is still re-running waits for that run, and only the newest part state is applied next. A burst of edits costs one more assembly run, not one per edit.
- If a constraint moves the Work part's own placement, the surroundings and the camera are re-mapped so the view does not jump.
Undo. One part edit is one undo step in the part and one in the assembly. Undo and Redo in the Work part also undo and redo its effect on the assembly. An undo followed by a different edit discards the redo of both. Edits that the part coalesces into one step, such as one slider drag, replace one assembly step and do not stack. Returning to the assembly adds nothing, because the assembly already holds one step per part edit. Its Undo then steps back through those edits. The part's own undo history ends with the session.
Save. While a part is edited in place, Save writes the assembly with the part's latest state, and also writes the part's own file (see Saving into the parts). Reopening the assembly rebuilds the edited part and re-solves the constraints. The bar lists the files the next Save will write.
Open part runs the same session with the part in a tab of its own; the assembly keeps updating in the background. Switching tabs ends the session.
Constraints inside a nested sub-assembly are solved when it is built under its parent, and a nested Work part is placed where they put it.
part. columns are stored on the part's own document, and every copy of the part in the
assembly takes the edit; the part's file is written by the next Save. occurrence. columns
are stored on the placement. See the Part attributes section of the Assembly workbench
and Part Properties. Editing a packed line writes every placement it
rolls up, as one undo step.
Saving into the parts
An assembly holds a copy of every part and sub-assembly it places. A copy that came from a
file (or a PLM item) belongs to that document. Edits made from the assembly change the copy:
a Work part edit at any depth, a part. cell, or a nested occurrence. cell, which lives in
the sub-assembly. Save in the assembly then writes the assembly and every document whose
copy changed. Parts are written before the sub-assemblies that hold them. When a part inside
a sub-assembly changes, the sub-assembly's file is written too, so opening it alone shows the
new part. Each file is written with its current state, so an edit you undid is not written.
Save As writes the changed documents in the same way.
The status line and a notice list the files written.
Every part gets a file. A Save never keeps a part only inside the assembly:
- A part or sub-assembly with no file of its own (an embedded import, a part made in the
assembly, an older document) is written to a new part file named after it, in the
assembly's folder:
pin-part.nbrep, or<assembly>-pin-part.nbrepwhen that name is taken (then-2,-3, …). The assembly then uses that file like any other part. A sub-assembly that holds it is written too, so it names the new file. To choose the name yourself, use Save part as… on its line first: the file is written at once, every copy of the part uses it, the part opens in a tab of its own, and the assembly's next Save keeps the reference. If the name is taken, it asks whether to save as<name>-2(the default) or overwrite the file. - A part whose file was deleted or moved is written again where it was, and every copy keeps using it. If that place cannot be written, it gets a new part file in the assembly's folder instead.
Neither asks a question. The summary lists the new files and the re-created ones separately.
Nothing is refused that you can say yes to. When a document needs a decision, Save shows one dialog with a row for it. Every row is ticked (yes) by default, so Enter saves everything. Untick a row to skip that document; its change stays in the assembly. Cancel saves nothing.
- Changed on disk since the assembly was opened: overwrite it.
- Not checked out to you (a PLM item): check it out, then save it with the PLM's usual save. If the checkout fails, the notice says so and the change stays in the assembly.
- A family member: save the change as a new file beside it (
plate-edited.nbrep). Every copy in the assembly then uses the new file. A family member's stamp is not copied. - Changed differently in two places (only possible when a file was edited outside the app): keep one copy. The row names every copy and chooses the one edited last (the deepest, when the edits cannot be told apart); pick another before saving if you want it. Every copy then becomes the kept one.
A sub-assembly that holds a part the Save moves to a new file (a family member's change, or a part given its first file) is written too, so its own file names the new one.
A PLM item that someone else has checked out, or a released revision, cannot be saved. The summary names it and the rest is saved. On a file store there are no PLM questions.
Starting a Work part on a PLM part that is not checked out to you offers to check it out right away. Check out is the default.
Edit-time writes are gone. Before 2026-10-20 a part. cell edit wrote the part's file
immediately. If you undid the edit, the file kept it. The file is now written by the
assembly's Save, like every other edit made in the assembly. Until then the edit marks the
assembly as unsaved, and undoing it back to the saved state clears the mark.
Open documents stay linked
A part open in its own tab and the same part inside an open assembly are one part. Edit the plate in its tab, saved or not, and switch to the assembly: every copy of the plate takes the edit, the assembly re-runs, its constraints re-solve and the assembly becomes unsaved. Edits made in the assembly reach the plate's tab when you switch to it. Two open assemblies that use the plate both take the edit, and an edit in one reaches the other. Undo stays per tab, and an undo carries across the same way on the next switch. One Save, from either tab, writes that source's file.
An open PCB or Diagram works the same way. Because a renumbered pin re-pins the board, the board says so when you switch to it: a notice names the part and what changed, and one Undo takes it back.
Wire lines
Every connection in the Wire Harness panel is its own line, after the component lines:
| Column | What a wire line shows |
|---|---|
| Item | The connection ID: the wire's name, or its id when it has none |
| Quantity | 1. A wire is one cut. |
| MF QTY | The cut length: the routed length plus the cut margin, to three decimals |
| Part Number | The wire's stock part number, when it has one |
The routed length is measured along every spline the wire passes through, from one
connection point's base point to the other's, including each point's straight extension
run. The cut margin is added once per wire:
two wires down the same splines are two lines, each with its own margin, never one line
with the margin counted once.
Routing results are never saved. A line shows a cut length only when the last rebuild routed the model as it stands; otherwise MF QTY says why, and an amber badge on the line explains it:
| MF QTY reads | Why |
|---|---|
routing… | A rebuild is running. The length shown before your last edit would be the old route's, so none is shown until the rebuild lands. |
rebuild cancelled | The last rebuild was cancelled, so the model shows the result from before your last edit. The next edit rebuilds it. |
rolled back | The history is rolled back. A spline past the rollback is not in the network, so a wire can route over a different path and still read routed. Roll to the end for cut lengths. |
needs a rebuild | No routing run has been applied yet. |
not routed (…) | The router could not route the wire. The word is its status (missing-endpoint, no-route, …), and hovering the badge shows the router's sentence. |
A wire line is read-only here. Edit the wire in the Wire Harness panel.
Status badges
Each component line carries up to four badges:
- : grounded (fixed). Unfix it before moving it.
- (amber): its source file changed. Click it to update the outdated components.
- (−): under-defined. The mates still leave it free to move, and hovering says how much, for example the mates leave 1 turn and 2 slides free. A turn is a rotation about the component's own origin; a slide is a straight move. A component no mate reaches is entirely free (3 turns and 3 slides). A fully defined component carries no badge. The counts come from the last solve, so the badge appears once the assembly has at least one mate. A rolled-up line shows its freest placement.
- : the worst status of the constraints on it, in the status colour (magenta for a conflict).
Columns
The columns are configured as text in Settings ▸ Assemblies, one per line in display
order, with a leading * to show it. Dragging a heading to reorder or hide a column rewrites
that text. The Item column, the visibility toggle, the status badges and the
menu are always there. Three columns are derived and read-only:
occurrence.Quantity: the placements a line rolls up, or1;occurrence.MF_QTY: a wire's cut length (blank on a component line);part.PMI: how many annotations the part's own document carries.
Mass and material
part.Material, part.Density, part.Mass and part.Volume describe the part, so every
line of a part shows the same values and they are edited on the part (here, or in its
Part Properties). Mass and Volume are read-only: computed from the
part's geometry and its Density in g/cm³ (or the density its Material names), with their
units. A line whose part has no density says so instead of showing a number. The Assembly
line's Mass is the total, quantity × mass over every line, once every part has one. Nested
lines show their own part's mass.
These are never stored on a placement. An occurrence column for one of them
(occurrence.Mass) is read as the part's, and the configuration text notes the line.
Opening an older document that stored Mass or Material on its placements moves the values
onto the part: equal values move silently, the first of disagreeing ones is kept, and one
notice lists what moved and any disagreement. Save the document to keep the move.
Export
File ▸ Export ▸ BOM (CSV) and BOM (JSON) write the same lines, and are enabled while the document has components or harness wires (a harness with no components exports its wires). The CSV header is always
partName,sourceKey,quantity,material,densityGcm3,volumeMm3,massKg,totalMassKg,connectionId,mfQty,status
A part line fills the first eight columns: its quantity, its part's material, density
(g/cm³), volume (mm³, three decimals), mass and total mass (kg, six decimals; total =
quantity × mass). A number the part cannot give (no density, no geometry) is left empty, or
null in JSON. A wire line has its stock part number as
partName, quantity 1, its connection ID, mfQty to three decimals, and status, which
is current or why there is none (routing, cancelled, rolled-back, no-run, or the
router's word). A wire with no current length leaves mfQty empty, or null in JSON —
never a stale number.
A PCB's electronic parts, with reference designators, values and footprints, have their own export: Parts BOM (CSV), in the Export dialog's board row (PCB Workbench).
Automation
The bom_wire_lines command reads the wire lines without the panel — each with length,
margin, mfQty and status, plus a reason when there is no number — and wire_harness_set_cut_margin
sets the margin; a negative margin is refused.