screw fixes

This commit is contained in:
Adrian Mariano 2022-09-17 22:23:43 -04:00
parent e3ac0e3cba
commit be6eacfa2e

View file

@ -171,7 +171,7 @@ Torx values: https://www.stanleyengineeredfastening.com/-/media/web/sef/resourc
// The anchors and anchor types refer to various parts of the screw, which are labeled below. The "screw" anchor type (the default) is simply // The anchors and anchor types refer to various parts of the screw, which are labeled below. The "screw" anchor type (the default) is simply
// the whole screw and the "head" anchor is the head. These anchors use the bounding cylinder for the specified screw part, except for hex // the whole screw and the "head" anchor is the head. These anchors use the bounding cylinder for the specified screw part, except for hex
// heads, which anchor to a hexagonal prism. // heads, which anchor to a hexagonal prism.
// Figure(2D,VPD = 113.4, VPT = [16.9671, 14.9021, -3.59741], VPR = [0, 0, 0],NoAxes): // Figure(2D,Med,VPD = 140, VPT = [18.4209, 14.9821, -3.59741], VPR = [0, 0, 0],NoAxes):
// rpos=33; // rpos=33;
// fsize=2.5; // fsize=2.5;
// projection(cut=true) xrot(-90)screw("M8", head="socket", length=25, thread_len=10); // projection(cut=true) xrot(-90)screw("M8", head="socket", length=25, thread_len=10);
@ -409,7 +409,7 @@ module screw(spec, head, drive, thread, drive_size,
atype="screw",anchor=BOTTOM, spin=0, orient=UP, atype="screw",anchor=BOTTOM, spin=0, orient=UP,
_shoulder_diam=0, _shoulder_len=0, _shoulder_diam=0, _shoulder_len=0,
_internal=false, _counterbore=0) _internal=false, _counterbore=0)
{ { d=echo(undersize=undersize, shaft_undersize=shaft_undersize, head_undersize=head_undersize);
dummyA=assert(is_def(undersize) || num_defined([shaft_undersize, head_undersize])==0, dummyA=assert(is_def(undersize) || num_defined([shaft_undersize, head_undersize])==0,
"Cannot combine \"undersize\" with other more specific undersize parameters") "Cannot combine \"undersize\" with other more specific undersize parameters")
assert(is_undef(undersize) || is_num(undersize) || is_vector(undersize,2), "Undersize must be a scalar or 2-vector") assert(is_undef(undersize) || is_num(undersize) || is_vector(undersize,2), "Undersize must be a scalar or 2-vector")
@ -466,17 +466,14 @@ module screw(spec, head, drive, thread, drive_size,
eps_shoulder = headless && !_internal ? 0 : eps_gen; eps_shoulder = headless && !_internal ? 0 : eps_gen;
eps_shank = headless && !_internal && _shoulder_len==0 ? 0 : eps_gen; eps_shank = headless && !_internal && _shoulder_len==0 ? 0 : eps_gen;
eps_thread = headless && !_internal && shank_len==0 && _shoulder_len==0 ? 0 : eps_gen; eps_thread = headless && !_internal && shank_len==0 && _shoulder_len==0 ? 0 : eps_gen;
echo(shank_len=shank_len, thread_len=thread_len);
echo(eps_shoulder=eps_shoulder, eps_shank=eps_shank, eps_thread=eps_thread);
dummyL = assert(_shoulder_len>0 || is_undef(flat_height) || flat_height < length, str("Length of screw (",length,") is shorter than the flat head height (",flat_height,")")); dummyL = assert(_shoulder_len>0 || is_undef(flat_height) || flat_height < length, str("Length of screw (",length,") is shorter than the flat head height (",flat_height,")"));
offset = atype=="head" ? (-head_height+flat_height-flat_cbore_height)/2 offset = atype=="head" ? (-head_height+flat_height-flat_cbore_height)/2
: atype=="shoulder" ? _shoulder_len/2 + flat_height : atype=="shoulder" ? _shoulder_len/2 + flat_height
: atype=="shaft" ? _shoulder_len + (length+flat_height+shoulder_adj)/2 : atype=="shaft" ? _shoulder_len + (length+flat_height+shoulder_adj)/2
: atype=="shank" ? _shoulder_len + (length-thread_len+flat_height+shoulder_adj)/2 : atype=="shank" ? _shoulder_len + (length-thread_len+flat_height+shoulder_adj)/2
: atype=="threads" ? _shoulder_len + shoulder_adj + length-thread_len + thread_len/2 : atype=="threads" ? _shoulder_len + shoulder_adj + length-thread_len + thread_len/2
: atype=="screw" ? (length-head_height+_shoulder_len+shoulder_adj)/2 : atype=="screw" ? (length-head_height+_shoulder_len+shoulder_adj-flat_cbore_height)/2
: assert(false,"Unknown atype"); : assert(false,"Unknown atype");
echo(atype=atype, offset=offset, hh=head_height,length=length);
anchor_list = [ anchor_list = [
named_anchor("top", [0,0,offset+head_height+flat_cbore_height]), named_anchor("top", [0,0,offset+head_height+flat_cbore_height]),
named_anchor("bot", [0,0,-length-shoulder_full+offset]), named_anchor("bot", [0,0,-length-shoulder_full+offset]),
@ -498,7 +495,6 @@ module screw(spec, head, drive, thread, drive_size,
named_anchor("threads_center", [0,0,(-shank_len-length-_shoulder_len-shoulder_full-flat_height)/2+offset]) named_anchor("threads_center", [0,0,(-shank_len-length-_shoulder_len-shoulder_full-flat_height)/2+offset])
]; ];
vnf = head=="hex" && atype=="head" && _counterbore==0 ? linear_sweep(hexagon(id=head_diam),height=head_height,center=true) : undef; vnf = head=="hex" && atype=="head" && _counterbore==0 ? linear_sweep(hexagon(id=head_diam),height=head_height,center=true) : undef;
echo(VNF=vnf);
head_diam_full = head=="hex" ? 2*head_diam/sqrt(3) : head_diam; head_diam_full = head=="hex" ? 2*head_diam/sqrt(3) : head_diam;
attach_d = in_list(atype,["threads","shank","shaft"]) ? d_major attach_d = in_list(atype,["threads","shank","shaft"]) ? d_major
: atype=="screw" ? max(d_major,_shoulder_diam,default(head_diam_full,0)) : atype=="screw" ? max(d_major,_shoulder_diam,default(head_diam_full,0))
@ -512,7 +508,7 @@ module screw(spec, head, drive, thread, drive_size,
: atype=="screw" ? length+head_height+shoulder_full + flat_cbore_height : atype=="screw" ? length+head_height+shoulder_full + flat_cbore_height
: is_def(vnf) ? undef : is_def(vnf) ? undef
: head_height+flat_height+flat_cbore_height; : head_height+flat_height+flat_cbore_height;
echo(attach_l=attach_l); echo(attach_l=attach_l, offset=offset,fcb=flat_cbore_height,atype=atype);
attachable( attachable(
vnf = vnf, vnf = vnf,
d = attach_d, d = attach_d,
@ -541,7 +537,8 @@ module screw(spec, head, drive, thread, drive_size,
d_major], d_major],
pitch = struct_val(threadspec, "pitch"), pitch = struct_val(threadspec, "pitch"),
l=thread_len+eps_thread, left_handed=false, internal=_internal, l=thread_len+eps_thread, left_handed=false, internal=_internal,
bevel1=details,bevel2=details && (flathead || _shoulder_len>0 || headless) && !_internal, bevel1=details,
bevel2=details && (flathead || _shoulder_len>0 || headless),
$fn=sides, anchor=TOP); $fn=sides, anchor=TOP);
} }
if (!_internal) _driver(spec); if (!_internal) _driver(spec);
@ -613,15 +610,25 @@ module screw(spec, head, drive, thread, drive_size,
// threads_top = top of threaded portion of screw (invalid if thread_len=0) // threads_top = top of threaded portion of screw (invalid if thread_len=0)
// threads_bot = bottom of threaded portion of screw (invalid if thread_len=0) // threads_bot = bottom of threaded portion of screw (invalid if thread_len=0)
// threads_center = center of threaded portion of screw (invalid if thread_len=0) // threads_center = center of threaded portion of screw (invalid if thread_len=0)
// Example: // Example: Counterbored clearance hole
// diff() // diff()
// cuboid(20) // cuboid(20)
// position(TOP) // attach(TOP)
// down(4)screw_hole("1/4-20,.5",head="socket",counterbore=5,anchor=TOP); // down(4)screw_hole("1/4-20,.5",head="socket",counterbore=5,anchor=TOP);
// Example: Clearance hole for flathead
// diff()
// cuboid(20)
// attach(TOP)
// screw_hole("1/4-20,.5",head="flat",counterbore=0,anchor=TOP);
// Example: Threaded hole
diff()
cuboid(20)
attach(TOP)
screw_hole("M16,15",anchor=TOP,thread=true);
module screw_hole(spec, head="none", thread=false, oversize, hole_oversize, head_oversize, module screw_hole(spec, head="none", thread=false, oversize, hole_oversize, head_oversize,
length, l, thread_len, tolerance=undef, counterbore=0, length, l, thread_len, tolerance=undef, counterbore=0,
atype="shaft",anchor=BOTTOM,spin=0, orient=UP) atype="screw",anchor=BOTTOM,spin=0, orient=UP)
{ {
// Force flatheads to sharp for proper countersink shape // Force flatheads to sharp for proper countersink shape
@ -629,7 +636,7 @@ module screw_hole(spec, head="none", thread=false, oversize, hole_oversize, head
: head; : head;
if ((thread && thread!="none") || is_def(oversize) || is_def(hole_oversize) || tolerance==0 || tolerance=="none") { if ((thread && thread!="none") || is_def(oversize) || is_def(hole_oversize) || tolerance==0 || tolerance=="none") {
undersize = is_def(oversize) ? -oversize undersize = is_def(oversize) ? -oversize
: -[hole_oversize, default(head_oversize,0)]; : -[default(hole_oversize,0), default(head_oversize,0)];
default_tag("remove") default_tag("remove")
screw(spec,head=head,thread=thread,undersize=undersize, screw(spec,head=head,thread=thread,undersize=undersize,
length=length,l=l,thread_len=thread_len, tolerance=tolerance, _counterbore=counterbore, length=length,l=l,thread_len=thread_len, tolerance=tolerance, _counterbore=counterbore,
@ -748,7 +755,6 @@ module screw_hole(spec, head="none", thread=false, oversize, hole_oversize, head
// If we got here, hole_oversize is undefined and oversize is undefined // If we got here, hole_oversize is undefined and oversize is undefined
hole_oversize = lookup(struct_val(screw_spec, "diameter"), tol_table) + 4*get_slop(); hole_oversize = lookup(struct_val(screw_spec, "diameter"), tol_table) + 4*get_slop();
head_oversize = first_defined([head_oversize,hole_oversize]) + 4*get_slop(); head_oversize = first_defined([head_oversize,hole_oversize]) + 4*get_slop();
echo(hole_oversize, head_oversize, oversize);
default_tag("remove") default_tag("remove")
screw(spec,head=head,thread=thread,shaft_undersize=-hole_oversize, head_undersize=-head_oversize, screw(spec,head=head,thread=thread,shaft_undersize=-hole_oversize, head_undersize=-head_oversize,
length=length,l=l,thread_len=thread_len, _counterbore=counterbore, length=length,l=l,thread_len=thread_len, _counterbore=counterbore,
@ -1210,7 +1216,6 @@ function screw_info(spec, head="none", drive, thread="coarse", drive_size=undef,
is_def(type[3]) ? ["length",type[3]] : [], is_def(type[3]) ? ["length",type[3]] : [],
is_def(drive_info[1]) ? ["drive_size", drive_info[1]] : [] is_def(drive_info[1]) ? ["drive_size", drive_info[1]] : []
) )
,ff=echo(sd=screwdata,head=head)
) )
_oversize_screw(struct_set(screwdata, over_ride), threads_oversize=threads_oversize, head_oversize=head_oversize); _oversize_screw(struct_set(screwdata, over_ride), threads_oversize=threads_oversize, head_oversize=head_oversize);
@ -1951,7 +1956,6 @@ function _validate_screw_spec(spec) = let(
pitch = struct_val(spec,"pitch"), pitch = struct_val(spec,"pitch"),
pitchOK = is_undef(pitch) || (is_num(pitch) && pitch>=0), pitchOK = is_undef(pitch) || (is_num(pitch) && pitch>=0),
head = struct_val(spec,"head"), head = struct_val(spec,"head"),
f=echo(head=head),
headOK = head=="none" || headOK = head=="none" ||
(in_list(head, ["cheese","pan flat","pan round", "flat", "button","socket","socket ribbed", "fillister","round","hex"]) && (in_list(head, ["cheese","pan flat","pan round", "flat", "button","socket","socket ribbed", "fillister","round","hex"]) &&
_is_positive(struct_val(spec, "head_size"))), _is_positive(struct_val(spec, "head_size"))),
@ -2159,6 +2163,8 @@ proper support for nuts, nut traps
// shoulder_screw("iso,10,threads=0); // shoulder_screw("iso,10,threads=0);
// Example: Headless // Example: Headless
// shoulder_screw("iso", 16, length=20, head="none"); // shoulder_screw("iso", 16, length=20, head="none");
// Example: Changing head height
// shoulder_screw("iso", 16, length=20, head_size=[24,5]);
module shoulder_screw(s,d,length,head, thread_len, tolerance, head_size, drive, drive_size, thread, module shoulder_screw(s,d,length,head, thread_len, tolerance, head_size, drive, drive_size, thread,
undersize, shaft_undersize, head_undersize, shoulder_undersize=0, undersize, shaft_undersize, head_undersize, shoulder_undersize=0,
atype="screw", anchor=BOT, orient,spin) atype="screw", anchor=BOT, orient,spin)
@ -2245,8 +2251,9 @@ module shoulder_screw(s,d,length,head, thread_len, tolerance, head_size, drive,
headfields = concat( headfields = concat(
["head_size", final_headsize], ["head_size", final_headsize],
head=="flat" ? ["head_size_sharp", final_sharpsize, "head_height", head_height_flat] head=="flat" ? ["head_size_sharp", final_sharpsize, "head_height", head_height_flat]
: ["head_height", is_num(head_height_table)? head_height_table : ["head_height", is_vector(head_size) ? head_size[1]
:is_vector(head_size) ? head_size[1] : final_headsize/2 + 1.5], : is_num(head_height_table)? head_height_table
: final_headsize/2 + 1.5],
is_def(drive_depth) ? ["drive_depth", drive_depth] :[] is_def(drive_depth) ? ["drive_depth", drive_depth] :[]
); );
dummy3=assert(is_num(length) && length>0, "Must give a positive shoulder length"); dummy3=assert(is_num(length) && length>0, "Must give a positive shoulder length");