diff --git a/screw_drive.scad b/screw_drive.scad index 40c1a90..179d46c 100644 --- a/screw_drive.scad +++ b/screw_drive.scad @@ -330,10 +330,14 @@ module torx_mask(size, l=5, center, anchor, spin=0, orient=UP) { // robertson_mask(size, [extra]); // Description: // Creates a mask for creating a Robertson/Square drive recess given the drive size as an integer. -// The width of the recess will be oversized by `2 * $slop`. +// The width of the recess will be oversized by `2 * $slop`. Note that this model is based +// on an incomplete spec. https://www.aspenfasteners.com/content/pdf/square_drive_specification.pdf +// We determined the angle by doing print tests on a Prusa MK3S with $slop set to 0.05. // Arguments: // size = The size of the square drive, as an integer from 0 to 4. // extra = Extra length of drive mask to create. +// ang = taper angle of each face. Default: 2.5 +// $slop = enlarge recess by this twice amount. Default: 0 // Example: // robertson_mask(size=2); // Example: @@ -341,7 +345,7 @@ module torx_mask(size, l=5, center, anchor, spin=0, orient=UP) { // cyl(d1=2, d2=8, h=4, anchor=TOP); // robertson_mask(size=2); // } -module robertson_mask(size, extra=1) { +module robertson_mask(size, extra=1, ang=2.5) { assert(is_int(size) && size>=0 && size<=4); Mmin = [0.0696, 0.0900, 0.1110, 0.1315, 0.1895][size]; Mmax = [0.0710, 0.0910, 0.1126, 0.1330, 0.1910][size]; @@ -352,7 +356,6 @@ module robertson_mask(size, extra=1) { Fmin = [0.032, 0.057, 0.065, 0.085, 0.090][size]; Fmax = [0.038, 0.065, 0.075, 0.095, 0.100][size]; F = (Fmin + Fmax) / 2 * INCH; - ang = 4; h = T + extra; Mslop=M+2*$slop; down(T) { diff --git a/shapes3d.scad b/shapes3d.scad index 16240cc..ba5bf64 100644 --- a/shapes3d.scad +++ b/shapes3d.scad @@ -1696,7 +1696,7 @@ function spheroid(r, style="aligned", d, circum=false, anchor=CENTER, spin=0, or rr = circum? (r / cos(90/vsides) / cos(180/hsides)) : r, stagger = style=="stagger" ) - style=="icosa2" ? // subdivide faces of an icosahedron and project them onto a sphere + style=="icosa" ? // subdivide faces of an icosahedron and project them onto a sphere let( N = icosa_steps-1, // construct an icosahedron @@ -1744,32 +1744,6 @@ function spheroid(r, style="aligned", d, circum=false, anchor=CENTER, spin=0, or ) [ for (i=idx(meridians), j=[0:1:meridians[i]-1]) spherical_to_xyz(rr, j*360/meridians[i], i*180/(len(meridians)-1)) - ] : style=="icosa"? [ - for (tb=[0,1], j=[0,2], i = [0:1:4]) let( - theta0 = i*360/5, - theta1 = (i-0.5)*360/5, - theta2 = (i+0.5)*360/5, - phi0 = 180/3 * j, - phi1 = 180/3, - v0 = spherical_to_xyz(1,theta0,phi0), - v1 = spherical_to_xyz(1,theta1,phi1), - v2 = spherical_to_xyz(1,theta2,phi1), - ax0 = vector_axis(v0, v1), - ang0 = vector_angle(v0, v1), - ax1 = vector_axis(v0, v2), - ang1 = vector_angle(v0, v2) - ) - for (k = [0:1:icosa_steps]) let( - u = k/icosa_steps, - vv0 = rot(ang0*u, ax0, p=v0), - vv1 = rot(ang1*u, ax1, p=v0), - ax2 = vector_axis(vv0, vv1), - ang2 = vector_angle(vv0, vv1) - ) - for (l = [0:1:k]) let( - v = k? l/k : 0, - pt = rot(ang2*v, v=ax2, p=vv0) * rr * (tb? -1 : 1) - ) pt ] : assert(in_list(style,["orig","aligned","stagger","octa","icosa"])), lv = len(verts), faces = style=="orig"? [ @@ -1830,25 +1804,6 @@ function spheroid(r, style="aligned", d, circum=false, anchor=CENTER, spin=0, or [p5, p7, p8], if (k0) [v1-1,v1,v2], - [v1,v3,v2], - ], - faces2 = (tb+j)%2? [for (f=faces) reverse(f)] : faces - ) each faces2 ] : [] ) [reorient(anchor,spin,orient, r=r, p=verts), faces];