docs / workbenches / Assembly Workbench

Assembly Workbench

Id: assembly · Fifth entry in the workbench dropdown

Assembly is for documents that place parts rather than model them: each part is stored once in the document's parts library and placed as many times as you like, and the placements are pinned to one another with constraints.

It offers exactly five features (below): Assembly Component (ACOMP), Pattern Component (APAT), plus Sketch, Datium and Plane, because sketching on a component face in context is allowed. Modeling and Sheet Metal do not offer ACOMP; Wire harness and All do.

When to switch to it

Panels

Assembly claims two panels, so they appear only here, in Wire harness and in All (see the panel matrix); it also shows every unclaimed one.

The two claims reach further than the dock tabs. The selection context bar follows the same rule, so assembly UI does not leak into Modeling:

Moving components

A plain click on a component selects the whole component, and the bar offers the full action set above. Move is also offered on its own when the selection is component geometry — a face, edge or vertex picked with the Component filter off, as you do for constraint work — and when it spans several components:

Typed values on the Move gizmo walkthrough

Recorded from the running app by BREP_mcp/tests/videos/assembly-move-typed.json; regenerate every walkthrough with ./build.sh docs-videos.

One thing deliberately not gated: in every workbench, a modeling feature refuses a reference to component geometry. Sketch, Datium, Plane, Waypoint and Spline may use it — that is how you sketch on a component's face or seat a waypoint on it.

Replacing a component

Right-click a component in the 3D view, or open a BOM row's menu, or use the selection bar, and choose Replace…. The component keeps its place in the assembly: the same occurrence, its pose, whether it is fixed, its BOM occurrence values. Only the part it shows changes.

The component menu with Replace…

The chooser offers, in this order:

Tick Replace all N instances of to swap every occurrence of the part at once. Replace from inside a Work part first returns to the assembly, keeping the Work part's edits, and says so. The replacement, all instances included, is one Undo step.

Pattern Components follow their seed. Replacing a pattern's seed changes every instance of the pattern in the same step, and the chooser says how many follow. An instance is a copy, not a component of its own: right-click one in the 3D view and its menu reads Instance n of APAT1: follows ACOMP2, offering Open part and Replace…. Both act on the seed, and Replace says so before you choose. The result summary names the pattern and how many instances follow. The pattern keeps its seed even when the seed was picked by a face the new part does not have.

What happens to the mates

A mate remembers the faces it holds by name (ACOMP2:Hole_S), and a part's face names come from its own features. Whether those names can be trusted depends on how the two parts are related:

A mate whose face is gone, or whose face is now a different kind of surface (a flat face that became a cylinder), is never moved to another face behind your back. It stays in the assembly, held, and the result summary lists it by name:

The Replace result summary

For each held reference the summary offers:

A repaired mate is enabled again (if it was enabled before) and solved. Close the summary whenever you like: held mates stay held, they survive Save and reopen, and the Constraints panel shows ⚠ N mates held after Replace: Review until each one is repaired or deleted.

When a part is edited

A part edit reaches the assembly in two ways: Update components in the BOM, when the part's file changed, and a Work part edit made in place. Either way, the mates on every occurrence of that part are checked once the assembly has rebuilt:

One Undo takes back the edit and every re-attachment with it.

Toolbar buttons

The Assembly ribbon group has five large buttons, all also in All:

ButtonIdOfferedWhat it does
feature:ACOMPalwaysAssembly Component — opens the insert-component modal: existing parts-library entries first, with an Upload button for a new file
feature:APATalwaysPattern Component — adds a linear or circular pattern of the selected components; mate the seed and the instances follow (Pattern Component)
assembly.step_parts_libraryalwaysstep.parts library — opens the online part browser: search, thumbnails, import a STEP part and add it as a component
assembly.auto_constrainalwaysAuto constraints — infers the mates the components' current placement already implies, and opens the window that lists them
assembly.interferencealwaysInterference check — runs the pairwise intersect sweep now and opens the results window

