docs / panels / BOM Panel

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.

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:

The rest of the assembly is there for reference:

Every edit to the Work part updates the assembly while you stay in the part:

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:

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.

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:

ColumnWhat a wire line shows
ItemThe connection ID: the wire's name, or its id when it has none
Quantity1. A wire is one cut.
MF QTYThe cut length: the routed length plus the cut margin, to three decimals
Part NumberThe 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 readsWhy
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 cancelledThe last rebuild was cancelled, so the model shows the result from before your last edit. The next edit rebuilds it.
rolled backThe 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 rebuildNo 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:

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:

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.