diff --git a/beziers.scad b/beziers.scad index 80a2c5c..e187885 100644 --- a/beziers.scad +++ b/beziers.scad @@ -1309,7 +1309,8 @@ function bezier_vnf_degenerate_patch(patch, splinesteps=16, reverse=false, retur // [ 5, 10], [ 0, 10] // ]; // debug_bezier(bez, N=3, width=0.5); -module debug_bezier(bezpath, width=1, N=3) { +module debug_bezier(bezpath, width=1, N=3) { + no_children($children); assert(is_path(bezpath)); assert(is_int(N)); assert(len(bezpath)%N == 1, str("A degree ",N," bezier path shound have a multiple of ",N," points in it, plus 1.")); @@ -1372,6 +1373,7 @@ module debug_bezier(bezpath, width=1, N=3) { // debug_bezier_patches(patches=[patch1, patch2], splinesteps=8, showcps=true); module debug_bezier_patches(patches=[], size, splinesteps=16, showcps=true, showdots=false, showpatch=true, convexity=10, style="default") { + no_children($children); assert(is_undef(size)||is_num(size)); assert(is_int(splinesteps) && splinesteps>0); assert(is_list(patches) && all([for (patch=patches) is_bezier_patch(patch)])); diff --git a/constants.scad b/constants.scad index 003434a..23f8acb 100644 --- a/constants.scad +++ b/constants.scad @@ -22,6 +22,11 @@ _UNDEF="LRG+HX7dy89RyHvDlAKvb9Y04OTuaikpx205CTh8BSI"; // `2*$slop` to each side. This should be done for both X and Y axes. The Z axis will require a // slop that depends on your layer height and bridging settings, and hole sizes. We leave that as // a more complicated exercise for the user. +// . +// Note that the slop value is accessed using the {{get_slop()}} function. This function provides +// the default value of 0 if you have not set `$slop`. This approach makes it possible for you to +// set `$slop` in your programs without experiencing peculiar OpenSCAD issues having to do with multiple +// definitions of the variable. If you write code that uses `$slop` be sure to reference it using {{get_slop()}}. // DefineHeader(NumList): Calibration // Calibration: To calibrate the `$slop` value for your printer, follow this procedure: // Print the Slop Calibration part from the example below. @@ -92,7 +97,14 @@ _UNDEF="LRG+HX7dy89RyHvDlAKvb9Y04OTuaikpx205CTh8BSI"; // text("gap", size=1.5, halign="center"); // } // } -$slop = 0.0; + +// Function: get_slop() +// Usage: +// slop = get_slop(); +// Description: +// Returns the current $slop value, or the default value if the user did not set $slop. +// Always acess the `$slop` variable using this function. +function get_slop() = is_undef($slop) ? 0 : $slop; // Constant: INCH diff --git a/cubetruss.scad b/cubetruss.scad index 3a8d85f..b64b6ec 100644 --- a/cubetruss.scad +++ b/cubetruss.scad @@ -204,11 +204,11 @@ module cubetruss_clip(extents=1, size, strut, clipthick, anchor=CENTER, spin=0, } } fwd(strut*3/2) { - cube([$slop, strut*3, size], center=true); + cube([get_slop(), strut*3, size], center=true); } } - right($slop/2+0.01) { - fwd(strut*1.25+$slop) { + right(get_slop()/2+0.01) { + fwd(strut*1.25+get_slop()) { yrot(-90) prismoid([clipheight-cliplen*2, strut/2], [clipheight-cliplen*2-2*clipsize, strut/2], h=clipsize+0.01); } } @@ -268,7 +268,7 @@ module cubetruss_foot(w=1, size, strut, clipthick, anchor=CENTER, spin=0, orient } // Horiz Wall Clips - up(clipthick+strut+$slop*2) { + up(clipthick+strut+get_slop()*2) { xcopies(w*(size-strut)+strut) { prismoid([clipsize*2, size/3.5], [0.1, size/3.5], h=clipsize*3, anchor=BOT); } @@ -280,19 +280,19 @@ module cubetruss_foot(w=1, size, strut, clipthick, anchor=CENTER, spin=0, orient difference() { // Start with octagon to fit sides. up(clipthick-0.01) { - zrot(180/8) cylinder(h=strut, d1=cyld-4*$slop, d2=cyld-4*$slop-1, center=false, $fn=8); + zrot(180/8) cylinder(h=strut, d1=cyld-4*get_slop(), d2=cyld-4*get_slop()-1, center=false, $fn=8); } // Bevel to fit. up(clipthick+strut) { - ycopies(size-2*strut-4*$slop) { + ycopies(size-2*strut-4*get_slop()) { chamfer_edge_mask(l=size-strut, chamfer=strut*2/3, orient=RIGHT); } } // Cut out X for possible top mount. zrot_copies([-45, 45]) { - cube([size*3, strut/sqrt(2)+2*$slop, size*3], center=true); + cube([size*3, strut/sqrt(2)+2*get_slop(), size*3], center=true); } } } @@ -354,7 +354,7 @@ module cubetruss_joiner(w=1, vert=true, size, strut, clipthick, anchor=CENTER, s // Vert Wall Clips up(size/2) { xflip_copy(offset=(w*(size-strut)+strut+0.02)/2) { - yflip_copy(offset=strut+$slop/2) { + yflip_copy(offset=strut+get_slop()/2) { yrot(-90) { back_half() { prismoid([size/3.5, clipthick*2], [size/3.5-4*2*clipsize, 0.1], h=2*clipsize, anchor=BOT); @@ -393,15 +393,15 @@ module cubetruss_uclip(dual=true, size, strut, clipthick, anchor=CENTER, spin=0, strut = is_undef(strut)? $cubetruss_strut_size : strut; clipthick = is_undef(clipthick)? $cubetruss_clip_thickness : clipthick; clipsize = 0.5; - s = [(dual?2:1)*strut+2*clipthick+$slop, strut+2*clipthick, size/3.5]; + s = [(dual?2:1)*strut+2*clipthick+get_slop(), strut+2*clipthick, size/3.5]; attachable(anchor,spin,orient, size=s) { union() { difference() { cube(s, center=true); - back(clipthick) cube([(dual?2:1)*strut+$slop, strut+2*clipthick, size+1], center=true); + back(clipthick) cube([(dual?2:1)*strut+get_slop(), strut+2*clipthick, size+1], center=true); } - back((strut+$slop)/2) { - xflip_copy(offset=(dual?1:0.5)*strut+$slop/2) { + back((strut+get_slop())/2) { + xflip_copy(offset=(dual?1:0.5)*strut+get_slop()/2) { yrot(-90) { back_half() { prismoid([size/3.5, clipthick*1.87], [size/3.5, 0.1], h=clipsize, anchor=BOT); diff --git a/drawing.scad b/drawing.scad index 6310afd..953ef0e 100644 --- a/drawing.scad +++ b/drawing.scad @@ -1127,6 +1127,7 @@ function _turtle_command(command, parm, parm2, state, index) = // ); module debug_polygon(points, paths, vertices=true, edges=true, convexity=2, size=1) { + no_children($children); paths = is_undef(paths)? [count(points)] : is_num(paths[0])? [paths] : paths; diff --git a/gears.scad b/gears.scad index a24b8c6..bc616bf 100644 --- a/gears.scad +++ b/gears.scad @@ -1202,6 +1202,7 @@ module _gear_tooth_profile( center = false, mod ) { + no_children($children); pitch = is_undef(mod) ? pitch : pitch_value(mod); r = _root_radius(pitch, teeth, clearance, interior); fwd(r) diff --git a/hingesnaps.scad b/hingesnaps.scad index 5eafb7a..ad91a38 100644 --- a/hingesnaps.scad +++ b/hingesnaps.scad @@ -56,7 +56,7 @@ // } module apply_folding_hinges_and_snaps(thick, foldangle=90, hinges=[], snaps=[], sockets=[], snaplen=5, snapdiam=5, hingegap=undef, layerheight=0.2) { - hingegap = default(hingegap, layerheight)+2*$slop; + hingegap = default(hingegap, layerheight)+2*get_slop(); difference() { children(); for (hinge = hinges) { @@ -111,7 +111,7 @@ module apply_folding_hinges_and_snaps(thick, foldangle=90, hinges=[], snaps=[], // folding_hinge_mask(l=100, thick=3, foldangle=60); module folding_hinge_mask(l, thick, layerheight=0.2, foldangle=90, hingegap=undef, anchor=CENTER, spin=0, orient=UP) { - hingegap = default(hingegap, layerheight)+2*$slop; + hingegap = default(hingegap, layerheight)+2*get_slop(); size = [l, hingegap, 2*thick]; size2 = [l, hingegap+2*thick*tan(foldangle/2)]; attachable(anchor,spin,orient, size=size, size2=size2) { @@ -141,7 +141,7 @@ module folding_hinge_mask(l, thick, layerheight=0.2, foldangle=90, hingegap=unde // snap_lock(thick=3, foldangle=60); module snap_lock(thick, snaplen=5, snapdiam=5, layerheight=0.2, foldangle=90, hingegap=undef, anchor=CENTER, spin=0, orient=UP) { - hingegap = default(hingegap, layerheight)+2*$slop; + hingegap = default(hingegap, layerheight)+2*get_slop(); snap_x = (snapdiam/2) / tan(foldangle/2) + (thick-2*layerheight)/tan(foldangle/2) + hingegap/2; size = [snaplen, snapdiam, 2*thick]; attachable(anchor,spin,orient, size=size) { @@ -176,12 +176,12 @@ module snap_lock(thick, snaplen=5, snapdiam=5, layerheight=0.2, foldangle=90, hi // snap_socket(thick=3, foldangle=60); module snap_socket(thick, snaplen=5, snapdiam=5, layerheight=0.2, foldangle=90, hingegap=undef, anchor=CENTER, spin=0, orient=UP) { - hingegap = default(hingegap, layerheight)+2*$slop; + hingegap = default(hingegap, layerheight)+2*get_slop(); snap_x = (snapdiam/2) / tan(foldangle/2) + (thick-2*layerheight)/tan(foldangle/2) + hingegap/2; size = [snaplen, snapdiam, 2*thick]; attachable(anchor,spin,orient, size=size) { fwd(snap_x) { - zrot_copies([0,180], r=snaplen+$slop) { + zrot_copies([0,180], r=snaplen+get_slop()) { diff("divot") cube([snaplen, snapdiam, snapdiam/2+thick], anchor=BOT) { attach(TOP) xcyl(l=snaplen, d=snapdiam, $fn=16); diff --git a/joiners.scad b/joiners.scad index b6c8ebb..084c0fc 100644 --- a/joiners.scad +++ b/joiners.scad @@ -107,7 +107,7 @@ module half_joiner(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, anchor= cube([w+1, guide_width+1, h+1], anchor=FWD+BOT); // Clear sides - xcopies(2*w*2/3-$slop*2) { + xcopies(2*w*2/3-get_slop()*2) { cube([w, guide_width, h/3], center=true); fwd(guide_width/2) yrot_copies(n=2) @@ -119,7 +119,7 @@ module half_joiner(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, anchor= // Guide ridges. if (guides == true) { - xcopies(w/3-$slop*2) { + xcopies(w/3-get_slop()*2) { // Guide ridge. fwd(0.05/2) { scale([0.75, 1, 2]) yrot(45) @@ -325,7 +325,7 @@ module joiner_pair_clear(spacing=100, n=2, h=40, w=10, a=30, clearance=0, overla // anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER` // spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP` -// $slop = Printer specific slop value to make parts fit more closely. +// get_slop() = Printer specific slop value to make parts fit more closely. // Example(FlatSpin,VPD=200): // joiner_pair(spacing=50, l=10); // Examples: @@ -540,7 +540,7 @@ module dovetail(gender, width, height, slide, h, w, angle, slope, taper, back_wi assert(count3<=1 || (radius==0 && chamfer==0), "Do not specify both chamfer and radius"); slope = is_def(slope) ? slope : is_def(angle) ? 1/tan(angle) : 6; - extra_slop = gender == "female" ? 2*$slop : 0; + extra_slop = gender == "female" ? 2*get_slop() : 0; width = w + extra_slop; height = h + extra_slop; back_width = u_add(back_width, extra_slop); diff --git a/nema_steppers.scad b/nema_steppers.scad index 085fbfd..e1341ef 100644 --- a/nema_steppers.scad +++ b/nema_steppers.scad @@ -469,9 +469,9 @@ module nema34_stepper(h=75, shaft=12.7, shaft_len=32, anchor=TOP, spin=0, orient module nema_mount_holes(size=17, depth=5, l=5, anchor=CENTER, spin=0, orient=UP) { motor_width = nema_motor_width(size); - plinth_diam = nema_motor_plinth_diam(size)+$slop; + plinth_diam = nema_motor_plinth_diam(size)+get_slop(); screw_spacing = nema_motor_screw_spacing(size); - screw_size = nema_motor_screw_size(size)+$slop; + screw_size = nema_motor_screw_size(size)+get_slop(); anchors = [ named_anchor("screw1", [+screw_spacing/2, +screw_spacing/2, depth/2]), diff --git a/partitions.scad b/partitions.scad index 77f750f..55ccee1 100644 --- a/partitions.scad +++ b/partitions.scad @@ -432,13 +432,13 @@ module partition_mask(l=100, w=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, cutsize = is_vector(cutsize)? point2d(cutsize) : [cutsize*2, cutsize]; path = _partition_cutpath(l, h, cutsize, cutpath, gap); midpath = select(path,1,-2); - sizepath = concat([path[0]+[-$slop,0]], midpath, [last(path)+[$slop,0]], [[+(l/2+$slop), (w+$slop)*(inverse?-1:1)], [-(l/2+$slop), (w+$slop)*(inverse?-1:1)]]); + sizepath = concat([path[0]+[-get_slop(),0]], midpath, [last(path)+[get_slop(),0]], [[+(l/2+get_slop()), (w+get_slop())*(inverse?-1:1)], [-(l/2+get_slop()), (w+get_slop())*(inverse?-1:1)]]); bnds = pointlist_bounds(sizepath); fullpath = concat(path, [[last(path).x, w*(inverse?-1:1)], [path[0].x, w*(inverse?-1:1)]]); attachable(anchor,spin,orient, size=point3d(bnds[1]-bnds[0],h)) { linear_extrude(height=h, center=true, convexity=10) { intersection() { - offset(delta=-$slop) polygon(fullpath); + offset(delta=-get_slop()) polygon(fullpath); square([l, w*2], center=true); } } @@ -483,7 +483,7 @@ module partition_cut_mask(l=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, anc path = _partition_cutpath(l, h, cutsize, cutpath, gap); attachable(anchor,spin,orient, size=[l,cutsize.y,h]) { linear_extrude(height=h, center=true, convexity=10) { - stroke(path, width=max(0.1, $slop*2)); + stroke(path, width=max(0.1, get_slop()*2)); } children(); } diff --git a/screw_drive.scad b/screw_drive.scad index 435029d..d04378d 100644 --- a/screw_drive.scad +++ b/screw_drive.scad @@ -164,6 +164,7 @@ module torx_mask(size, l=5, center, anchor, spin=0, orient=UP) { // Example(2D): // torx_mask2d(size=30, $fa=1, $fs=1); module torx_mask2d(size) { + no_children($children); od = torx_diam(size); id = _torx_inner_diam(size); tip = _torx_tip_radius(size); @@ -360,7 +361,7 @@ module robertson_mask(size, extra=1, ang=2.5) { Fmax = [0.038, 0.065, 0.075, 0.095, 0.100][size]; F = (Fmin + Fmax) / 2 * INCH; h = T + extra; - Mslop=M+2*$slop; + Mslop=M+2*get_slop(); down(T) { intersection(){ Mtop = Mslop + 2*adj_ang_to_opp(F+extra,ang); diff --git a/sliders.scad b/sliders.scad index a983d9f..8b2ab89 100644 --- a/sliders.scad +++ b/sliders.scad @@ -41,16 +41,16 @@ module slider(l=30, w=10, h=10, base=10, wall=5, ang=30, anchor=BOTTOM, spin=0, zrot(90) down(base+h/2) { // Base - cuboid([full_width, l, base-$slop], chamfer=2, edges=[FRONT,BACK], except_edges=BOT, anchor=BOTTOM); + cuboid([full_width, l, base-get_slop()], chamfer=2, edges=[FRONT,BACK], except_edges=BOT, anchor=BOTTOM); // Wall - xflip_copy(offset=w/2+$slop) { + xflip_copy(offset=w/2+get_slop()) { cuboid([wall, l, full_height], chamfer=2, edges=RIGHT, except_edges=BOT, anchor=BOTTOM+LEFT); } // Sliders up(base+h/2) { - xflip_copy(offset=w/2+$slop+0.02) { + xflip_copy(offset=w/2+get_slop()+0.02) { bev_h = h/2*tan(ang); prismoid([h, l], [0, l-w], h=bev_h+0.01, orient=LEFT, anchor=BOT); } diff --git a/threading.scad b/threading.scad index bc97217..361983a 100644 --- a/threading.scad +++ b/threading.scad @@ -539,7 +539,7 @@ module acme_threaded_nut( // anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER` // spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP` -// $slop = The printer-specific slop value, which adds clearance (`4*$slop`) to internal threads.p +// $slop = The printer-specific slop value, which adds clearance (`4*$slop`) to internal threads. // Example(2D): The straight gray rectangle reveals the tapered threads. // projection(cut=true) npt_threaded_rod(size=1/4, orient=BACK); // right(.533*INCH/2) color("gray") rect([2,0.5946*INCH],anchor=LEFT); @@ -1075,7 +1075,7 @@ module generic_threaded_rod( r2 = get_radius(d1=d2, d=d); sides = quantup(segs(max(r1,r2)), starts); rsc = internal? (1/cos(180/sides)) : 1; - islop = internal? 2*$slop : 0; + islop = internal? 2*get_slop() : 0; _r1 = r1 * rsc + islop; _r2 = r2 * rsc + islop; threads = quantup(l/pitch+2,1); // Was quantup(1/pitch+2,2*starts);