Interference check

The window lists every pair of components whose solids overlap, with the overlap volume, largest first, and draws the overlapping volumes in red in the view. Set Clearance (mm) and press Re-run to also list pairs that do not touch but come closer than that, with their gap, smallest first; the gap is drawn as an amber line between the two closest points. The gap is measured on the displayed mesh, so curved faces read within the display tolerance. Click a row to select both components and frame them. Every pair is checked, however large the assembly; pairs whose bounding boxes are apart are cleared without a boolean. A pair whose boolean the kernel refuses (usually exact face contact) is listed as not verified rather than as clear. After the model changes, the drawn volumes are removed until you re-run.

PCB retains a borrowed Add component command because its feature palette does not offer Assembly Component. Assembly and All show only the Assembly Component insertion button.

Selecting a Pattern Component instance offers its pattern's actions instead of the component ones: Suppress instance n, Unsuppress instances (k) while any is suppressed, and Select seed. Move on an instance moves its seed. A mate cannot name an instance; its status says which seed to mate instead.

Auto constraints

An imported STEP assembly arrives fully posed and completely unconstrained: every part sits where the file put it, and nothing holds it there. Auto constraints reads that placement back as constraint intent, so the import becomes editable without re-picking every mate.

The window opens already scanned. Each row is a constraint type it can infer, with what it detects and how many it found; unticking a type re-scans without it, because which types are on changes what the rest accept. Create writes the whole accepted set and solves it as one undo step. A scan never changes anything, so opening the window to look is free.

TypeRead from
ConcentricAxis-bearing faces (cylindrical, conical, toroidal) on two parts that share one centreline. Neither the radii nor the distance along the axis need match — a bolt through a stack of plates is as concentric as a shaft in its bore, so this is the one rule asked about every pair of parts rather than only about neighbours
Touch AlignPlanar faces on two parts that lie in one plane, face each other (two flush faces pointing the same way are aligned, not touching) and overlap
CoincidentSpherical faces sharing a centre, and corners of two already touching parts that land on the same point

Contact tolerance is how far apart two faces may sit and still read as touching. The default is 0.001 mm; raise it for a file whose parts carry modelled gaps.

When it finds fewer constraints than you expect

It is measuring, so it can tell you why, and it never drops a candidate silently. Two sections under the results account for everything it saw:

Because every inferred constraint is read off the pose it is then asked to hold, a healthy assembly does not move when the batch solves. Inferring everything does tend to produce a set the solver calls over-determined — several constraints holding one freedom — which the window reports along with the redundant row count. That is consistent, not a failure; trimming a few constraints afterwards makes later edits easier.

Pairs that already carry a constraint are left alone, so pressing Create a second time creates nothing.

The same work is available to automation as assembly_inferable_types, assembly_infer_constraints (the read-only scan) and assembly_apply_inferred_constraints.

The workbench actions toolbar carries, besides the four feature buttons, a Constraints group: one button per constraint type (the icons in the table below), each adding that constraint seeded from the selection and opening it in the panel, as the context bar's offer does.

The same icon stands for the constraint everywhere it is shown by picture: the context-bar offer, the toolbar button, the glyph column of its row in the Constraints panel, and the chip the viewport draws at the constraint (Show Constraint Graphics). The chip reads 12.5 mm or 90° for a dimensional constraint and is the bare icon for the others; hovering it names the constraint (DIST3) and its status, and clicking it selects the constraint and opens the row. While a reference pick runs (a feature's, a PMI field's, a clip's or an instructions step's), a chip does not take the click: it goes to the part under the chip, as if the chip were not there, and the chip keeps its hover text. In the Constraints panel, clicking a row selects the constraint the same way without opening it (the chip gains its selected outline and the context bar offers Delete constraint); double-clicking the row, or its , opens its dialog. The Delete key deletes the selected constraint, or a selected component (its solids picked in the view or its BOM row), exactly as the row's or the component's Delete does, one undo step.

