Milestone 2026-07-11 — Two blocks joined by TWO M3 screws (anti-rotation)

Download STL: twoblocks2xM3antirot_0001.stl · twoblocks2xM3antirot_0002.stl
Authors: Tim C. Lueth und Claude Opus 4.8 — SG-Lib Cowork tutorial milestone.
What this is
Two 20×30×20 mm blocks placed flank to flank, joined by two lateral, recessed DIN912/DIN985 M3 cross
screws side by side to block rotation. A single lateral screw clamps the blocks but still allows twist
about the screw axis; a second screw offset perpendicular to the axis locks the orientation. Built with the
SG-Lib idiom (box → relative assembly → subtraction bausatz), watertight via the Manifold boolean backend
(SGBOOLENGINE='SGboolManifold2').
Key lessons captured in this milestone
- Two screws block rotation (
SGLIB_Fuegen.mdsec.2c): two axes offset perpendicular to the screw axis lock the rotation statically. Here both are plain round-hole screws (accepted practice with printed clearance fits). - Box side joint (sec.2b): blocks flank to flank via
alignT {'X-','X+'}; screw axis = X, common flank = fuge. - Positions & spacing from the geometry — no magic numbers: both screw axes at
yc ± span/4→ spacing 15 mm. - Screw length from
screwlengthDIN912985(M,t1,t2): shortest recessed DIN912 A2 keeping head+nut recessed with enough residual wall (clamped thicknesst1+t2, required wall). Here → M3×25, wall 6 mm, grip 21 mm. - Joint limit load
info.Fmax: the achieved recess wall carries the head in punch-through shear,Fmax = wall·π·dk·σ/(√3·S). Here → 519 N per screw (PLA @ 20 %, σ 16.8 MPa, S=2) → 1038 N axial total; the printed wall — not the screw — is the limiting factor. - Insertion tunnel
tpl≥ body thickness so head/nut reach the outer face ('TT',tpl=[t1 t2]+2). - Design trace: every design decision + the limit load are emitted as
XXcomments (see_XXtrace.txt). - Always visualize the result (
SGfigure+SGtitlewith key params +drawnowvid(20)). - BOM: two screws + two nuts, each with its Wegertseder order code via
productcode(DIN985 A2 M3 →3346-232).
Files
2026-07-11_build_twoblocks2xM3antirot.m— reproducible build script (self-contained, English output).2026-07-11_twoblocks2xM3antirot_STL/— STL parts,StandardParts_parts.txt(BOM), assembly views,Design-Comments.txt,Assembly-Fitting.txt.2026-07-11_twoblocks2xM3antirot_views.png— half-section preview (both recessed screws + channels).2026-07-11_twoblocks2xM3antirot_XXtrace.txt— the XX design trace of the build run.2026-07-11_twoblocks2xM3antirot_buildinfo.txt— build provenance (stamp + tic/toc).2026-07-11_SGlibrunMilestone.m— copy of the runner used to reproduce this milestone.2026-07-11_twoblocks2xM3antirot_conversation_en.md/_de.md— the construction conversation (EN/DE).
Reproduce
SGlibrunMilestone(fullfile(pwd,'CLAUDE_MILESTONES','2026-07-11_twoblocks2xM3antirot', ...
'2026-07-11_build_twoblocks2xM3antirot.m'))
Result & provenance
- Result: 2× M3×25, spacing 15 mm, residual wall 6 mm, grip 21 mm, limit load 519 N/screw (1038 N total), rotation locked, watertight (nm=0 on both bodies).
- Execution time: 5.10 s (tic/toc)
- Machine / stamp: Mac OSX 15.7.7 · MATLAB R2024b Update 6 · SG-Lib 5.7 develop · Java 11.0.24+8-LTS · Apple M3-PRO (12-Core CPU, 18-Core GPU), 36 GByte RAM
- Host: lueths-barcelona-mac.local (MACA64 / maca64)
- Run at: 2026-07-11 08:12
Design conversation (English)
Conversation — Milestone “Two blocks, two M3 screws (anti-rotation)” (2026-07-11)
The way to the result: Tim’s task and hints (verbatim, faithfully translated) with Claude’s construction replies in between. Construction part only; pure MATLAB/programming passages are elided with “[…]”.
Tim: “Compute again the two side-by-side blocks with the lateral screw, and tell me the limit load in N for 20% PLA. The program should be able to output that as an XX comment (general SG-Lib joining rule).”
Claude: Starting point: two 20×30×20 blocks flank to flank, joined by one lateral M3 cross screw
(DIN912 A2 M3×25 + DIN985 A2 M3), residual wall 6 mm, watertight. The limit load follows from the achieved recess
wall in punch-through shear, Fmax = wall·π·dk·σ/(√3·S). For PLA @ 20 % (σ 16.8 MPa, S=2) → 519 N.
screwlengthDIN912985 now returns this as info.Fmax, and the caller emits it as an XX comment. […]
Tim: “Please take this task and now place two screws side by side to block the rotation.”
Claude: Implemented per SGLIB_Fuegen.md sec.2c (“two screws”): a single lateral screw holds the blocks
together but still allows twist about the screw axis — a second screw offset perpendicular to the axis locks the
rotation. Both screw axes at yc ± span/4 (derived from the geometry, no magic numbers) → spacing 15 mm. Each
side uses a SGdesignDIN912DIN985 bausatz at its own 'M' frame at the fuge (head opens at B’s +X outer face, nut
at A’s −X outer face), insertion tunnels tpl=[t1 t2]+2. Result: 2× DIN912 A2 M3×25 + 2× DIN985 A2 M3, residual
wall 6 mm, grip 21 mm, watertight (nmA=nmB=0). Limit load 519 N per screw (1038 N axial total), rotation locked.
BOM with 2×/2× and order codes.
Tim: “Remember, I always want a graphical output of EVERY design result during execution. That is a general SG-Lib design rule!”
Claude: Adopted: every design result is visualized during execution (SGfigure + SGplotalpha of the two
bodies and of the drawn screws at their joining frames). […]
Tim: “Normally a short text is shown via title or SGtitle (the calling function name may be added
automatically) with the essential parameters of the shown object.”
Claude: The plot gets a short SGtitle with the key parameters:
2x DIN912 M3x25 | spacing 15 mm | Fmax 519 N/screw PLA20pct. […]
Tim: “Yes, let’s file this as a milestone with conversation.”
Claude: Documented as a reproducible milestone: self-contained build script, STL parts + BOM, half-section
preview (shows both recessed screws), XX design trace, buildinfo (stamp + tic/toc 5.10 s), runner copy, and this
conversation (DE/EN).
Result
Two 20×30×20 blocks with two M3 cross screws side by side (spacing 15 mm) as anti-rotation lock: 2× DIN912 A2 M3×25 + 2× DIN985 A2 M3, residual wall 6 mm, grip 21 mm, limit load 519 N/screw (1038 N total), rotation locked, watertight (nm=0).