The user guide, identical to the help bundled with the application (Help → User guide). Version 1.0.0.

1. Introduction

Stack by F³ Lab is an offline desktop tool for dimensional tolerance stack-up analysis. You describe an assembly — its materials, parts and toleranced features — draw the dimensional chain directly on your own 2D drawing, and the application computes the resulting assembly dimension by three methods side by side:

  • Worst Case — the arithmetic limits: every dimension at its worst extreme simultaneously.
  • RSS (root-sum-of-squares) — the classic statistical band.
  • Monte Carlo — full statistical simulation with per-dimension distributions, yield and process-capability (Cp/Cpk) estimates.

Thermal expansion is built in: assign materials with CTE values (constant or a nonlinear α(T) curve) and the stack is re-evaluated at your minimum, room and maximum temperatures.

Everything runs locally. No project data ever leaves your computer.

2. The five-minute workflow

  1. Materials — define each material and its thermal expansion.
  2. Parts — add each part and assign its material. Optionally set a general (UOS — unless-otherwise-specified) ± tolerance per part.
  3. Features — add the dimensions and geometric tolerances that live on those parts.
  4. Requirements — create the assembly dimension you want to verify and set its MIN/MAX limits.
  5. Calculations — draw the stack-up chain on the canvas, assign a feature to every vector, and read the live results.
  6. Results — summary, interactive charts and process-capability statistics; export everything to PDF or Excel.
Try it: Help → Getting started → Open the sample project loads the stepped shaft built in chapter 3 — a fully constrained section sketch with driving dimensions, a datum and a position frame whose MMC/MMB bonus is a live formula, a vertical chain closed by auto-chain and Monte Carlo sheets judged against process targets. The Examples folder also bundles two published worked examples — see Validation — and drawing-showcase, a tour of the drawing module.

3. The stack-up process — a worked example

This chapter teaches the method, not just the buttons: what a dimension chain actually is, how the numbers are treated, and then the complete build of a small real example — a stepped shaft — in exactly the order you would work. Every later chapter describes one screen in depth; this one walks the whole road once, with the reasoning attached.

Why tolerances stack — and what the chain is

No dimension is exact; every one lives somewhere inside its tolerance. When parts assemble, those variations accumulate: the gap or wall you care about is the sum of many toleranced dimensions. A stack-up analysis answers one question — across every combination the drawings allow, does the assembly dimension stay inside its limits?

The tool for answering it is the dimension chain. Walk from one face of the gap, through the parts, to the other face: each dimension you cross is one link — a contributor. The requirement (the gap itself) is the closing link, so the chain is a closed loop. Each link gets a sign from the direction you cross it:

  • Horizontal (X) stacksright is +, left is −.
  • Vertical (Y) stacksup is +, down is −.

The rule is absolute on both axes. The requirement takes no part in it — drawn with heads on both ends, it has no direction of its own; it is the closing link, not a contributor.

The signed sum of the contributors equals the requirement. That identity is the whole method — everything else (worst case, RSS, Monte Carlo, thermal) is a different way of pushing tolerances through the same loop. In the app you draw this loop literally: an open chain proves nothing, and the status bar tells you so until it closes.

How the numbers are treated

  • Asymmetric tolerances are mean-shifted. 10 +0.2/−0 does not enter the math as written: the analysis re-centres it to 10.1 ± 0.1 — the same physical band as an equal-bilateral tolerance. Worst-case results are identical, and the statistical methods get an honest centre to distribute around. The grid's CONTRIB column shows these calculation values next to the drawing values, and the INFO column flags the shift.
  • A chain has a nominal and a mean, and they answer different questions. Worst case is stated about the drawing's NOMINAL — so a sheet reads 10 +0.2/−0 the way the drawing reads its own limits; RSS and Monte Carlo are stated about the MEAN (10.1), because that is what the sampler draws around. The result strip prints both. The white paper derives the distinction and shows where the two centres differ.
  • GD&T is a zone, not a ± pair. A Ø0.1 position zone lets the feature wander ±0.05 about true position — so a new geometric row defaults to the /2 divisor and contributes ±0.05. Taking the whole zone is the conservative opt-out, flagged in INFO. The same /2 logic serves radial stacks of diameters: a Ø20 dimension enters a wall calculation as the 10 radius.
  • Ⓜ modifiers add bonus tolerance. As a feature (or datum) departs from MMC, its position zone grows by exactly the size tolerance consumed. Model the bonus as an extra zone row — and drive it with a formula such as =-U@TST1-002+L@TST1-002 (the full size-tolerance span of the referenced feature), so the bonus updates itself whenever that tolerance changes.
  • Temperature is a separate complete analysis. At each project temperature (T MIN / T ROOM / T MAX) every contribution is scaled by its part's thermal strain (1 + α·ΔT) and the whole stack is re-judged — three verdicts, not one. An aluminium housing around steel internals can pass warm and fail cold on the material mismatch alone. See Thermal analysis.
  • Worst case, RSS, Monte Carlo. Worst case puts every tolerance at its worst end simultaneously — guaranteed but often brutally conservative; use it when failure is not an option or quantities are small. RSS adds tolerances as √(Σ half²) — realistic for independent, centred processes in volume production. Monte Carlo simulates thousands of assemblies with a distribution per dimension and reports yield and Cp/Cpk. Details in Analysis methods.

The example: a stepped shaft

A Ø10 step is machined on a Ø20 shaft. The requirement — call it Min flat — demands the radial wall between the two diameters to stay at least 2. That is a MIN-only limit: leave MAX empty, and there is simply no upper bound to violate. The loop is short but carries almost every idea above: two diameters at half value, a position zone, and two Ⓜ bonus rows.