Features (5)

FeatureCode
Assembly ComponentACOMPOne placed instance of a parts-library entry: a part reference plus a rigid pose, optionally grounded
Pattern ComponentAPATLinear or circular copies of placed components that follow one mated seed
SketchSIn-context sketching, including on a component face
DatiumDA reference triad of orthogonal XY / XZ / YZ planes
PlanePOne named construction plane

Constraints are not features

The assembly constraints are a separate catalogue, not features, so they are not in the Add-feature palette and the workbench feature filter does not apply to them. You add them from the Constraints panel's + dropdown, which pre-seeds the constraint's elements from your current selection, filtered by that constraint's own selection filter.

Each one has its own page, with its parameters and an annotated walkthrough of it being applied to a two-component assembly — follow the name.

ConstraintShortElementsExtra parameters
CoincidentCOINtwo of vertex / edge / face / component (two faces: coplanar)facing
Touch AlignTALNtwo like elements (face / edge / vertex)facing
ParallelPARAtwo elementsfacing
DistanceDISTtwo elementsdistance, facing, limit, minimum, maximum
AngleANGLtwo elementsangle, exteriorAngle, limit, minimum, maximum
ConcentricCONCtwo elementsfacing
PerpendicularPERPtwo elements—
TangentTANGtwo elements—
CenterCNTRthree or four: two parallel faces on one component, then one element or two like elements on anotherfacing
SymmetricSYMMthree: two like elements on two components, then the planar mirror face—
GearGEARtwo axesratio, reverse
Rack and PinionRACKthe pinion's axis, then a rack element along its traveldistancePerRevolution, reverse
ScrewSCRWthe screw's axis, then a nut elementpitch, reverse
PathPATHa point and the edge it follows, either orderpinAlong, along, reverse
SlotSLOTthree: the pin, then the slot's two round endspinAlong, along, reverse
CamCAMthe follower (roller, ball or point) and the cam's profile edge, either orderflip

Every constraint except Center, Symmetric and Slot takes exactly two elements; Symmetric and Slot take exactly three. The panel's row label appends the evaluated value for Distance and Angle rows (… 12.500, … 90.0°).

Flip. Each constraint row has ⇅ Flip, which switches the constraint to its other solution as one Undo step:

