Merged in #36. The family is named for its set screw, and the set screw is the one feature it does not model.
part.py cuts the screw seat as a plain cylinder:
screw_axis = (cq.Workplane("YZ").circle(screw_d / 2.0).extrude(wall + 1.0)
.translate((bore_r - 0.5, 0, width / 2.0)).rotate(...))
collar = collar.cut(screw_axis)
NOTES.md line 48 declares it — "Threads are represented as clean cylindrical holes; helical thread geometry is omitted" — so it is disclosed, not hidden. The problem is the choice, not the disclosure. screw_d is the GN 705 d3 column, which over the encoded rows is M6 through M12 (pitch 1.0–1.75 mm); at that size the thread is the functional feature of the part, not a cosmetic detail, and a benchmark task that renders it as a smooth Ø6/Ø8/Ø10 hole is not asking the model to build a set collar. Elsewhere in the project threads at this size are modelled rather than declared away.
Two ways out, either is fine: cut a real thread (a helical V-groove, or the ring-profile idiom used elsewhere — crest flat P/8, root flat P/4, 5P/16 flanks), or state in NOTES.md why this family is exempt when comparable families are not.
Second point, lower confidence and worth a check against the catalog sketch rather than my word: build() also sinks a counterbore into the outside diameter around each screw hole —
screw_head_d = screw_d * 1.45
recess_depth = min(1.2, max(0.35, screw_len * 0.12))
— declared in NOTES.md only as "shallow screw-side recesses computed internally". A DIN 916 socket set screw seats inside the threaded hole; if the GN 705 sketch does not show a spotface on the OD then this is an invented feature and should go, and if it does show one it should be dimensioned from the catalog rather than derived from screw_d * 1.45.
Not asking to change: d1/d2/d3/b and the d1 > 70 two-screw rule all track the JW Winco table, and the second-screw variant does reach the hard tier (the bore range runs to 80).
Merged in #36. The family is named for its set screw, and the set screw is the one feature it does not model.
part.pycuts the screw seat as a plain cylinder:NOTES.mdline 48 declares it — "Threads are represented as clean cylindrical holes; helical thread geometry is omitted" — so it is disclosed, not hidden. The problem is the choice, not the disclosure.screw_dis the GN 705d3column, which over the encoded rows is M6 through M12 (pitch 1.0–1.75 mm); at that size the thread is the functional feature of the part, not a cosmetic detail, and a benchmark task that renders it as a smooth Ø6/Ø8/Ø10 hole is not asking the model to build a set collar. Elsewhere in the project threads at this size are modelled rather than declared away.Two ways out, either is fine: cut a real thread (a helical V-groove, or the ring-profile idiom used elsewhere — crest flat P/8, root flat P/4, 5P/16 flanks), or state in
NOTES.mdwhy this family is exempt when comparable families are not.Second point, lower confidence and worth a check against the catalog sketch rather than my word:
build()also sinks a counterbore into the outside diameter around each screw hole —— declared in
NOTES.mdonly as "shallow screw-side recesses computed internally". A DIN 916 socket set screw seats inside the threaded hole; if the GN 705 sketch does not show a spotface on the OD then this is an invented feature and should go, and if it does show one it should be dimensioned from the catalog rather than derived fromscrew_d * 1.45.Not asking to change: d1/d2/d3/b and the d1 > 70 two-screw rule all track the JW Winco table, and the second-screw variant does reach the hard tier (the bore range runs to 80).