Start in the tables, top tabs left to right:

  1. Parts — one part is enough here (TST1, aluminium). The SHORT NAME fills itself in and becomes the stem of every feature ID.
  2. Features — five rows, all on TST1:
    • Main Dia — linear, 10 ± 0.01;
    • Secondary Dia — linear, 20 ± 0.05;
    • Secondary Dia Position — position, zone Ø0.01;
    • MMC bonus — type Ⓜ (MMC), zone by formula =-U@TST1-002+L@TST1-002 → 0.1 (the Ø20's full size tolerance, the most bonus the position can ever earn);
    • MMB bonus — type Ⓜ datum (MMB), zone =-U@TST1-001+L@TST1-001 → 0.02 (the datum feature's span).
  3. RequirementsMin flat, MIN = 2, MAX empty.

Draw the reference geometry

A chain reads best over the geometry it describes, so give the sheet a drawing first. Open Calculations, pick the requirement's tab, and switch the top bar to Drawing mode (see The drawing module for every tool):

  1. Sketch the section — seven lines: four close the Ø20 body's rectangle, three add the Ø10 step against the body's right face. Two Axis lines put a centreline through each portion. Rough is fine — the dimensions will true it up.
  2. Constrain it — squared (perpendicular) corners and coincident joints close the outline; the step's corners sit coincident on the shoulder line; each profile is symmetric about its centreline and the two axes are collinear, because both diameters share one shaft axis. Constraints are what keep the sketch meaning what you meant once things move.
  3. Dimension it — and type the truth in. Dimensions here are driving: place one across the step's face, double-click, type 10 — the solver resizes the geometry to match. Repeat with 20 across the body and the two lengths. Four typed values snap the sketch to true proportions (this example lands at 1 px per unit).
  4. Annotate — hook datum A onto a dimension's witness line and place the position frame ⌖ Ø0.1 Ⓜ | A Ⓜ beside the step. The frame documents exactly what the two bonus rows in the Features table model.

Draw the chain

Switch the top bar to Stack-up. Now the loop:

  1. Requirement first. Arm the Requirement tool and press-drag vertically across the wall — from the Ø10 step's edge to the Ø20 body's edge — and release. The drawn axis sets the stack direction: drawing vertically switches the sheet to a Y stack (up = +). A sheet carries exactly one requirement vector.
  2. The chain draws itself forward. The moment you release, chain drawing begins: each click places the next contributor tip-to-tail. Click below-right — the vector runs down across the Ø10 radius (a − link). Click across — up the Ø20 radius. Whenever a click steps sideways to another column, a thin guide line bridges the columns automatically, keeping the loop geometrically closed. At the requirement's far end the cursor snaps green: that click closes the loop. Esc or right-click leaves chain drawing at any point.
  3. Insert the geometric tolerances. Arm Geo tol and click the joint where the two radius vectors meet: a zero-length point entry joins the chain right there. Insert three — position, MMC bonus, MMB bonus. Points add tolerance, never length; the chain renumbers itself around them.
Grid-first alternative: the Add contributor button under the grid builds the same chain from the table side — each click adds a row and auto-draws its vector on a lane beside the requirement, scaled to its value when Keep Scale is on. Both roads mix freely on one sheet; see Grid-first chains & Keep Scale.

Assign features and read the result

Every drawn element became a grid row. In the FEATURE ID column pick what each one represents — the Ø10, the Ø20, the position and the two bonus zones. Values and tolerances flow in from the Features table; the +/− sign follows the drawing. Turn ÷2 on for every row: this is a radial stack, so diameters enter as radii and each zone contributes ±zone/2.

The Σ row and the results strip now read:

  • nominal wall = 20/2 − 10/2 = 5.000;
  • worst-case half-width = 0.025 + 0.005 + 0.005 + 0.05 + 0.01 = 0.095 — note how the Ⓜ bonus (±0.05) outweighs the position zone itself (±0.005);
  • worst case 4.905 … 5.095 against MIN 2 → PASS at every temperature slot, with margin to spare.

Watch the INFO column: it names every convention applied to your numbers — halved zones, mean-shifted asymmetric tolerances, whole-zone opt-outs — so a checker can audit the sheet without guessing.

Beyond worst case

RSS and MONTE CARLO are per-requirement toggles in the sheet's top bar. With Monte Carlo on, the panel under the grid shows the sampled distribution against the limits, yield and Cp/Cpk — with a fixed seed, so results reproduce exactly. Set the project's temperature sweep (this example runs −50 / 20 / 250 °C) and the results strip re-judges the wall at each slot: the CONTRIB (T MIN) and (T MAX) grid columns show each row scaled by 1 + α·ΔT on its way into those verdicts.

Build it yourself: the whole example above is ten minutes of work — and the fastest way to make the method stick. Then read Calculations and The drawing module for everything each screen can do, and Validation for the published worked examples bundled in the Examples folder.

4. The workspace

The dark title bar hosts the section tabs — Project, Parts, Features, Requirements, Calculations, Results, Materials, Settings, Help — plus the window controls. Below it, a contextual ribbon offers the actions for the active tab (New / Duplicate / Delete, CSV import/export, exports). Undo and Redo always sit first on the ribbon.

The status bar at the bottom shows one info line: contextual guidance for the active view, replaced by the result of your last action. The right side shows the project name and active section.

5. Projects & files

A project is a single .stack file (JSON) holding materials, parts, features, requirements, drawn chains and image references. Double-clicking a .stack file in Explorer opens it in the application. Saves are atomic — a failed write can never truncate your file.

New, Open…, Save (Ctrl+S) and Save As… (Ctrl+Shift+S) live in the File panel of the Project tab. Save As… writes the project under a new name or location and continues working in the new file — the previous file is left as it was, and its autosave sibling is cleaned up so it can't resurface later as "newer" work.

The Project tab also selects the tolerancing standard the drawings follow — ISO GPS (ISO 1101/8015/14405), ASME Y14.5-2018 or ASME Y14.5-2009. The choice gates which GD&T symbols and frame modifiers the pickers offer (Y14.5-2018 withdrew concentricity and symmetry) and picks the unequal-zone notation (ASME Ⓤ vs ISO UZ). Existing features and annotations are never rewritten — only availability for new ones is filtered.

Autosave & recovery

  • Autosave (interval set in Settings) writes a sibling file <name>.autosave.stack — it never overwrites your project in place, so experiments stay discardable.
  • Unsaved projects park a recovery copy in %APPDATA%\F3Stack.
  • If the application crashes, an emergency copy is written to %APPDATA%\F3Stack\recovery. On the next start you are offered to restore it; opening a project whose autosave is newer offers the autosave.
  • A real save deletes the recovery copies it supersedes.

Version control

Enable version control on the Project tab to record a revision entry (author, timestamp, change list) with every save. The change list is computed automatically by diffing against the previous save.

6. Materials

Each material carries a thermal expansion coefficient (per °C or per °F, following the project units). For nonlinear behaviour open the CTE curve editor and enter instantaneous α(T) sample points — thermal strain is then integrated over the temperature range.

  • Add from library — a bundled reference library of common engineering materials.
  • Import CSV — columns: MaterialName, ThermalCoefficient.
Typing coefficients. The coefficient cells (here and in the CTE curve editor) accept scientific and plain notation alike — 23e-6, 2.3E-05, 0.000023 — with either decimal separator (comma or dot). The value commits when the edit ends (Enter, Tab or clicking away); Esc cancels; an entry that isn't a number quietly reverts to the stored value. Nothing reformats the text while you type.

7. Parts

Parts tie features to materials. The expandable row editor (corner triangle) holds the part's UOS general tolerances — the title-block "unless otherwise specified" ± value that Linear Dim (UOS) features inherit automatically.

A part is identified by its number; the name is optional and starts empty. The short name — the prefix every feature ID carries — is derived automatically: from the part name (its words joined with underscores, e.g. Front CoverFront_Cover) or, while the name is empty, from the part number. Type your own short name to override it: your value then stays put no matter how the name or number changes. Clear the cell to hand it back to the automatic rule.

  • Import CSV — columns: PartNumber, PartName, ShortName, MaterialName.
  • Export CSV — writes all parts including the UOS tolerance.

8. Features

A feature is a single toleranced dimension or geometric tolerance on a part. Feature IDs are generated automatically from the numbering scheme configured on the Project tab (per-part or global).

The PART column shows the part's short name together with its part number (one token only when the two are the same, as they are for an unnamed part). Opening the picker lists number — name for every part, and typing while the list is open jumps to the first part matching what you typed — by number, name or short name alike. The same picker is used for a requirement's source part and for the part column of a stack-up row.

Feature types

TypeInputsNotes
Linear Dimnominal size, +/− toleranceThe standard dimension.
Linear Dim (UOS)nominal size± pulled from the part's UOS general tolerance; shown read-only.
Basic Dimnominal sizeTheoretically exact — zero variation in every analysis.
Ⓤ zone shift (basic)shift valueThe offset of an unequally disposed (Ⓤ/UZ) tolerance zone's midpoint, modelled as its own chain vector. Behaves like a basic dimension: the value only, no tolerance width. The direction of the shift is yours to choose by how you draw the vector (right/up = +) — the callout alone cannot tell which side the zone favours. See Unequally disposed zones.
Boundarynominal size, +/− toleranceVirtual-condition size; behaves like a linear dimension.
GD&T (Straightness … Total Runout)tolerance zone sizeEnters the stack halved: the frame states a whole zone, a contributor is a ± half-width, so a Ø0.1 position zone contributes ±0.05. Clear the /2 toggle on the row to take the whole zone instead — the INFO column then flags that conservative reading. Take the whole zone in the special cases where the chain does not run from the zone's middle to its edge but crosses the entire zone — e.g. two chain members bolted to a surface carrying a flatness tolerance: one part can sit at the bottom of the zone and the other at its top, so the full zone width drives the extreme result.
MMC / LMC / MMB / LMBtolerance zone sizeMaterial-condition modifiers (bonus tolerance), shown with the circled Ⓜ/Ⓛ symbol.

Features carry no zone-disposition columns: the modifiers that qualify a zone (Ⓤ unequally disposed, Ⓟ projected) belong on the drawing's feature control frame, not on the feature's numbers. The projected zone Ⓟ does not change a 1D stack at all — the zone value contributes unchanged — and the unequal zone Ⓤ needs a direction you choose in the chain, as below.

Unequally disposed zones (Ⓤ / UZ)

A profile zone disposed unequally (ASME Ⓤ, ISO UZ) shifts the zone's midpoint off the nominal surface — but the callout alone does not say in which chain direction that shift acts; it depends on which way the surface faces in your stack. The tool therefore models the two effects separately:

  • The profile feature carries the zone width as usual — a plain symmetric zone, halved by the /2 default (zone 1.0 → ±0.5).
  • The midpoint shift is an explicit extra vector in the chain, carrying a Ⓤ zone shift (basic) feature with the shift value (for zone 1.0 disposed Ⓤ0.8, the shift is 0.8 − 1.0/2 = 0.3). Draw the vector in the direction the zone actually favours — the sign follows the drawing (right/up = +), exactly like every other link.

Example: zone 1.0 Ⓤ0.8 → draw the profile's GD&T point (contributes ±0.5) plus a 0.3 shift vector; the result band is the surface's true −0.2 … +0.8 disposition, on whichever side you drew it. The Ⓤ value in a feature control frame on the drawing is unaffected — it is notation; only the chain models the shift's direction.

Formulas

Any numeric feature cell accepts an Excel-style formula starting with =. Reference other features by column and ID:

=N@FT012/2 + 0.1

N nominal size · U tol + · L tol − · G geo zone. Operators + − * / ^ plus the functions sqrt() and abs(). References resolve recursively with cycle detection; results recompute on every edit.

A worked example: the bonus tolerance an Ⓜ (MMC) modifier earns is the full size-tolerance range of the feature of size it points at, i.e. =abs(U@ID-L@ID) — which is exactly what Assign to vector writes for you.

The boundary method — the other school

There are two ways to stack a located feature of size, and engineers are split between them. So far this guide has used the first one.

  • Size + tolerance + bonus. The feature contributes several rows: its size, the geometric tolerance that locates it, and one row per Ⓜ/Ⓛ bonus. This is what Assign to vector builds, and it keeps every number traceable to the callout it came from.
  • Boundaries. The same feature contributes one row: the two envelopes it can never cross. Shorter chains, fewer rows to explain, and the bonus arithmetic is already inside the number.

Use the feature type Boundary for the second one. It behaves like an ordinary dimension in the chain — a nominal and a ± tolerance — because that is what it is:

nominal = (inner + outer) / 2   ·   tolerance = ± (outer − inner) / 2

Click the button on the NOMINAL cell of a Boundary row in the Features table — or, without leaving the chain you are building, on the FEATURE TYPE cell of that row in the Calculations grid. The same button sits there for a Ⓜ/Ⓛ bonus row, and on those two row types only; both open the same dialog and write the same thing. What goes into a boundary is decided by the modifiers on your drawing, so the dialog asks four questions in the order the drawing states them:

  1. Which feature of size? Everything else hangs off it. Tick Internal feature for a hole or a slot; leave it clear for a shaft or a pin.
  2. Is there a position / location tolerance on it? Pick it. If your drawing states none, leave it unlinked — then there is no zone, and nothing further to answer about it.
  3. Does that tolerance carry Ⓜ or Ⓛ? Choose RFS, Ⓜ MMC or Ⓛ LMC. There is no box for the bonus, and that is on purpose: with Ⓜ or Ⓛ the bonus is the size range of the feature of size, so the app takes it from there automatically and tells you how much it came to.
  4. Does the datum reference carry Ⓜ or Ⓛ? Only then is there a datum shift. Choose Ⓜ MMB or Ⓛ LMB and the dialog lets you point at the datum feature of size and at the tolerance locating that datum against higher-order datums. With RMB nothing is picked here, because a datum referenced regardless of feature size adds nothing to the envelope.

If the tolerance you pick is mapped to a feature control frame on a drawing, the app reads both modifiers off that frame and pre-selects them, telling you which frame they came from. You can always overrule it.

Prefer to work the boundaries out yourself? Choose State the two boundaries by hand and type inner and outer. Either way the dialog shows you the other representation live, so you always see both inner · outer and nominal ± tolerance.

The modifier is what decides where the envelope sits and how wide it is. Take ⌀10 ±0.1 located by position ⌀0.2 and read it four ways:

  • Shaft, Ⓜ — outer 10.1 + 0.2 = 10.3, inner 9.9 − 0.2 − 0.2 = 9.59.9 ±0.4.
  • Hole, Ⓜ — inner 9.9 − 0.2 = 9.7, outer 10.1 + 0.2 + 0.2 = 10.510.1 ±0.4. The same width as the shaft, a different place.
  • RFS (either one) — no bonus at all: inner 9.9 − 0.2 = 9.7, outer 10.1 + 0.2 = 10.310.0 ±0.3. Narrower, and centred on the drawing's nominal.
  • — the mirror image of Ⓜ: a shaft gives 10.1 ±0.4, a hole 9.9 ±0.4.
Boundaries composed before this version assumed Ⓜ. Up to 1.1.0 the composer applied the Ⓜ arithmetic whatever the drawing said, so an RFS tolerance came out ±0.4 instead of ±0.3 and centred in the wrong place. Existing boundaries are untouched — they re-open on the Ⓜ branch and keep exactly their numbers — but if one of yours is really stated RFS, open it and switch it, and the numbers will change.
Do not mix the two schools on one link. A boundary already contains the size, the geometric tolerance and every bonus. Stacking any of those again on the same chain counts them twice, and the app says so — in the alert strip as soon as you compose the boundary, and in every analysis afterwards. Pick one school per feature.
Monte Carlo and boundaries. A boundary band is a pair of worst-case envelopes, not a picture of how parts come out of the machine — so the statistical methods do not sample it. A boundary you composed from a feature of size and a tolerance zone is taken back apart for Monte Carlo, RSS-adjacent statistics and σ: the size, the zone and the material bonus are simulated separately, exactly as if you had stacked them the classic way. Worst case still uses the envelope itself, which is what an envelope is for. That is why the same drawing now gives the same distribution whichever school you stack it in.
Two consequences worth knowing. The row's DISTRIBUTION now applies to the size and the zone inside the boundary, not to the envelope — leaving it on Normal is right, and the old advice to switch a boundary row to Uniform no longer applies (it would make the hole's own size uniform, which is not what you meant). And a boundary whose two envelopes you typed in by hand cannot be taken apart — there is nothing to read — so it is still stacked as the envelope, with the mean at the envelope midpoint and the worst-case span read as ±3σ. The analysis says so in its warnings; on that row the statistics are conservative, and Uniform is still the more honest choice there.

9. Requirements

A requirement is the assembly dimension being verified: an ID, a source part, a name and MIN/MAX limits. Each requirement owns one calculation sheet.

  • FINAL RESULT BY — which method (Worst case / RSS / Monte Carlo) the PASS/FAIL verdict is judged against. Selecting a statistical method force-enables that analysis.
    Worst case and RSS ask whether their result band fits inside the limits. Monte Carlo asks the question you configured in the Monte Carlo panel: does the simulated yield reach your target, and — when you set one — does Cpk reach its target? That is the same test the panel's PASS/FAIL badge runs, so the badge, the results strip, the Results tab and the exported reports always agree. With no acceptance target set, Monte Carlo falls back to the band test.
  • RSS and Monte Carlo toggles — opt each analysis in or out per requirement; they control the extra rows in the results panel and the Monte Carlo panel.

10. Calculations

Each requirement is a tab card at the top (scrollable; + adds a sheet). The top bar carries the tools, the requirement identity, MIN/MAX (an edit re-judges every result and asks for confirmation), the verdict method and the RSS / Monte Carlo toggles.

One-sided requirements are fine. Leave MIN or MAX empty and the requirement is judged on the side you stated — "minimum clearance ≥ 1" needs no upper limit, and the missing side never constrains the verdict. Only a sheet with neither limit has nothing to judge; its status stays .

Drawing the chain

  1. Image mode: load (or paste with Ctrl+V) your 2D drawing; pan, zoom, rotate. Multiple image layers are supported — or draw the views yourself with the drawing module.
  2. Vectors mode: draw the requirement vector first — the dimension being verified (double arrows). Lock X/Y snaps it horizontal/vertical; unlocked follows your exact angle and rotates the whole stack frame.
  3. Draw contributor vectors tip-to-tail (click-and-drag; the chain continues from the last endpoint). Right-click ends or breaks the chain — a break link bridges to the next segment.
  4. Assign a feature to every vector in the grid. The first assignment with a known size calibrates the drawing scale (px/unit); later vectors can be filtered by matching length.
  5. Geo tol points attach zero-length tolerance entries to a vector endpoint, joint or guide line (square marker + leader label). Stack several characteristics into one frame via the right-click menu.
  6. Guide lines bridge offsets perpendicular to the stack axis. Dragging an endpoint re-aims it (Shift squares it to 90°); dragging the body slides the joint — attached vectors resize.
Sense. The convention is absolute: horizontally right is +, left is −; vertically up is +, down is −. The requirement — a two-headed, direction-less arrow — plays no part in the signs. The sign follows the drawn arrow: reverse a vector on the canvas (or flip the +/− cell in the grid) and the other side updates automatically — the arrow and the SENSE column can never disagree. When the requirement gets too short for its double arrows, they flip to the outside automatically.
Geo tol placement. A geo-tol point dragged along a guide keeps its stacked frames together; dragged off its guide it receives its own extension line so the chain stays connected (hidden for the n-th frame of a stacked pile).
The requirement carries no feature. The requirement vector is the result of the chain, so a feature cannot be assigned to it — its dialog offers sense and geometry only, and the grid lists contributors only. Its MIN/MAX limits live in the top bar.

Selecting several vectors — and copying them to another sheet

Selection on the stack-up canvas works the same way as in the drawing module: every click adds. Click a vector and it joins the selection; click it again and it drops out. Nothing is replaced behind your back, so building a set of five links is five clicks.

  • Click a vector, a guide line or an image — toggles it in the selection.
  • Ctrl+click does the same explicitly, and keeps working while a group is already up.
  • Shift+click a vector pulls in its whole partial stack-up (every link of that piece of the chain, plus the guides they hang on). On a guide line it pulls in every partial the guide touches.
  • Alt+drag rubber-bands a rectangle: every vector with an endpoint inside, every guide crossing it and every image it overlaps join the selection.
  • Click empty canvas to clear. Dragging any selected object moves the whole group; dragging one that is not selected behaves as usual.

Right-clicking inside a selection of two or more opens the group menu: colour, thickness, line style, Copy to… and Delete — each applied to the whole set as a single undo step.

Copy to… — the same links on a second sheet

Chains repeat. The same three links that set a bearing seat on R-001 often belong on R-002 as well. Select them, right-click, choose Copy to ▸ and pick the destination sheet. What travels:

  • The geometry, the sign, the ÷2 divisor, the distribution, the shrink-fit state and the vector's colour / thickness / line style — verbatim. The destination sheet's own stack axis is not touched.
  • The assigned feature — the same one. Features belong to parts, parts belong to the project, so two sheets measuring the same hole legitimately read the same callout. Edit that feature once and both sheets follow, which is exactly what you want; if a sheet needs its own number, override the value on the row (the grid's NOMINAL / TOL cells) or point the copy at a different feature.
  • The connections between the copied vectors — an extension line that two copied vectors are anchored on comes along, and so does a break link whose two ends are both in the selection. A line or link reaching a vector you did not select is left behind, so a copy is never tied to geometry it does not own.

What does not travel: the requirement vector. Every sheet owns exactly one and it is the result the chain builds up to, not a contributor — selecting it is fine (dragging it pans the whole stack), but a copy skips it and the status bar says so.

Where it lands. The fragment keeps its exact position when that spot is free on the destination. If it would overlap the chain already there, the whole block is moved straight down clear of it — rigidly, so the relative geometry of the copied links is untouched. It is never snapped onto the existing chain: joining two chains is a decision you make by drawing, not something a paste should invent. The copy lands as its own partial stack-up, ready to be dragged into place and connected.
You stay where you are. Copying does not switch the tab — the same fragment often goes to three sheets, and a canvas that jumps away under the menu loses your place. The confirmation names the destination (“Copied 3 vector(s) to R-002.”) so you can go there when you mean to. The whole copy — vectors, lines, links — is one Ctrl+Z.
Copy to… is greyed out? Either the project has no second calculation sheet yet (add one on the Requirements tab), or the selection holds nothing but the requirement vector. The tooltip on the disabled item says which.

Assign to vector — the drawing fills the grid in

Every number a chain needs is already written on the drawing. In Stack-up mode the drawing underneath stays pickable for exactly that reason: click a dimension or a feature control frame to select it, right-click it and choose Assign to vector…. You only pick the part and the vector number — everything else is read off the annotation.

Chain objects always win the same pixel (a vector, an extension line or an image is hit first), and the pick is skipped entirely while a stack-up tool is armed, so drawing vectors is never disturbed.

AnnotationFeature created
Linear / ⌀ / R dimension Linear dim — nominal = the value as drawn, ± = the dimension's own deviations, one to one.
BASIC dimension [25] Basic dim — the value only. A theoretically exact dimension carries no tolerance; the zone that controls it lives in the frame.
REFERENCE dimension (25) Refused. A reference dimension repeats a value the chain already carries — stacking it would count it twice. Convert it to a driving dimension first if it really is independent.
Angle dimension Refused — a chain adds lengths along one axis.
Feature control frame The characteristic (⌖ position, ⏥ flatness, ⌓ profile …) becomes the feature type, the frame's value becomes the zone, and the datum references are kept in the feature's name.

A frame is not one object. Its tolerance value, the Ⓜ/Ⓛ modifier on that value and the Ⓜ/Ⓛ modifier on each datum are separate contributors, so the dialog gives each its own row: a tick (take it over or not), a value, and its own target vector — they may land on different links of the chain, because a datum boundary bonus often acts on a different member than the toleranced zone.

RowTicked by defaultWhere the value comes from
Zone valueyes The frame's tolerance value. Halved by default, like every geo zone.
MMC / LMC bonusno Pre-filled with the formula =abs(U@ID-L@ID) — the full size-tolerance range of the feature of size the Ⓜ/Ⓛ points at. Retolerance that dimension and the bonus follows by itself. Type a plain number over it to state the bonus by hand (the formula is dropped and the value stays put).
MMB / LMB bonus
(one per datum with Ⓜ/Ⓛ)
no Typed by hand — a datum boundary usually cannot be read off the drawing. If that datum's Ⓜ/Ⓛ is linked to a feature of size, the same formula is pre-filled as a starting point.

Bonuses start unticked on purpose: in most chains a material modifier plays no part, and two contributors nobody asked for are worse than one extra click. A row that lands on a vector which already carries a feature becomes its own zero-length point stacked on the same spot — exactly the pile you would build by hand; a row aimed at a free geo-tol point simply fills it.

Where the Ⓜ link lives. The MMC formula needs to know which feature of size the modifier refers to — that is the Ⓜ/Ⓛ FEATURES link on the frame's ribbon panel. Without it the value box arrives empty (a frame stacked under a dimension falls back to that dimension's feature). Leaving a value blank still creates the row, and the status bar says the zone is empty — so the gap is visible in the grid instead of quietly missing from the result.
One undo. Creating the features, wiring them onto the chain and renumbering is a single step — Ctrl+Z takes the whole assignment back. The annotation is left live-linked to the feature it produced, so the frame's value and the feature's zone stay one number.

Grid-first chains & Keep Scale

You do not have to draw every vector by hand. With a requirement vector on the canvas, Add contributor (ribbon) appends a grid row and lays out its vector automatically — pick the feature, set the sign, type the values, and the canvas follows. Auto-generated contributors re-lay themselves whenever anything that changes their magnitude changes (value, tolerance, sense, /2).

  • Keep Scale ON — auto vectors are drawn to scale: length ∝ the contribution magnitude (clamped so tiny values stay clickable). Editing a value visibly re-scales the chain. Hand-drawn vectors carrying a feature re-scale on value edits too, so the picture stays honest.
  • Keep Scale OFF — every auto vector uses the same default length (a schematic chain).
  • The requirement vector is never rescaled — it stays exactly as drawn.
  • While Keep Scale is ON, a data-driven vector's length is not hand-resizable (its length is the value); whole-vector moves, the requirement and feature-less vectors stay freely draggable.
Interference fits. When the chain sums to a negative resultant (an interference, not a clearance), Keep Scale is disabled automatically for that sheet: the requirement's drawn direction is the sign reference (clearance = +, interference = −) and must never flip, so the vectors go schematic while the numbers stay negative. Keep Scale re-enables itself when the stack returns to a clearance.

The stack-up grid

ColumnMeaning
No.Chain order (REQ = the requirement vector).
PART / MATERIAL / FEATURE ID / NAME / TYPEThe assigned feature; TYPE is a one-click symbol picker. On a row that has no feature yet — a geometric tolerance you have just inserted into the chain, a fresh contributor — the TYPE cell shows a : pick a characteristic there and the feature is created for you. Only the kinds that row can carry are offered (a geometric-tolerance point takes a tolerance zone, a drawn vector takes a dimension), and the app asks which part it belongs to when the project has more than one. Changing PART on a row that already carries a feature asks what you mean.
F. SIZE, F. TOL±, GEO TOLThe feature's values (editable here or on the Features tab).
+/−Sense of the vector in the chain.
/2Halves the calculated contribution (diameter→radius, geo zone→half zone). On by default for a geometric tolerance; your choice on a row is never overwritten afterwards.
DIST.Distribution for statistical methods: Normal, Uniform, Triangular (histogram glyphs). Visible when Monte Carlo is enabled.
CONTRIB. / TOLERANCE +/−The calculation columns: signed mean contribution and ± half-width. Asymmetric tolerances shift the mean (equal-bilateral conversion) — the INFO column notes the shift.
INFOConvention notes, spelled out per row: Geo zone 0.1 enters as ±0.05 (half the zone) · Whole geo zone taken — usually only min or max is real · Ⓤ zone-shift vector (basic) — direction from the drawn vector, no tolerance · Asymmetric ± — mean shifted, enters as …. Every note describes something that moves a number; empty for a plain symmetric dimension.
FITShrink-fit sheets only — the row's assembly state: Room / Heated / Cooled (see Shrink fit).
CONTRIB./TOL (T MIN / T MAX)The complete calculation at that temperature — reveal with the ◂ toggle at the grid's right edge. Both the contribution and the ± half-width are scaled by the entry's own thermal strain, so each temperature slot is a self-consistent stack: Σ CONTRIB ± Σ TOL at a slot equals that slot's MIN/MAX in the results panel — the hand sum and the strip can never disagree. One exception: when the chain earns a Ⓜ/Ⓛ bonus from a feature that is itself in it, the bonus is zero at the end of the band where that feature sits at maximum material, so the band is not symmetric. The Σ cell then prints both ends (+x / −y) and says so in its tooltip; the TOL column still shows what each row declares, which is why it adds up to neither end. See A bonus is zero at maximum material.

The Σ totals row under the grid sums the calculation columns (the per-temperature Σ cells appear together with the thermal columns). The requirement vector is not a contributor — it never appears in the grid and never enters any sum.

Changing the PART of a row

On an empty row the PART cell simply scopes the FEATURE ID picker next to it. On a row that already carries a feature the same edit can mean two different things, so the app asks:

  • Move the feature to that part. The same feature changes part and keeps everything you typed into it — values, deviations, zone, formulas, name and links. Every other chain using that feature follows it (they carry the feature itself, not a copy).
  • Point this row at another feature on that part. The row is unlinked and the picker re-scoped; the feature stays where it was, untouched.

The dialog states what the move actually changes before you commit to it: the feature's id (it is derived from the part — formulas, mapped dimensions and feature control frames all follow the rename), the material behind the T MIN / T MAX columns, and — for a UOS linear dimension — the ± it inherits from the part's general tolerance, which is the one case where a move really does change a number. The whole thing is a single Ctrl+Z. A feature you have not typed anything into yet, and that nothing else uses, is simply moved without a question.

A bonus is zero at maximum material

A Ⓜ/Ⓛ bonus is not an extra tolerance you get for free — it is how far the finished feature departs from its material condition. At maximum material the departure is nothing, so the bonus is nothing. When the feature of size is itself a row of the same chain, the application knows this and worst case follows it: the two ends of the band are worked out separately, and each bonus counts only at the end where its feature is away from maximum material.

The band is therefore asymmetric, and the Σ row prints both ends (+0.04500 / −0.08500). Example — a ⌀10.5 ±0.2 hole located by position ⌀0.3 Ⓜ against a ⌀10 bolt, one pass, ÷2 throughout:

Rowcontributes
hole size ±0.2, halved5.25 ±0.100
position zone ⌀0.3, halved0 ±0.150
Ⓜ bonus (the whole size range 0.4), halved0 ±0.200
band5.000 … 5.700 (not 4.800 … 5.700)

Which end each bonus lands on is worked out for you, per row: maximum material is the largest size for a shaft and the smallest for a hole, and a minus-sense row turns that round again. Two bonuses on one sheet can land on opposite ends. A bonus whose feature of size is not on the chain is left alone — the sheet does not say where that variation comes from, so it keeps its full symmetric zone.

Opening a project saved before this changed shows a one-time notice listing the affected sheets. The band is narrower than it used to be, so re-read the verdicts before releasing anything from that file; saving the project clears the notice.

Separate MIN / MAX chains

No longer needed for material bonuses. Splitting a sheet into a MIN chain and a MAX chain used to be the only way to keep a Ⓜ/Ⓛ bonus out of the extremity that never earns it. Worst case now does that by itself (see above), so the split is a convenience for chains that genuinely differ between the two conditions — not a workaround.

Some chains differ between the min- and max-material condition — a different contact path, a different set of contributors. The Separate min/max ribbon toggle splits the sheet into a pair:

  • The sheet becomes the MIN chain and a deep copy right after it becomes the MAX chain; their IDs get a role suffix (R-012 MIN / R-012 MAX) and the tab strip shows the shared base ID with a min/max badge. Edit each chain for its own condition.
  • The Results tab re-aggregates the pair into one entry: MIN from the MIN sheet, MAX from the MAX sheet, and the nominal per the NOMINAL SOURCE combo that appears while split (Average / From MIN / From MAX).
  • Un-toggling asks which chain to keep (Yes = MIN, No = MAX, Cancel = stay split); the survivor gets the base ID back.

Shrink fit (thermal assembly)

The Shrink fit ribbon toggle turns the sheet into a thermal-assembly analysis: parts are heated or cooled for the assembly operation, mated, and relax back to room temperature. Enabling it reveals three sheet parameters — T HEAT, T COLD (seeded 150 °C / −40 °C on first use) and MIN CLEARANCE — plus the grid's FIT column, where each contributor is assigned its assembly state: Room, Heated or Cooled.

The sheet is judged in two states:

  • AT ASSEMBLY — every contributor at its own fit temperature (heated parts expanded, cooled parts shrunk, room parts untouched). This section replaces the T MIN / T MAX sweep in the results panel; the band's lower bound must stay at or above MIN CLEARANCE, or the parts cannot mate.
  • T ROOM — the final fit after relaxation, judged against the requirement's MIN/MAX as usual (a negative result is the retained interference).
Example. A steel Ø50 shaft cooled to −40 °C into an aluminium Ø49.95 bore heated to +150 °C: −0.05 interference at room becomes +0.135 clearance at assembly — the parts mate, and the fit returns on warm-up.

Results panel

The bottom panel shows, per temperature (T MIN / T ROOM / T MAX), the MIN / NOMINAL / MAX band for each enabled method, with the verdict method highlighted. The per-temperature status flags are judged against the selected method; the overall flag can be manually overridden (right-click → Force PASS / FAIL, reason required — shown yellow).

Monte Carlo panel

Expand MONTE CARLO ANALYSIS under the grid for the live histogram. Sample-count presets run 1 000 … 1 000 000; the seed is fixed by default so a re-run (and a re-export) reproduces identical numbers — a fresh-seed re-run is one click away. Set the acceptance targets as a yield (the % ⇄ σ toggle re-expresses the same target either way — 99.73 % is 3σ) and a target Cpk.

The histogram overlays grey ±3σ…±6σ reference lines, red worst-case (WC−/WC+) lines and orange MIN/MAX limit lines — seeing a 5σ or 6σ line fall outside the worst-case pair is the untruncated-normal convention made visible. Below it, a per-temperature capability table (mean, σ, yield, Cp, Cpk, observed min/max) judges each slot; click a row to aim the histogram at that temperature. Drag the grip to grow the chart. Simulation runs in the background — the UI stays responsive.

Reading the Cpk threshold

Set a target Cpk and the chart gains a dash-dot line labelled with the achieved value against the target (Cpk 1.13 < 1.33 in red, Cpk 1.62 ≥ 1.33 in green). Cpk is a dimensionless index, so the line does not show the number on the value axis — it shows what the index means:

Cpk = distance from the mean to the nearest limit ÷ 3σ

so Cpk ≥ target is the same statement as the limit lies at least 3 · target · σ away from the mean — and that distance is exactly where the line sits. Read it geometrically:

  • The MIN/MAX limit line falls outside the dash-dot line → the target is met.
  • It falls inside → the target is missed, and the gap between the two lines is precisely how much capability is missing.

The line is drawn only on a side that actually has a limit (a one-sided requirement gets one line), only when a Cpk target is set, and only when there is spread to measure — with σ = 0 the capability is unbounded and no finite line exists. A target that reaches beyond the plotted ±4σ window degrades to an edge arrow, exactly like a far-off MIN/MAX limit. The same line is drawn on the histograms embedded in the Excel report, so the chart a customer receives reads exactly like the screen.

11. The drawing module

The Calculations canvas doubles as a full 2D drafting surface: when no drawing image is available (or on top of one) you can draw the part views yourself, dimension them, and annotate them with GD&T — then run the stack-up chain over your own sketch. The drawing tools live on the Image-mode ribbon in groups — Draw, Axes, Modify, Annotate, Constrain, Transform, Align, Style, Edit — and every group is also reachable from the marking menu under the cursor. Sketch geometry is deliberately inert to the vector chain: it never contributes to the calculation.

Try it: the bundled drawing-showcase project (Examples folder) exercises every tool described in this chapter — open it and take things apart.

Drawing shapes

ToolGesture
LineDrag (or click–click) between two points. Starting a drag on an existing node moves that node instead of drawing a new line.
PolylineClick each vertex; double-click, Enter or a right-click finishes. Closing back onto the first vertex makes a closed contour.
RectangleDrag corner to corner (axis-aligned) — or the centric 3-click flow: a stationary click sets the centre, the second click sets the half-width and its direction (the rectangle may stand at an angle), the third sets the height.
CircleDrag from centre to rim — centre axes are drawn automatically.
EllipseClick the centre, then a corner point; its ΔX/ΔY set the semi-axes.
SlotThree clicks: first cap centre, second cap centre, then a point whose distance from the axis sets the radius (previewed live). Built as tangent-tied lines and arcs with equal-radius caps, so it stays a slot under every edit.
SplineClick through-points; double-click or Enter finishes. A closed spline is a smooth closed contour.
ArcThree clicks: start, end, then a point on the arc.
PolygonClick the centre, then a vertex; the number of sides (3–12) comes from the ribbon combo. Stays a regular N-gon under every edit.
PointClick to place a point marker — a snap and dimension anchor.
AxisTwo clicks or a drag; drawn dash-dot with a small overshoot. Clicking two lines instead builds the centre line between them (midline of parallels, bisector of crossing lines — born with a Symmetric constraint); clicking a circle drops its centreline cross.

Tools stay armed until you press Esc or click the tool again, so repeated shapes go quickly. Hovering an existing shape grabs it instead of drawing over it. Nodes snap to each other, to shape nodes, to line midpoints (pickable derived nodes) and to the drawing origin; with the grid toggle on, every free click lands on a grid node (the displayed grid auto-coarsens as you zoom out).

Direct manipulation

Every shape follows one drag grammar — body pans, outline resizes, nodes reshape:

  • Line — drag the body to move it whole; drag an endpoint to reshape. The midpoint is a live node for snapping and dimensioning.
  • Circle — the centre pans the whole circle; grabbing the rim changes the radius (the rim tracks the cursor exactly).
  • Arc — the rim re-projects all three points onto a circle of the cursor's radius about the same centre: a pure radius change that keeps the angular span (an arc can never be flattened onto its chord). Grabbing the crown node itself translates the arc rigidly.
  • Slot — the caps are tied EqualRadius, so a cap's rim drag is "the slot's width" (both caps together); dragging a cap's crown stretches and swings the slot about the far cap, flanks following tangent.
  • Ellipse — the centre pans; the outline resizes the one semi-axis whose extreme you grabbed nearer, perpendicular to itself, the other axis holding.
  • Rectangle — corners resize both dimensions, edge midpoints move that edge only, the body pans.
  • Polygon — the centre pans rigidly; a vertex resizes/rotates — it stays a regular N-gon either way.
  • Axis — endpoints slide along the axis's own direction (extend/shorten, never bend), magnetising to projections of nearby nodes; rotating an axis is Ctrl+drag.

Ctrl+drag on a node rotates the whole shape about its centre (rectangles and ellipses refuse — they are axis-aligned; use Modify ▸ Transform). Shift+click on a node adds it to the pick set for constraint pairing instead of dragging. Constraint-connected geometry that is free to move carries along rigidly with a body drag.

A driving dimension or a parameter lock on the affected value simply refuses the drag — the dimension is the master (see Dimensions). If a release leaves the constraints unsolvable, the whole gesture reverts; collapsing a shape to (near) zero size reverts too, so a slipped drag can't destroy geometry.

Modifying geometry

  • Trim — click the part to remove; it trims back to the nearest boundaries: crossings with straight edges (lines, rectangle / polyline / polygon edges) and curves (arcs, circles, splines — a tangency counts), and nodes of other shapes lying on the edge. Trimming the middle of a line splits it in two; a full circle with two crossings becomes an arc. A segment with no boundary at all trims to nothing — the whole curve is deleted, NX-style, so Trim doubles as a click-eraser.
  • Extend — click near an end; it lengthens until it reaches the next crossing. Extending an arc past its full sweep closes it into a complete circle.
  • Fillet — pick two lines one after the other (they need not touch — crossing lines are cut back, short ones extended to the tangency points) or click a shared corner; an exact tangent arc of the given radius replaces the joint, with Tangent constraints recorded so later edits keep the blend. Works on polyline vertices too; rectangles and polygons degrade gracefully to polylines when a corner is cut.
  • Chamfer — same two-line pick; a symmetric cut of the given distance replaces the corner. Radius and distance share the ribbon's one value box (Offset uses it too).
  • Offset — click a line, polyline, rectangle, circle, polygon or arc; an equidistant copy is created on the clicked side. Closed contours offset as closed contours.
  • Centre axes — click a circle or an arc; two perpendicular dash-dot centre lines appear at its centre, grouped with it.

All modify tools share the dimension contract: the edit wins, parameter locks it violates come off automatically and are listed in the status bar.

Constraints

Geometric constraints keep relationships alive through every later edit. Arm a constraint tool (ribbon or marking menu, or the C radial), then pick the entities:

ConstraintHolds
FixOne node pinned at its position.
Horizontal / VerticalA straight line stays level / plumb.
CoincidentA point sits on another point or on a line.
MidpointA point sits at the midpoint of a line.
TangentLine–arc or arc–arc tangency.
Parallel / Perpendicular / CollinearLine-to-line direction relationships.
AngleTwo lines keep a fixed signed angle.
Equal length / Equal radiusThe second entity follows the first.
ConcentricShared centre (point–arc or arc–arc).
SymmetricTwo lines are mirror images across a symmetry axis — a drawn Line or Axis, or a coordinate-system axis.

Constraints render as small badges by their geometry; the solver re-applies them on every drag frame and exactly on commit, so constrained geometry moves as a mechanism, and the sketch renders slightly faded until it is fully defined — full colour is earned at zero degrees of freedom. A redundant constraint is refused (or absorbed with a note) rather than silently stacked; driving dimensions are equations the solver always honours. A long-press on a badge (see selection) picks the constraint itself — Delete removes it, no prompt.

The side panel's Constraints tab lists every constraint touching the selection as an expander row (✕ removes; expanding spotlights its entities on the canvas), offers context-aware ADD chips for what the current selection could be constrained with, and ends with the sketch's health line: fully defined, under-defined by N DoF, redundant constraints present or ⚠ conflicting.

Selection, parameters & locks

  • Selection: multi-select is the default — a click adds to the selection, clicking a selected shape deselects it, a click on empty canvas clears; Alt+drag marquee-selects. Right-click for bulk edits (colour, thickness, line style, hatch, delete…); Delete removes the selection.
  • Long-press pick: plain clicks always pick geometry. Holding the press ~0.5 s over an ambiguous spot — a constraint badge over a line, a node on a line, an axis under a shape — opens a list of every candidate under the cursor; click the one you meant.
  • Objects & Constraints panel: the side panel lists every drawing object (shapes, dimensions, annotations, hatch/fill seeds) with property expanders for direct parameter editing — colour, thickness, line style, fill/hatch, the object's layer and the kind-specific parameters — and every constraint on its second tab. Hovering an entry spotlights it on the canvas.
  • Multi-edit: with two or more objects selected (marquee, select by group, select-all-from-layer, Shift+clicks) the Objects tab leads with a Selection section: the shared properties — outline colour, thickness, line style, reference, fill/hatch, layer — applied to every selected object at once, one undo step per edit. A control shows the common value when all objects agree and an empty/indeterminate state when they differ.
  • Grouping: Ctrl+G groups the selection — it then selects and moves as one; Ctrl+U ungroups.
  • Copy & paste: Ctrl+C / Ctrl+V duplicate shapes (pasted copies land slightly offset and selected). The constraints holding the copied set together come along — a copied slot stays a slot; a constraint reaching a shape outside the copied set is dropped. Copy as image puts the whole drawing on the clipboard as a picture — paste it straight into e-mail or a document.
  • Parameters & locks: the ribbon panel shows the selected shape's node X/Y, line length, rectangle A/B or circle ⌀. The padlock locks a parameter — edits and drags then move only the unlocked geometry; the last value you type is driving, and the app warns when locks make a value unreachable.

Dimensions that drive geometry

Dimensions in Stack are constraints, not decorations: double-click one, type a value, and the geometry moves to match.

  • Linear / distance / diameter — one context-aware tool; what you click decides the type: two nodes give a linear dimension (aligned / horizontal / vertical via right-click), a line plus a node or the drawing origin (the small cross-and-circle) gives a perpendicular distance, two parallel lines give their spacing, a circle gives a diameter immediately, an arc a radius, and a line followed by a click on empty space its length.
  • Angle — click two lines, then place the arc; the measured sector follows the cursor. Double-click to type the angle and a line or axis rotates to match. When you drag one of the dimensioned objects, the angle dimension stays pinned to the static one.
  • Ordinate — click a node; an ordinate dimension from the drawing origin is created (X or Y decided by where you place it).

When you type a value the free end of the geometry is moved by preference; if parameter locks over-constrain the edit the dimension wins — the conflicting locks are removed automatically and listed in the status bar. Dimensions follow the geometry when it moves, can be dragged to a new position (even while the dimension tool is armed — grabbing an existing dimension beats creating a new one), and are deleted with their shape. Values show in real units once the drawing scale is calibrated, otherwise in canvas units. Dimension text keeps a constant on-screen size regardless of zoom.

Dimensions carry a style — driving (toleranced; ± suffixes render inline when symmetric, stacked when not), basic (framed, exact) or reference (parenthesised, measure-only). A new dimension whose quantity is already pinned — a duplicate, or a value the constraints fix anyway — is auto-demoted to reference, with the status bar saying so (right-click ▸ Convert to driving reverses it). The app also warns when a sketch becomes over-dimensioned.

GD&T, datums & notes

  • Feature control frame — click a node, line or circle to attach a frame, then build it in the dialog: characteristic symbol, optional ⌀/S⌀, the tolerance value with optional Ⓜ/Ⓛ (plus legacy Ⓢ under ASME), and up to three datum references (each with optional Ⓜ/Ⓛ). The modifier row adds Ⓤ/UZ (unequally disposed profile zone — drawing notation only, following the project's standard; to make the shift act on a stack-up, add a Ⓤ zone shift (basic) vector to the chain), Ⓟ with its height (projected zone — notation too; it qualifies where the zone applies and does not alter a 1D chain), Ⓕ free state and — under ASME — Ⓣ tangent plane. The dimension right-click menu offers Ⓔ (envelope, ISO) or ⟨ST⟩ (statistical, ASME) on size dimensions. Symbols the selected standard does not define are hidden from new frames (Y14.5-2018 drops concentricity and symmetry).
  • Datum — places a boxed datum letter on geometry, drawn as a short horizontal stub with the leg normal to the surface — or on a feature control frame (click the frame body), where it moves and is deleted together with the frame.
  • Note — free text with a leader; attach it to a node, a line, a circle, another annotation or empty space. The text editor carries a one-click symbol palette (⌀ □ ° ± Ⓜ Ⓛ, all GD&T characteristics) and expands aliases as you type — <dia> becomes ⌀ the moment you close the bracket.
  • Composite frames — for position and profile characteristics the builder offers a two-row composite frame (one symbol cell spanning both rows). Datum targets place the split-circle target symbol (area over label).

Like dimensions, all annotations keep a fixed on-screen size while you zoom. Leaders leave a frame from its left or right side, and grabbing a frame always moves it — even with a tool armed. Double-click edits, right-click deletes.

Hatching, fills & line styles

  • Hatch and Fill are area tools: arm one, then click inside a region bounded by any primitives — a closed shape, or an area enclosed by stitched lines and arcs. Hovering pre-highlights the region a click would take; for nested regions the smallest enclosing area wins, so a plate with a bore hatches like a real section view. Closed contours inside the region are punched out as holes.
  • Reference geometry never bounds an area. Centre lines/axes and anything flagged as construction are ignored when the region is traced, so a symmetry axis drawn across a section does not cut the hatching in half. If you want a boundary there, draw an ordinary line — real geometry still divides the area.
  • Every hatch/fill is a parametric object of its own: selectable by its area, editable (angle, spacing, crosshatch, opacity, fill colour — inline on the ribbon, under right-click → Hatch properties…, or from the Objects panel) and deletable. Fill and hatch coexist. An edit that re-opens the outline removes the hatching and says so.
  • Drawing order — layers are painted bottom-to-top: background image · hatch/fill areas · dimension lines (witness, dimension, arrows) · reference geometry (axes, construction) · object geometry · dimension values, GD&T frames and notes · selection highlights. So a real edge is never hidden by a witness line, while a dimension value is never crossed by an edge. The exported PNG/report uses the same order as the screen.
  • Line styles — every shape can be solid, dashed or dash-dot, with per-shape colour and thickness (the Axis kind is always dash-dot).
  • Select by group — the ribbon's group button takes a whole category of the sheet in one click: Reference geometry (centre lines/axes and anything flagged as reference — the construction layer), Object geometry (the material outline: lines, arcs, circles, rectangles, splines, polygons, slots, ellipses) or Dimensions & annotations (dimensions, GD&T frames, datums, notes and the parametric hatch/fill areas). Each entry shows how many objects it holds and is greyed out when the sheet has none. Ctrl+click ADDS the category to the current selection, so categories stack.
  • Smart colour — one button, two jobs. With nothing selected it picks the working-area background colour. With a selection it picks the object colour and paints every selected shape, dimension and annotation at once — one click, one undo step. Pair it with Select by group to recolour a whole category: select the group, click a colour, done. Shape fills keep their own picker (Hatch/Fill) so a recolour never overwrites them.

Layers

Every drawing object — shapes, dimensions, GD&T frames, notes and the parametric hatch/fill areas — carries a layer number (1–256; every sheet starts on layer 1). Layers organise a drawing the CAD way: put construction on one layer, the outline on another, annotations on a third — then hide or lock whole layers at once.

  • Layers ▾ — the ribbon button opens the layer manager; its badge (Layers · 3) always shows the active layer. The manager lists layers 1 to the project's layer count (a Project-tab property, default 16, up to 256 — reducing it below the highest layer in use is refused) plus any higher layer in use; empty layers are dimmed and the bottom field reaches any number up to the count. Each row shows the object count, four labelled checkbox columns — Active, Visible, Locked, Selectable — and three icon actions: select all from layer, move here, copy here. Select all from layer also lives in the ribbon's select-by-group menu.
  • Active layer — the Active column: ticking a layer moves the tick there (exactly one layer is always active — the ticked box cannot be un-ticked). Everything you create — drawn shapes, pasted copies, dimensions, GD&T, hatch regions, constraints — lands on the active layer. It is remembered per sheet and saved with the project. An object's layer can also be changed directly in the Objects panel (per object, or for the whole selection via multi-edit).
  • Constraints have layers too — a constraint's canvas badge carries a layer like any object: hiding the layer hides the badge (and it stops being pickable), moving a set of objects to a layer takes the constraints that tie that set along, and a copied set's constraints land on the target layer with the copies. The layer governs the badge only — the solver always sees every constraint, so hiding a layer never breaks the geometry. Founding constraints of a fillet or a trim split stay on their geometry's layer (they are part of that surgery), everything else lands on the active layer.
  • Move here / Copy here — send the current selection to that row's layer: Move re-tags the objects, Copy creates independent copies there (the copies come back selected, ready to drag — and they keep the constraints that held the copied set together; a constraint reaching an object outside the selection is dropped, so the copy never stays chained to the original). Both are one undo step.
  • Hidden layer — not drawn, not snappable, not selectable, and it never bounds a hatch region: a region "divided" by a hidden line hatches as one area, exactly as the screen shows it. Exports (PNG, report, Excel) skip hidden layers too — what you see is what prints. Constraints keep solving through hidden geometry: hiding never breaks the model.
  • Locked layer — the layer is welded into one rigid object: clicking any part selects the whole layer, and a drag translates it as one piece — internal constraints ride along untouched. When an outside link pins the layer (a Fix, a constraint to geometry on another layer, a coordinate-system reference, a driving dimension against outside geometry or the origin) the drag is refused with a hint — the layer moves whole or not at all, never partially. Per-object edits are blocked: node drags, resizing, trim/extend/fillet, re-placing its dimensions and deleting single objects all refuse (the Objects panel shows its properties read-only). Properties stay editable — Smart colour and multi-edit work on a locked layer, because locking restricts transforms, not appearance.
  • Selectable off — the layer stays visible, snappable and still bounds hatch regions, but no click, marquee, group selection or select-from-layer can pick it: the classic untouchable reference underlay. (Locked + Selectable off = not clickable, so not movable either; Hidden outranks both.)
  • DXF — layers travel with the file: layer 1 exports to the classic GEOMETRY / DIMENSIONS / ANNOTATIONS split, higher layers as L002L256, and the same names import back to their numbers. Foreign layer names land on the active layer — the import report says which.

Transform, mirror & arrays

  • Mirror — reflected copies of the selected shapes across a line you pick.
  • Linear array — copies along an X/Y step.
  • Circular array — copies rotated around a centre.
  • Transform — move / rotate / scale the selection by exact typed values.

The marking menu

Hold the right mouse button on empty canvas for a quarter second and a radial menu opens under the cursor, mirroring the ribbon 1:1 — the same groups, the same tools, the same order, so muscle memory transfers between the two surfaces. Slide onto a group to fan out its tools, release over a tool to arm it; a quick right-click (or moving away) still does what it always did. With the Stack-up context active the ring offers the chain tools instead (Requirement, Vector, Guide line, Geo tol, Lock X/Y).

Single-key radial shortcuts open one category's ring directly at the cursor: D draw tools, C constraints, A annotations (dimensions, GD&T, notes). Scrolling the wheel while RMB is held cycles through the active group's tools — with the ring open it walks the highlighted ring instead.

Pin a tool. Hold LMB for 0.25 s over a tool — on the ring or on a ribbon button — and it pins: the tool stays armed after every use instead of one-shot disarming. Pinning covers draw tools, constraint picks, dimension / GD&T / note placement, region fill and the stack-up chain tools; Esc unpins.

DXF / DWG interchange

CAD exchange is split by intent between the two ☰ menus:

  • The DRAWING section's menu owns the editable exchange: Import DXF/DWG converts the file's geometry, dimensions and annotations into live sketch shapes you can edit, constrain and dimension; Export DXF writes the sketch back out (layers GEOMETRY / DIMENSIONS / ANNOTATIONS, millimetres; GD&T frames export as portable text). Export is DXF only — import reads both DXF and DWG.
  • The IMAGE section's menu carries Import DXF/DWG as image: the file is rendered to a PNG (saved next to the source) and attached as a background underlay — nothing editable is created, which is the right choice when the CAD file is only a reference to chain over.

12. Analysis methods

MethodBandConvention
Worst CaseΣ contributions, each end summed on its ownAsymmetric tolerances are converted to equal-bilateral (mean shift) — the band is exact. Ordinary rows reach both ends, so the band is Σ contributions ± Σ half-widths; a Ⓜ/Ⓛ bonus earned from a feature in the same chain reaches only the end where that feature is away from maximum material, and the band is asymmetric (see A bonus is zero at maximum material).
RSSnominal ± √Σ(half²)Classic root-sum-of-squares of the ± half-widths.
Monte Carlosampled distributionNormal: ±tol = ±3σ (untruncated). Uniform: σ² = h²/3. Triangular: σ² = h²/6. Basic dims contribute zero variation. Yield = fraction inside MIN…MAX; Cp/Cpk from the sampled moments.
Why Monte Carlo can exceed worst case: the normal distribution is untruncated, so a 6σ run samples beyond ±tol occasionally. That is a property of the convention, not an error — the histogram's worst-case markers make the comparison explicit.
What the statistical path samples. RSS and Monte Carlo stack the physics the rows describe, not the rows themselves: a Ⓜ/Ⓛ bonus does not add a second, independent error — it widens the zone the same error lives in, so the pair is drawn once — and a boundary row is taken back apart into size, zone and bonus before sampling, so the mean sits at the average part. Worst case is unchanged by all of this. The white paper's section 10 walks through the cases.

13. Thermal analysis

Set T MIN / T ROOM / T MAX on the Project tab. Nominals are defined at room temperature; at any other temperature each entry's contribution and its ± half-width are scaled by its material's thermal strain (α·ΔT, or the integrated α(T) curve — curves are integrated, not linearised). Each temperature slot is therefore a complete, self-consistent calculation: the optional grid columns show it, the Σ row sums it, and the results panel judges it — all from the same numbers. Statuses are judged at all three temperatures. For thermal assembly analysis see Shrink fit.

14. Results & reports

The Results tab has three sub-views:

  • Summary — one panel per requirement with its own chart: the three temperature rows (min / nominal / max per method) next to the Monte Carlo histogram (σ scale, Cp/Cpk, yield) or a hatched worst-case span. Click a temperature row to switch the chart; a separated MIN/MAX pair appears as one aggregated entry.
  • Charts — pick a requirement and a sample count, re-run with a fresh seed, and read three interactive charts: the Monte Carlo distribution at T ROOM (mouse-over readout), method ranges vs the requirement limits, and a contribution Pareto by variance share.
  • Statistics — a sortable grid, one row per requirement and temperature: WC MIN/MAX, RSS MIN/MAX, MC mean, σ, Cp, Cpk, yield %, status.

PDF report

One document for the whole project: identity, materials, parts, features, version history, then every requirement with its chain drawing, the contributor table (nominal, tolerances, ÷2, sense, contribution and its ±), per-temperature result tables and the contribution ranking (WC share, variance share). A footer spells out the conventions: contributions are mean-centred, the ± is a half-width, Σ Contribution ± Σ ± is the result band.

Excel report

Export Excel writes a styled, client-ready workbook:

  • Summary — project identity, units, temperatures, the Monte Carlo sample count and seed (fixed seed → a re-export reproduces identical numbers), and a colour-coded verdict table of every requirement.
  • One report sheet per requirement — what is being checked, the stack-up drawing rendered to an embedded image, the contributor table (with a Note column carrying the grid's INFO notes verbatim and live Σ formulas), a plain-language "how the results are computed" section, per-temperature WC / RSS / Monte Carlo tables (yield, Cp, Cpk), embedded Monte Carlo histograms per temperature and the contribution ranking with data bars.
  • A parametric Calc sheet per requirement — every derived number is a live Excel formula over highlighted input cells (temperatures, limits, senses, ÷2, tolerances, α), so a reviewer can play what-if without the application.
  • Materials / Parts / Features / History reference sheets (History when version control is on).

The Calculations ribbon's Export sheet writes just the current requirement's report + Calc sheets. Shrink-fit sheets carry their fit parameters, the FIT states and the AT ASSEMBLY judgement in every export.

15. Units

The Project tab's Metric / Imperial toggle converts every physical value in the project — lengths (mm ↔ in), temperatures (°C ↔ °F) and CTE (1/°C ↔ 1/°F) — and is stored with the project. Dimension values display with 5-decimal precision.

16. Settings

  • Appearance — eight colour schemes: Light, Dark, Mono Light and Mono Dark (black-and-white), Solarized, Red Night (all-red, submarine-style — preserves dark adaptation for night work), Nocturne (deep dark with muted accents) and High Contrast (orange on black). Plus canvas background, drawing colours and text & interface size. All schemes are held to contrast floors for readability. The canvas background is a separate choice from the scheme, and the chain follows it: when you have not set a colour of your own, vectors, geometric-tolerance points, the requirement vector and the guides take their default ink from the background — held to a 3:1 contrast ratio against it, with the X and Y axes kept apart. A colour you set yourself, per vector or as a default here, always wins.
  • Behaviour — autosave interval, hints, default RSS / Monte Carlo for new requirements, author name for version control.
  • Diagnostics — opt-in event log written to %APPDATA%\F3Stack\debug.log.

17. Help, updates & troubleshooting

  • Help → Getting started — the quick-start summary, the sample project and this guide (see also The stack-up process for the full worked example).
  • Help → About — product, version, copyright, license status and Check for updates: a manual comparison of your build against the latest release on stack.f3lab.tools. Nothing is sent (no machine data, no telemetry) and nothing installs automatically — if a newer version exists you get its notes and a link to the download page.
  • Help → Log — the diagnostic log. The Log technical data checkbox, when cleared, redacts every numeric value (dimensions, results, coordinates) from the displayed and copied log so it can be shared without exposing project data.
  • Crashes always leave a report in %APPDATA%\F3Stack\crashes and attempt an emergency project save.

18. Keyboard shortcuts

KeysAction
/ Previous / next section tab
Ctrl+Z / Ctrl+YUndo / redo (character-level inside an active text edit)
Ctrl+S / Ctrl+Shift+SSave project / Save As…

On the Calculations canvas:

Keys / gestureAction
D / C / AOpen the Draw / Constraints / Annotate radial ring at the cursor
Ctrl+C / Ctrl+VCopy / paste selected shapes · paste a drawing image
Ctrl+G / Ctrl+UGroup / ungroup the selected shapes
Ctrl+FFit the drawing to the viewport
EscCancel the in-flight gesture · disarm (and unpin) the tool · clear the selection
EnterFinish a polyline / spline
DeleteDelete the picked constraint · selected dimension / annotation · selected shapes / vectors / guides / images
Shift + clickAdd a node to the constraint pick set · square a guide to 90°
Ctrl + drag a nodeRotate the shape about its centre
Alt + dragMarquee-select vectors, guides, images and shapes
Hold RMB ¼ sOpen the marking menu · RMB+wheel cycles the active group's tools
Hold LMB ¼ s on a toolPin the tool — stays armed after every use
Hold LMB ½ s on canvasPick-disambiguation list (constraint badge / node / shape under the cursor)
Double-click a dimensionType a value — the geometry moves to match
Wheel · RMB dragZoom to cursor · pan

19. Trial & activation

Stack runs only with a license file — Free (by registration, no charge) or Pro; without one it opens the activation window and waits. Activation itself is fully offline — the file comes by e-mail, no server is contacted by the application.

  1. Open Help → About → License… and copy your machine code (format XXXX-XXXX-XXXX-XXXX).
  2. Send the code with your order to F³ Lab — you receive a license.lic file generated for this machine.
  3. In the same window choose Import license file… and select the file. The badge disappears and the About tab shows your license.
Notes. The license is bound to the machine it was issued for; moving to a new computer requires a new license file (contact F³ Lab). Perpetual licenses never expire; subscription licenses show their end date in Help → About. The Free badge stays on the title bar until a Pro file is imported.
Editions, reports and the clock. There are two editions and both are activated by a signed file, so every installation is registered. Free costs nothing: register on stack.f3lab.tools with your name, e-mail and the machine code (the Get a free license… button in the activation window opens the page with the code filled in) and the file arrives by e-mail. Every feature works, but the calculation sheet and every exported report carry the watermark Free edition — not for commercial use, and a project holds at most 20 chains (a project with more still opens and calculates; you cannot add chains until a Pro license is imported). Pro is the purchased file: every feature, reports that carry Licensed to …, one year from issue. Both are bound to one computer. The application also remembers the newest date it has been run on: a system clock set back behind that date suspends an expiring license until the date is restored, and the activation window says which date that is; a perpetual license is unaffected. A renewal starts where the previous license ends, so renewing early costs no days.

20. Validation

The analysis engine is validated by an automated test suite against published worked examples from independent engineering sources — worst-case and RSS bands are asserted to the published digits, Monte Carlo against the analytic moments of the documented conventions. Two of those examples ship with the application as complete projects (with drawings) in the Examples folder:

  • pcb-enclosure-gap — PCB fit in a handheld enclosure (Gap = A − B − C): worst case fails the 0.10…0.90 spec, RSS passes — the classic argument for statistical tolerancing.
  • blocks-in-housing — three blocks in a housing (inches): gap 0.020, WC ±0.015, RSS ±0.00794.

Engineering results produced by the software are aids to analysis. Verify all results independently before making design decisions (see the EULA).

Stack by F³ Lab — Tolerance Stack-Up Analysis · © F³ Lab · This guide describes the application as shipped; the in-app Help section always matches your installed version.