From 21945263b63ff65b0e9577b72cb6cb100225a7e2 Mon Sep 17 00:00:00 2001 From: Adrian Mariano Date: Wed, 9 Nov 2022 22:22:30 -0500 Subject: [PATCH] Add $slop docs to modules that use $slop, fix stroke to accept singletons, and fix cylinder to handle zero length case --- attachments.scad | 2 +- cubetruss.scad | 14 +++++---- drawing.scad | 75 ++++++++++++++++++++++++++-------------------- hingesnaps.scad | 13 +++++--- nema_steppers.scad | 5 ++-- partitions.scad | 10 ++++--- screw_drive.scad | 3 +- shapes3d.scad | 2 ++ 8 files changed, 74 insertions(+), 50 deletions(-) diff --git a/attachments.scad b/attachments.scad index 0636c0a..03af282 100644 --- a/attachments.scad +++ b/attachments.scad @@ -2469,7 +2469,7 @@ function _find_anchor(anchor, geom) = bot = point3d(v_mul(r1,axy), -l/2), top = point3d(v_mul(r2,axy)+shift, l/2), pos = point3d(cp) + lerp(bot,top,u) + offset, - sidevec = rot(from=UP, to=top-bot, p=point3d(axy)), + sidevec = rot(from=UP, to=top==bot?UP:top-bot, p=point3d(axy)), vvec = anch==CENTER? UP : unit([0,0,anch.z],UP), vec = anch==CENTER? CENTER : approx(axy,[0,0])? unit(anch,UP) : diff --git a/cubetruss.scad b/cubetruss.scad index f3e03a4..02d8f19 100644 --- a/cubetruss.scad +++ b/cubetruss.scad @@ -105,7 +105,7 @@ module cubetruss_segment(size, strut, bracing, anchor=CENTER, spin=0, orient=UP) // Module: cubetruss_support() // Usage: -// cubetruss_support([size], [strut]); +// cubetruss_support([size], [strut], [extents], [anchor], [spin], [orient]) [ATTACHMENTS]; // Description: // Creates a single cubetruss support. // Arguments: @@ -166,7 +166,7 @@ module cubetruss_support(size, strut, extents=1, anchor=CENTER, spin=0, orient=U // Module: cubetruss_clip() // Usage: -// cubetruss_clip(extents, [size], [strut], [clipthick]); +// cubetruss_clip(extents, [size], [strut], [clipthick], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a pair of clips to add onto the end of a truss. // Arguments: @@ -175,6 +175,7 @@ module cubetruss_support(size, strut, extents=1, anchor=CENTER, spin=0, orient=U // strut = The width of the struts on the cubetruss cubes. Default: `$cubetruss_strut_size` (usually 3) // clipthick = The thickness of the clip. Default: `$cubetruss_clip_thickness` (usually 1.6) // --- +// $slop = allowance for printer overextrusion // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` @@ -230,7 +231,7 @@ module cubetruss_clip(extents=1, size, strut, clipthick, anchor=CENTER, spin=0, // Module: cubetruss_foot() // Usage: -// cubetruss_foot(w, [size], [strut], [clipthick]); +// cubetruss_foot(w, [size], [strut], [clipthick], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a foot that can be clipped onto the bottom of a truss for support. // Arguments: @@ -239,6 +240,7 @@ module cubetruss_clip(extents=1, size, strut, clipthick, anchor=CENTER, spin=0, // strut = The width of the struts on the cubetruss cubes. Default: `$cubetruss_strut_size` (usually 3) // clipthick = The thickness of the clips. Default: `$cubetruss_clip_thickness` (usually 1.6) // --- +// $slop = make fit looser to allow for printer overextrusion // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` @@ -306,7 +308,7 @@ module cubetruss_foot(w=1, size, strut, clipthick, anchor=CENTER, spin=0, orient // Module: cubetruss_joiner() // Usage: -// cubetruss_joiner([w], [vert], [size], [strut], [clipthick]); +// cubetruss_joiner([w], [vert], [size], [strut], [clipthick], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a part to join two cubetruss trusses end-to-end. // Arguments: @@ -316,6 +318,7 @@ module cubetruss_foot(w=1, size, strut, clipthick, anchor=CENTER, spin=0, orient // strut = The width of the struts on the cubetruss cubes. Default: `$cubetruss_strut_size` (usually 3) // clipthick = The thickness of the clips. Default: `$cubetruss_clip_thickness` (usually 1.6) // --- +// $slop = Make fit looser by this amount to allow for printer overextrusion // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` @@ -373,7 +376,7 @@ module cubetruss_joiner(w=1, vert=true, size, strut, clipthick, anchor=CENTER, s // Module: cubetruss_uclip() // Usage: -// cubetruss_uclip(dual, [size], [strut], [clipthick]); +// cubetruss_uclip(dual, [size], [strut], [clipthick], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a small clip that can snap around one or two adjacent struts. // Arguments: @@ -382,6 +385,7 @@ module cubetruss_joiner(w=1, vert=true, size, strut, clipthick, anchor=CENTER, s // strut = The width of the struts on the cubetruss cubes. Default: `$cubetruss_strut_size` (usually 3) // clipthick = The thickness of the clips. Default: `$cubetruss_clip_thickness` (usually 1.6) // --- +// $slop = Make fit looser by this amount // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` diff --git a/drawing.scad b/drawing.scad index 92ec973..3c92f1b 100644 --- a/drawing.scad +++ b/drawing.scad @@ -25,7 +25,10 @@ // Draws a 2D or 3D path with a given line width. Joints and each endcap can be replaced with // various marker shapes, and can be assigned different colors. If passed a region instead of // a path, draws each path in the region as a closed polygon by default. If `closed=false` is -// given with a region, each subpath is drawn as an un-closed line path. +// given with a region or list of paths, then each path is drawn without the closing line segment. +// To facilitate debugging, stroke() accepts "paths" that have a single point. These are drawn with +// the style of endcap1, but have their own scale parameter, `singleton_scale`, which defaults to 2 +// so that singleton dots with endcap "round" are clearly visible. // Figure(Med,NoAxes,2D,VPR=[0,0,0],VPD=250): Endcap Types // cap_pairs = [ // ["butt", "chisel" ], @@ -84,6 +87,7 @@ // endcap_color2 = If given, sets the color of the ending endcap. Overrides `color=`, `dots_color=`, and `endcap_color=`. // joint_color = If given, sets the color of the joints. Overrides `color=` and `dots_color=`. // dots_color = If given, sets the color of the endcaps and joints. Overrides `color=`. +// singleton_scale = Change the scale of the endcap shape drawn for singleton paths. Default: 2. // convexity = Max number of times a line could intersect a wall of an endcap. // Example(2D): Drawing a Path // path = [[0,100], [100,100], [200,0], [100,-100], [100,0]]; @@ -100,7 +104,7 @@ // Example(2D): Mixed Endcaps // path = [[0,100], [100,100], [200,0], [100,-100], [100,0]]; // stroke(path, width=10, endcap1="tail2", endcap2="arrow2"); -// Example(2D): Plotting Points +// Example(2D): Plotting Points. Setting endcap_angle to zero results in the weird arrow orientation. // path = [for (a=[0:30:360]) [a-180, 60*sin(a)]]; // stroke(path, width=3, joints="diamond", endcaps="arrow2", endcap_angle=0, endcap_width=5, joint_angle=0, joint_width=5); // Example(2D): Joints and Endcaps @@ -147,6 +151,12 @@ // ] // ]; // stroke(paths, closed=false, width=5); +// Example(2D): Paths with a singleton. Note that the singleton is not a single point, but a list containing a single point. +// stroke([ +// [[0,0],[1,1]], +// [[1.5,1.5]], +// [[2,2],[3,3]] +// ],width=0.2,closed=false,$fn=16); function stroke( path, width=1, closed, endcaps, endcap1, endcap2, joints, dots, @@ -155,7 +165,7 @@ function stroke( endcap_extent, endcap_extent1, endcap_extent2, joint_extent, dots_extent, endcap_angle, endcap_angle1, endcap_angle2, joint_angle, dots_angle, endcap_color, endcap_color1, endcap_color2, joint_color, dots_color, color, - trim, trim1, trim2, + trim, trim1, trim2, singleton_scale=2, convexity=10 ) = no_function("stroke"); @@ -168,7 +178,7 @@ module stroke( endcap_extent, endcap_extent1, endcap_extent2, joint_extent, dots_extent, endcap_angle, endcap_angle1, endcap_angle2, joint_angle, dots_angle, endcap_color, endcap_color1, endcap_color2, joint_color, dots_color, color, - trim, trim1, trim2, + trim, trim1, trim2, singleton_scale=2, convexity=10 ) { no_children($children); @@ -201,8 +211,8 @@ module stroke( assert(false, str("Invalid cap or joint: ",cap)); function _shape_path(cap,linewidth,w,l,l2) = ( - (cap=="butt" || cap==false || cap==undef)? [] : - (cap=="round" || cap==true)? scale([w,l], p=circle(d=1, $fn=max(8, segs(w/2)))) : + cap=="butt" || cap==false || cap==undef ? [] : + cap=="round" || cap==true ? scale([w,l], p=circle(d=1, $fn=max(8, segs(w/2)))) : cap=="chisel"? scale([w,l], p=circle(d=1,$fn=4)) : cap=="diamond"? circle(d=w,$fn=4) : cap=="square"? scale([w,l], p=square(1,center=true)) : @@ -239,47 +249,47 @@ module stroke( endcap_width1 = first_defined([endcap_width1, endcap_width, dots_width, endcap1_dflts[0]]); endcap_width2 = first_defined([endcap_width2, endcap_width, dots_width, endcap2_dflts[0]]); joint_width = first_defined([joint_width, dots_width, joint_dflts[0]]); - check3 = - assert(is_num(endcap_width1)) - assert(is_num(endcap_width2)) - assert(is_num(joint_width)); endcap_length1 = first_defined([endcap_length1, endcap_length, dots_length, endcap1_dflts[1]*endcap_width1]); endcap_length2 = first_defined([endcap_length2, endcap_length, dots_length, endcap2_dflts[1]*endcap_width2]); joint_length = first_defined([joint_length, dots_length, joint_dflts[1]*joint_width]); - check4 = - assert(is_num(endcap_length1)) - assert(is_num(endcap_length2)) - assert(is_num(joint_length)); endcap_extent1 = first_defined([endcap_extent1, endcap_extent, dots_extent, endcap1_dflts[2]*endcap_width1]); endcap_extent2 = first_defined([endcap_extent2, endcap_extent, dots_extent, endcap2_dflts[2]*endcap_width2]); joint_extent = first_defined([joint_extent, dots_extent, joint_dflts[2]*joint_width]); - check5 = - assert(is_num(endcap_extent1)) - assert(is_num(endcap_extent2)) - assert(is_num(joint_extent)); endcap_angle1 = first_defined([endcap_angle1, endcap_angle, dots_angle]); endcap_angle2 = first_defined([endcap_angle2, endcap_angle, dots_angle]); joint_angle = first_defined([joint_angle, dots_angle]); - check6 = - assert(is_undef(endcap_angle1)||is_num(endcap_angle1)) - assert(is_undef(endcap_angle2)||is_num(endcap_angle2)) - assert(is_undef(joint_angle)||is_num(joint_angle)); - + + check3 = + assert(all_nonnegative([endcap_length1])) + assert(all_nonnegative([endcap_length2])) + assert(all_nonnegative([joint_length])); + assert(all_nonnegative([endcap_extent1])) + assert(all_nonnegative([endcap_extent2])) + assert(all_nonnegative([joint_extent])); + assert(is_undef(endcap_angle1)||is_finite(endcap_angle1)) + assert(is_undef(endcap_angle2)||is_finite(endcap_angle2)) + assert(is_undef(joint_angle)||is_finite(joint_angle)) + assert(all_positive([singleton_scale])) + assert(all_positive(width)); + endcap_color1 = first_defined([endcap_color1, endcap_color, dots_color, color]); endcap_color2 = first_defined([endcap_color2, endcap_color, dots_color, color]); joint_color = first_defined([joint_color, dots_color, color]); - paths = force_region(path); - check7 = assert(is_region(paths),"The path argument must be a list of 2D or 3D points, or a region."); + + // We want to allow "paths" with length 1, so we can't use the normal path/region checks + paths = is_matrix(path) ? [path] : path; + assert(is_list(paths),"The path argument must be a list of 2D or 3D points, or a region."); for (path = paths) { - assert(len(path)==1 || is_path(path,[2,3]), "The path argument must be a list of 2D or 3D points, or a region."); + pathvalid = is_path(path,[2,3]) || same_shape(path,[[0,0]]) || same_shape(path,[[0,0,0]]); + assert(pathvalid,"The path argument must be a list of 2D or 3D points, or a region."); path = deduplicate( closed? close_path(path) : path ); - check8 = assert(is_num(width) || (is_vector(width) && len(width)==len(path))); + check4 = assert(is_num(width) || len(width)==len(path), + "width must be a number or a vector the same length as the path (or all components of a region)"); width = is_num(width)? [for (x=path) width] : width; - check9 = assert(all([for (w=width) w>0])); endcap_shape1 = _shape_path(endcap1, width[0], endcap_width1, endcap_length1, endcap_extent1); endcap_shape2 = _shape_path(endcap2, last(width), endcap_width2, endcap_length2, endcap_extent2); @@ -290,7 +300,6 @@ module stroke( (endcap1=="arrow2")? endcap_length1*3/4 : 0 ]); - check10 = assert(is_num(trim1)); trim2 = last(width) * first_defined([ trim2, trim, @@ -298,8 +307,8 @@ module stroke( (endcap2=="arrow2")? endcap_length2*3/4 : 0 ]); - check11 = assert(is_num(trim2)); - + check10 = assert(is_finite(trim1)) + assert(is_finite(trim2)); if (len(path) == 1) { if (len(path[0]) == 2) { @@ -307,7 +316,7 @@ module stroke( setcolor(endcap_color1) { translate(path[0]) { mat = is_undef(endcap_angle1)? ident(3) : zrot(endcap_angle1); - multmatrix(mat) polygon(endcap_shape1); + multmatrix(mat) polygon(scale(singleton_scale,endcap_shape1)); } } } else { @@ -685,7 +694,7 @@ function arc(n, r, angle, d, cp, points, corner, width, thickness, start, wedge= is_def(angle)? ( let( parmok = !any_defined([points,width,thickness]) && - ((is_vector(angle,2) && is_undef(start)) || is_num(angle)) + ((is_vector(angle,2) && is_undef(start)) || is_finite(angle)) ) assert(parmok,"Invalid parameters in arc") let( diff --git a/hingesnaps.scad b/hingesnaps.scad index b437b6d..d756d79 100644 --- a/hingesnaps.scad +++ b/hingesnaps.scad @@ -13,7 +13,7 @@ // Module: apply_folding_hinges_and_snaps() // Usage: -// apply_folding_hinges_and_snaps(thick, [foldangle=], [hinges=], [snaps=], [sockets=], [snaplen=], [snapdiam=], [hingegap=], [layerheight=]) CHILDREN; +// apply_folding_hinges_and_snaps(thick, [foldangle=], [hinges=], [snaps=], [sockets=], [snaplen=], [snapdiam=], [hingegap=], [layerheight=], [$slop=]) CHILDREN; // Description: // Adds snaplocks and create hinges in children at the given positions. // Arguments: @@ -26,6 +26,8 @@ // snapdiam = Diameter/width of locking snaps. // hingegap = Size in mm of the gap at the bottom of the hinge, to make room for folding. // layerheight = The expected printing layer height in mm. +// --- +// $slop = increase hinge gap by twice this amount // Example(Med): // size=100; // apply_folding_hinges_and_snaps( @@ -93,7 +95,7 @@ module apply_folding_hinges_and_snaps(thick, foldangle=90, hinges=[], snaps=[], // Module: folding_hinge_mask() // Usage: -// folding_hinge_mask(l, thick, [layerheight=], [foldangle=], [hingegap=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; +// folding_hinge_mask(l, thick, [layerheight=], [foldangle=], [hingegap=], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a mask to be differenced away from a plate to create a foldable hinge. // Center the mask at the bottom of the plate you want to make a hinge in. @@ -105,6 +107,7 @@ module apply_folding_hinges_and_snaps(thick, foldangle=90, hinges=[], snaps=[], // layerheight = The expected printing layer height in mm. // foldangle = The interior angle in degrees of the joint to be created with the hinge. Default: 90 // hingegap = Size in mm of the gap at the bottom of the hinge, to make room for folding. +// $slop = Increase size of hinge gap by double this amount // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` @@ -124,7 +127,7 @@ module folding_hinge_mask(l, thick, layerheight=0.2, foldangle=90, hingegap=unde // Module: snap_lock() // Usage: -// snap_lock(thick, [snaplen=], [snapdiam=], [layerheight=], [foldangle=], [hingegap=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; +// snap_lock(thick, [snaplen=], [snapdiam=], [layerheight=], [foldangle=], [hingegap=], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates the central snaplock part. // Arguments: @@ -135,6 +138,7 @@ module folding_hinge_mask(l, thick, layerheight=0.2, foldangle=90, hingegap=unde // layerheight = The expected printing layer height in mm. // foldangle = The interior angle in degrees of the joint to be created with the hinge. Default: 90 // hingegap = Size in mm of the gap at the bottom of the hinge, to make room for folding. +// $slop = increase size of hinge gap by double this amount // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` @@ -159,7 +163,7 @@ module snap_lock(thick, snaplen=5, snapdiam=5, layerheight=0.2, foldangle=90, hi // Module: snap_socket() // Usage: -// snap_socket(thick, [snaplen=], [snapdiam=], [layerheight=], [foldangle=], [hingegap=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; +// snap_socket(thick, [snaplen=], [snapdiam=], [layerheight=], [foldangle=], [hingegap=], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates the outside snaplock socketed part. // Arguments: @@ -170,6 +174,7 @@ module snap_lock(thick, snaplen=5, snapdiam=5, layerheight=0.2, foldangle=90, hi // layerheight = The expected printing layer height in mm. // foldangle = The interior angle in degrees of the joint to be created with the hinge. Default: 90 // hingegap = Size in mm of the gap at the bottom of the hinge, to make room for folding. +// $slop = Increase size of hinge gap by double this amount // 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. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` diff --git a/nema_steppers.scad b/nema_steppers.scad index 557297d..e8d41f1 100644 --- a/nema_steppers.scad +++ b/nema_steppers.scad @@ -14,7 +14,7 @@ // Module: nema_stepper_motor() // Usage: -// nema_stepper_motor(size, h, shaft_len, ...) [attachments]; +// nema_stepper_motor(size, h, shaft_len, [$slop=], ...) [ATTACHMENTS]; // Topics: Parts, Motors // Description: // Creates a model of a NEMA standard stepper motor. @@ -25,6 +25,7 @@ // --- // details = If false, creates a very rough motor shape, suitable for using as a mask. Default: true // atype = The attachment set type to use when anchoring. Default: `"body"` +// $slop = If details is false then increase size of the model by double this amount (for use as a mask) // anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `TOP` // 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` @@ -117,7 +118,7 @@ module nema_stepper_motor(size=17, h=24, shaft_len=20, details=true, atype="body // Module: nema_mount_mask() // Usage: -// nema_mount_mask(size, depth, l, ...); +// nema_mount_mask(size, depth, l, [$slop], ...); // Topics: Parts, Motors // Description: Creates a mask to use when making standard NEMA stepper motor mounts. // Arguments: diff --git a/partitions.scad b/partitions.scad index 55ccee1..f8bc29b 100644 --- a/partitions.scad +++ b/partitions.scad @@ -399,7 +399,7 @@ function _partition_cutpath(l, h, cutsize, cutpath, gap) = // Module: partition_mask() // Usage: -// partition_mask(l, w, h, [cutsize], [cutpath], [gap], [inverse], [spin], [orient]) [ATTACHMENTS]; +// partition_mask(l, w, h, [cutsize], [cutpath], [gap], [inverse], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a mask that you can use to difference or intersect with an object to remove half of it, leaving behind a side designed to allow assembly of the sub-parts. // Arguments: @@ -449,7 +449,7 @@ module partition_mask(l=100, w=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, // Module: partition_cut_mask() // Usage: -// partition_cut_mask(l, w, h, [cutsize], [cutpath], [gap], [inverse], [spin], [orient]) [ATTACHMENTS]; +// partition_cut_mask(l, w, h, [cutsize], [cutpath], [gap], [inverse], [$slop=], [anchor=], [spin=], [orient=]) [ATTACHMENTS]; // Description: // Creates a mask that you can use to difference with an object to cut it into two sub-parts that can be assembled. // The `$slop` value is important to get the proper fit and should probably be smaller than 0.2. The examples below @@ -463,7 +463,7 @@ module partition_mask(l=100, w=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, // gap = Empty gaps between cutpath iterations. Default: 0 // spin = Rotate this many degrees around the Z axis. See [spin](attachments.scad#subsection-spin). Default: `0` // orient = Vector to rotate top towards. See [orient](attachments.scad#subsection-orient). Default: `UP` -// $slop = The width of the cut mask, to correct for printer-specific fitting. Min: 0.05. +// $slop = The width of the cut mask, to correct for printer-specific fitting. // Examples: // partition_cut_mask(gap=0, cutpath="dovetail"); // partition_cut_mask(gap=30, cutpath="dovetail"); @@ -492,7 +492,7 @@ module partition_cut_mask(l=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, anc // Module: partition() // Usage: -// partition(size, [spread], [cutsize], [cutpath], [gap], [spin]) CHILDREN; +// partition(size, [spread], [cutsize], [cutpath], [gap], [spin], [$slop=]) CHILDREN; // Description: // Partitions an object into two parts, spread apart a small distance, with matched joining edges. // Arguments: @@ -502,6 +502,8 @@ module partition_cut_mask(l=100, h=100, cutsize=10, cutpath="jigsaw", gap=0, anc // cutpath = The cutpath to use. Standard named paths are "flat", "sawtooth", "sinewave", "comb", "finger", "dovetail", "hammerhead", and "jigsaw". Alternatively, you can give a cutpath as a 2D path, where X is between 0 and 1, and Y is between -0.5 and 0.5. // gap = Empty gaps between cutpath iterations. Default: 0 // spin = Rotate this many degrees around the Z axis. See [spin](attachments.scad#subsection-spin). Default: `0` +// --- +// $slop = Extra gap to leave to correct for printer-specific fitting. // Examples(Med): // partition(spread=12, cutpath="dovetail") cylinder(h=50, d=80, center=false); // partition(spread=12, gap=30, cutpath="dovetail") cylinder(h=50, d=80, center=false); diff --git a/screw_drive.scad b/screw_drive.scad index 39bb815..b570a13 100644 --- a/screw_drive.scad +++ b/screw_drive.scad @@ -285,7 +285,7 @@ function torx_depth(size) = torx_info(size)[2]; // Module: robertson_mask() // Usage: -// robertson_mask(size, [extra]); +// robertson_mask(size, [extra], [ang], [$slop=]); // 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`. Note that this model is based @@ -295,6 +295,7 @@ function torx_depth(size) = torx_info(size)[2]; // 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); diff --git a/shapes3d.scad b/shapes3d.scad index 72f6060..90c187a 100644 --- a/shapes3d.scad +++ b/shapes3d.scad @@ -2547,6 +2547,7 @@ module teardrop(h, r, ang=45, cap_h, r1, r2, d, d1, d2, cap_h1, cap_h2, l, lengt chamfer, chamfer1, chamfer2,anchor=CENTER, spin=0, orient=UP) { length = one_defined([l, h, length, height],"l,h,length,height"); + dummy=assert(is_finite(length) && length>0, "length must be positive"); r1 = get_radius(r=r, r1=r1, d=d, d1=d1); r2 = get_radius(r=r, r1=r2, d=d, d1=d2); tip_y1 = r1/cos(90-ang); @@ -2574,6 +2575,7 @@ function teardrop(h, r, ang=45, cap_h, r1, r2, d, d1, d2, cap_h1, cap_h2, chamf r1 = get_radius(r=r, r1=r1, d=d, d1=d1, dflt=1), r2 = get_radius(r=r, r1=r2, d=d, d1=d2, dflt=1), length = one_defined([l, h, length, height],"l,h,length,height"), + dummy0=assert(is_finite(length) && length>0, "length must be positive"), cap_h1 = first_defined([cap_h1, cap_h]), cap_h2 = first_defined([cap_h2, cap_h]), chamfer1 = first_defined([chamfer1,chamfer,0]),