ConstraintFlip gives
Touch Align, Parallel, Concentric, Centerthe component facing the other way (the other facing)
Distance from a facethe same distance on the other side of the face (the value, or a limit's range, negated)
Anglethe same angle the other way round (negated)
Gear, Rack and Pinion, Screwthe coupling turning the other way; nothing moves until the next drag or typed turn
Path, Slotthe position measured from the other end
Camthe follower on the other side of the profile
Tangent, Perpendicularthe other side, with no setting to change (the next solve stays there)

Coincident and Symmetric have one solution, so their button is disabled with that reason. To reach the other solution, the component the mate moves is first turned over (or mirrored) and then solved. Which component moves: the one that is not fixed; with both free, the one the mates leave freer.

Conflicts. When constraints cannot all hold, the solve names the smallest set that fights: those rows read Conflict in magenta, their chips in the viewport turn magenta, and each row offers Disable. The most recently added member is marked ★ as the suggestion, and disabling it lets the rest solve. The other constraints read Error: not solved until the conflict is resolved, and nothing moves while it stands.

Conflict diagnosis walkthrough

Recorded from the running app by BREP_mcp/tests/videos/assembly-conflict.json; regenerate every walkthrough with ./build.sh docs-videos.

Limit mates. Turn on limit in a Distance or Angle form and the value is held anywhere between minimum and maximum instead of at one number: the component is free inside the range, and a drag stops at the end it pushes against (Distance, Angle).

Center holds one component centred between two parallel planar faces of another — a tab in a slot, a pin between two walls. Pick the two faces that bound the width and, on the other component, either one element (a face, a cylindrical face, an edge or a vertex: three picks in all) or two like elements (two parallel faces, two parallel axes or two vertices: four picks). The count is the option: three picks centre that one element on the mid-plane between the width faces; four picks centre the pair's own middle — the mid-plane of the two faces, the mid-line of the two axes, the midpoint of the two vertices — on it. Pick order does not matter: the constraint works out which two faces are the width (the parallel pair on one component) and which picks are the tab, and its status message names them. A planar tab is held coplanar with the mid-plane (the assembled facing is kept as its facing — as for Touch Align), a cylindrical face or edge has its axis held in the mid-plane, and a vertex sits on it. The two width faces must be on the same component; centring a part between faces of two different parts is not supported.

The panel header also carries manual Solve, an auto-solve toggle, the degrees-of- freedom readout (with over-/under-constrained wording), Show Constraint Graphics, and Update components (N) — a batch refresh of components whose source part has changed.

After editing and saving a source model, return to the assembly and open BOM. Click its amber badge or Update components (N) button to load the latest saved sources. Every instance of each changed part rebuilds, including its displayed geometry. The batch is one undo step; saving the assembly preserves the refreshed models. Save the source first: unsaved edits in its tab are not the saved version.

Constraints in the 3D view

With Show Constraint Graphics on, every enabled constraint draws in the viewport: a leader to the geometry it holds and a chip carrying its icon and, for Distance and Angle, its value. Hovering a chip lights the elements that constraint names; clicking one selects it and opens its dialog in the panel.

Right-click a chip, or a constraint's row in the panel, for its menu: ⇅ Flip (the other solution; greyed with the reason for Coincident and Symmetric), Edit, Disable (switch it off without deleting it; a disabled row offers Enable instead) and Delete. The chip and the row offer the same entries and do the same thing.

A Distance draws a real arrow — the perpendicular from its base face to the other element, in model scale, so its length is the distance — and an Angle draws its sweep as an arc. Those two are draggable: drag the arrowhead (or the arc's handle) and the value follows the pointer, with the arrow and the chip tracking it live. The value commits when you let go, the assembly re-solves, and the components move to match. Dragging an arrow through its base face takes the distance negative, which puts the other element on the far side — the same signed convention the distance parameter uses. A drag is one edit: undo puts the previous value, the previous pose and the previous arrow back. A constraint whose value is an expression has no handle; edit it in the panel.

How defined is each component?

The BOM marks every component the mates do not fully hold with (−), and its tooltip says what is still free: the mates leave 1 turn and 2 slides free for a block that sits flat on a face. Each solve counts it, per component, from the same analysis as the solver's DOF summary in the Constraints panel. A component with no badge is fully defined; marks a grounded one. See BOM status badges.

Grounding

A component is fixed (grounded: the solve never moves it) by one setting of its own, its isFixed. There is no Fixed constraint. Fix / Unfix is on the component's row menu in the components list and the BOM (on a packed BOM row it acts on every placement the row stands for, as one undo step), in the selection context bar, and as the Fixed checkbox in the component's dialog; all of them, and component_set_fixed, make the same change, one undo step. Unfix and Move clears the same setting, in the move's own undo step. A part inside a flexible sub-assembly is fixed on the instance that lends it. A document saved with Fixed constraints opens with each one turned into its part's Fixed setting, in place, and a notice saying so.

The first component of an empty assembly is auto-grounded when isFixed is left unset. The rule keys on absence, so setting isFixed explicitly to false is always respected — you can un-ground the sole component. See Assembly Component.

Sub-assemblies

A sub-assembly placed in an assembly is rigid, as in NX and SolidWorks. Its own constraints are solved inside the sub-assembly first, the same way they solve when you open it on its own, and the assembly's constraints then place the whole sub-assembly as one body. This holds at any depth, and every placed instance of the same sub-assembly arrives already solved. An assembly constraint may still reference geometry inside a sub-assembly (ACOMP1:ACOMP2:Pin_S): it moves the sub-assembly as a whole, never one of its parts.

To let an assembly constraint move a part inside a sub-assembly, tick Flexible on that instance (the Assembly Component's edit dialog). Its parts then take part in the assembly's solve, still held by the sub-assembly's own constraints: a pin that its sub-assembly keeps concentric in a bore can slide along the bore to meet an assembly constraint. Parts the sub-assembly grounds stay with it. Each instance is flexible on its own, so two copies of the same sub-assembly can sit in different positions; the positions are saved with the assembly instance, and the sub-assembly's own file is never changed. Flexible covers the sub-assembly's direct parts; a sub-assembly nested inside it still moves as one body.

The assembly does not re-solve the sub-assembly's constraints, but it does report them. Each one is listed under the sub-assembly's namespace (ACOMP1:CONC1) in the assembly's solve report (nestedConstraints in the degrees-of-freedom report). A sub-assembly constraint that does not end satisfied, or that has lost a reference, also adds a note to the component that places the sub-assembly. The sub-assembly still loads.

Statuses are not saved with a placed sub-assembly. The first time a document is opened, every sub-assembly that has constraints is rebuilt once so its constraints can be solved and their statuses reported. A document saved before sub-assembly constraints were solved this way (builds up to October 2026) may show a part in a different place after that first rebuild. This is expected: the part moves to where its own constraints put it, and the component notes say what changed.

What a document's first runs write back when it opens is part of the open, not an unsaved change. That covers a constraint solved for the first time and the stored picture of a part built again (an assembly imported into the PLM arrives without those pictures). Closing the document without an edit asks nothing. After your first edit, the tab is unsaved as usual. On the PLM, an assembly's copy of a part that has a newer revision is updated when it opens, with a notice. That is not an unsaved change either.

Exploded views

An exploded view pulls the components apart to show how they go together. Open the Exploded views section at the foot of the Constraints pane.

An exploded view is a PMI view whose Explode body annotations are its steps. It is saved with the assembly, the PMI workbench edits it like any view (camera, hidden parts, more annotations), and a drawing sheet or a 3D PDF places it exploded. Where the animation stands is not saved: a view shown again appears fully exploded.

Part attributes

The BOM's part. columns — Part Number, Revision, Material, Mass and the rest — are stored on each part's own document, so they travel with the part. Editing one from the BOM writes it back to the part's file; opening that part in its own tab and using the toolbar's Properties button edits the same record from the other side, with every field shown whether or not the BOM columns hide it. See Part Properties.

The occurrence. columns — such as Item Number, Reference Designator, Find Number, Notes — describe one placement, so they live on this assembly and are edited only here.

PMI is a read-only part. column: how many annotations the part's own document carries. A STEP file imported as an assembly puts an annotation it states about a PART on the part — once, however many instances place it — so it is not in this document and the PMI panel cannot show it; the column says which parts have one, and Open part opens the part that holds it. Annotations the file states about a single instance land in this document and do show in the panel.

Saving an assembly

Save in an assembly writes the assembly and every part or sub-assembly file that edits made in the assembly changed. That covers Work part edits, BOM part. cells and nested occurrence. cells. Parts are written first, then the sub-assemblies that hold them, then the assembly. A part with no file of its own, or whose file is gone, gets one: a new part file in the assembly's folder, or its old file written again. Open documents stay linked: a part edited in its own tab shows in the assembly when you switch to it, and the other way round. A document that needs a decision (changed on disk, not checked out on the PLM, a family member) gets a row in one Save dialog. Every row is ticked by default. See Saving into the parts.

Exporting

STEP export writes the assembly's real structure: one product per parts-library entry, one occurrence per placed instance with its pose, and nested sub-assemblies as nested levels. A part placed twenty times is stored once and placed twenty times in the file.

The BOM exports as CSV or JSON from the ordinary Export dialog — a second row of buttons there, enabled while the document has components or harness wires. It is not gated on this workbench. Each harness wire is its own row with its cut length. See the BOM panel and File Formats.