Vis Automations · In-app tool, Automation Scripts menu

Fastener Stacks

Finds every fastener in an assembly, groups touching fasteners into stacks, groups identical stacks into families, and shows each family as a colored Vis group you can select.

Verification passing on Vis 2606.0 build 26134 + 2606.2610 · 2026-10-29 · repo tc-vis-automation 9f1b0af · Goals 1 to 6 verified from inside Vis and headless (16/16); the bonus goals are not started.

Two runs. From inside Vis: the panel launched from Menu › Automation Scripts and clicked through all four buttons, each outcome read back from Vis. And headless: tools/test_fastener_stacks.py owns its own Vis (it refuses to run while one is open), runs every command and checks group membership, materials, the selected-node list and the pixels of zoomed captures. tools/test_fastener_stacks.py: 16 of 16 checks pass.

The model: A wing flap assembly: 3,615 part nodes, 1,390 root children; 3,570 fastener instances in 11 part-number families plus 45 structural parts (vis_census.py).

1352
fasteners
1063
stacks: 965 single, 16 of 2, 61 of 4, 19 of 5, 2 of 8
27
families
27
Vis groups, each count read back
Vis
2606.0 build 26134 + 2606.2610
Run
2026-10-29 · EXERCISED
Checks
8 of 8 hold
Overall
All checks hold
Source
tc-vis-automation README.md (Fastener Stacks section) at commit 9f1b0af, inapp/fastener_stacks.py, inapp/fastener_stacks_panel.py, tools/test_fastener_stacks.py; model census from commit 22aee3a
ResultCheck
HoldsIdentify fasteners1,352 fastener instances by part-number rules; 45 structural parts excluded.
HoldsFasteners in the same stack1,063 stacks by bounding-box contact: 965 single, 16 of 2, 61 of 4, 19 of 5, 2 of 8.
HoldsSimilar stacks grouped27 families: same part numbers in the same order along the axis, either direction. One Vis group per family, each group's count read back.
HoldsSelect a stack in VisPanel Select stack from one picked rivet: 4 of 4 selected.
HoldsSelect a group of stacksPanel Select group: 204 of 204 instances, 51 stacks.
HoldsOne color per familyPer-instance material; the 6 largest families render within 0.015 of their hue, checked zoomed.
HoldsClearPanel Clear: 27 groups removed and 1,352 materials restored.
HoldsHeadless end-to-end testtools/test_fastener_stacks.py: 16 of 16.

In the Vis window

The panel driven by hand in a live session on 2026-10-29. File name and local path masked.

1 · Analyze model running (about 2 minutes on the wing flap).
2 · Select stack: selected 4 fasteners in 1 stack, highlighted in the Vis tree.
3 · Select group: selected 204 fasteners in 51 stacks.
4 · Clear: cleared 27 groups; 1,352 materials restored.

Corrected

An earlier run on the same day recorded two failures: a fasteners-only whole-model capture that rendered blank, and a test that overran its watchdog at the clear step. Both are resolved. The blank capture was Vis not drawing sub-pixel parts in a whole-assembly view (1 to 2 px rivets over the full flap), so color is now checked zoomed per stack. Coloring moved from group material to per-instance material, which also made Clear restore each instance.