-
Notifications
You must be signed in to change notification settings - Fork 166
constants.scad
Constants for directions (used with anchoring), and for specifying line termination for use with geometry.scad.
To use, add the following lines to the beginning of your file:
include <BOSL2/std.scad>
-
-
$slop– The slop amount to make printed items fit closely.0.0by default. -
get_slop()– Returns the $slop value. -
INCH– A constant containing the number of millimeters in an inch.25.4 -
IDENT– A constant containing the 3D identity transformation matrix. [Mat]
-
-
-
LEFT– The left-wards (X-) direction vector constant[-1,0,0]. -
RIGHT– The right-wards (X+) direction vector constant[1,0,0]. -
FRONT– The front-wards (Y-) direction vector constant[0,-1,0]. -
BACK– The backwards (Y+) direction vector constant[0,1,0]. -
BOTTOM– The down-wards (Z-) direction vector constant[0,0,-1]. -
TOP– The top-wards (Z+) direction vector constant[0,0,1]. -
CENTER– The center vector constant[0,0,0]. -
EDGE()– Named edge anchor constants -
FACE()– Named face anchor constants
-
Synopsis: The slop amount to make printed items fit closely. 0.0 by default.
Topics: Constants
Description:
Engineering drawings always include allowable tolerance. You cannot ask for a 10mm hole and
a 10mm cylinder and expect them to always fit together; instead you could say the hole must
be at least 10mm and the cylinder must be no more than 10mm and you would expect them to
always fit together. $slop is currently used many libraries to increase hole and internal
feature sizes so joiners, partitions, and threaded parts can mate even though 3D printing
is imperfect.
Slop has some limitations:
- Slop generally works for a wide range of shapes and sizes, but problems like bulging corners, shrinkage, arc compensation, under- or over-extrusion, etc. means the ideal value for a large square peg and socket may not be the same as a small cylinder and hole without further changes (like filleting, changing print orientation, calibrating slicer settings, etc).
- It only affects "internal" parts. If you were using the
screws.scadlibrary to produce a bolt intended to mate with a mass-manufactured nut, and your screw is printing smaller than expected, you cannot use$slopto help increase the size. - For smaller 3d-printed holes,
$slopbecomes inaccurate and varies based on printing orientation. See issue#1679 for a discussion on this point and a design you can print to measure the effect. The intended workaround is to pass$slopwith a customized value as a keyword argument (i.e.threaded_nut(..., $slop=0.17)) to any functions or modules creating small internal features or by altering the requested internal diameter. - It may vary by printer and material type, along with slicer settings like wall order, seam settings, wall generator, etc.
- It varies some depending on the final printing orientation. As this information isn't knowable at module instantiation, it's not possible to do better than a single constant.
Your own part libraries should add a single $slop to every mating surface. For holes, increase
the hole radius by get_slop() or diameter by 2*get_slop(). A shiplap pattern would reduce
the tab thickness on only one end by get_slop() and the overall length by get_slop(), while
a tongue-and-groove joint would increase the size of the groove thickness by 2*get_slop()
and reduce the overall length by get_slop().
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().
Calibration: To calibrate the $slop value for your printer, follow this procedure:
- Print the Slop Calibration part from the example below. By default it uses cubes and that usually works well enough, but if you want to test cylinders, then adjust the code as the comments suggest. Suggest using 2 walls, 5% infill, and minimal top/bottom (3/2?) layers to save filament.
- Take the long block and orient it so the numbers are upright, facing you.
- Take the plug and orient it so that the arrow points down, facing you.
- Starting with the hole with the largest number in front of it, insert the small end of the plug into the hole.
- If you can insert and remove the small end of the plug from the hole without much force, then try again with the hole with the next smaller number.
- Repeat step 5 until you have found the hole with the smallest number that the plug fits into without much force.
- The correct hole should hold the plug when the long block is turned upside-down.
- The number in front of that hole will indicate the
$slopvalue that is ideal for your printer. - Remember to set that slop value in your scripts after you include the BOSL2 library: ie:
$slop = 0.15; - If trying to test the proper
$slopvalue for a mating cube and matching socket without any filleting or chamfers, you can turn the plug 180 degrees and follow the above procedure again.
Example 1: Slop Calibration Part.
include <BOSL2/std.scad>
min_slop = 0.00;
slop_step = 0.05;
holes = 6;
holesize = [10,10,10];
gap = 5;
l = holes * (holesize.x + gap) + gap;
w = holesize.y + 2*gap;
h = holesize.z + 5;
// To test cylinders instead, comment out the cuboid (add "//" to the beginning) and
// remove the comment in front of the cyl in both hole() and plug().
module hole(s) {
cuboid([holesize.x + 2*s, holesize.y + 2*s, h+0.2]) position([BACK+LEFT,BACK+RIGHT]) cylinder(h+0.2,r=1, center=true, $fn=16);
// cyl(d=holesize.x + 2*s, h=h+0.2, $fn=48);
}
module plug() {
cuboid([holesize.x, holesize.y, holesize.z], anchor=BOT, rounding=1, edges="Z", except=BACK);
// cyl(d=holesize.x, h=holesize.z, anchor=BOT, $fn=48);
}
diff("holes")
cuboid([l, w, h], anchor=BOT) {
for (i=[0:holes-1]) {
right((i-holes/2+0.5)*(holesize.x+gap)) {
s = min_slop + slop_step * i;
tag("holes") {
hole(s);
fwd(w/2-1) xrot(90) linear_extrude(1.1) {
text(
text=format_fixed(s,2),
size=0.4*holesize.x,
halign="center",
valign="center"
);
}
}
}
}
}
back(holesize.y*2.5) {
diff() {
cuboid([holesize.x+10, holesize.y+10, 15], anchor=BOT) {
position(TOP) plug();
tag("remove") position(BOT) cylinder(h=15+holesize.z,d=min(holesize.x, holesize.y)*.6); // Reinforce the plug end so you can use weaker infill.
}
up(3) fwd((holesize.y+10)/2) {
tag("remove") prismoid([holesize.x/2,1], [0,1], h=holesize.y-6); // Arrow
}
}
}
Example 2: Where to add $slop gaps.
include <BOSL2/std.scad>
$slop = 0.2;
difference() {
square([20,12],center=true);
back(3) square([10+2*$slop,11],center=true);
}
back(8) {
rect([15,5],anchor=FWD);
rect([10,8],anchor=BACK);
}
color("#000") {
arrow_path = [[5.1,6.1], [6.0,7.1], [8,7.1], [10.5,10]];
xflip_copy()
stroke(arrow_path, width=0.3, endcap1="arrow2");
xcopies(21) back(10.5) {
back(1.8) text("$slop", size=1.5, halign="center");
text("gap", size=1.5, halign="center");
}
}
Synopsis: Returns the $slop value.
Topics: Slop
See Also: $slop
Usage:
- slop = get_slop();
Description:
Returns the current $slop value, or the default value if the user did not set $slop.
Always access the $slop variable using this function.
Synopsis: A constant containing the number of millimeters in an inch. 25.4
Topics: Constants
Description:
The number of millimeters in an inch.
Example 1:
include <BOSL2/std.scad>
square(2*INCH, center=true);
Example 2:
include <BOSL2/std.scad>
cube([4,3,2.5]*INCH, center=true);
Synopsis: A constant containing the 3D identity transformation matrix. [Mat]
Topics: Constants, Affine, Matrices, Transforms
See Also: ident()
Description:
Identity transformation matrix for three-dimensional transforms. Equal to ident(4).
Vectors useful for rotate(), mirror(), and anchor arguments for cuboid(), cyl(), etc.
Synopsis: The left-wards (X-) direction vector constant [-1,0,0].
See Also: RIGHT, FRONT, BACK, TOP, BOTTOM, CENTER
Description:
Vector pointing left. [-1,0,0]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=LEFT);
Synopsis: The right-wards (X+) direction vector constant [1,0,0].
See Also: LEFT, FRONT, BACK, TOP, BOTTOM, CENTER
Description:
Vector pointing right. [1,0,0]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=RIGHT);
Aliases: FWD, FORWARD
Synopsis: The front-wards (Y-) direction vector constant [0,-1,0].
See Also: LEFT, RIGHT, BACK, TOP, BOTTOM, CENTER
Description:
Vector pointing forward. [0,-1,0]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=FRONT);
Synopsis: The backwards (Y+) direction vector constant [0,1,0].
See Also: LEFT, RIGHT, FRONT, TOP, BOTTOM, CENTER
Description:
Vector pointing back. [0,1,0]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=BACK);
Aliases: BOT, DOWN
Synopsis: The down-wards (Z-) direction vector constant [0,0,-1].
See Also: LEFT, RIGHT, FRONT, BACK, TOP, CENTER
Description:
Vector pointing down. [0,0,-1]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=BOTTOM);
Aliases: UP
Synopsis: The top-wards (Z+) direction vector constant [0,0,1].
See Also: LEFT, RIGHT, FRONT, BACK, BOTTOM, CENTER
Description:
Vector pointing up. [0,0,1]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=TOP);
Aliases: CTR, CENTRE
Synopsis: The center vector constant [0,0,0].
See Also: LEFT, RIGHT, FRONT, BACK, TOP, BOTTOM
Description:
Zero vector. Centered. [0,0,0]
Example 1: Usage with anchor
include <BOSL2/std.scad>
cuboid(20, anchor=CENTER);
Synopsis: Named edge anchor constants
Topics: Constants, Attachment
Usage:
- EDGE(i)
- EDGE(direction,i)
Description:
A shorthand for the named anchors "edge0", "top_edge0", "bot_edge0", etc.
Use EDGE(i) to get "edge". Use EDGE(TOP,i) to get "top_edge" and
use EDGE(BOT,i) to get "bot_edge(i)". You can also use
EDGE(CTR,i) to get "edge" and you can replace TOP or BOT with simply 1 or -1.
Synopsis: Named face anchor constants
Topics: Constants, Attachment
Usage:
- FACE(i)
Description:
A shorthand for the named anchors "face0", "face1", etc.
Used by functions in geometry.scad for specifying whether two points are treated as an unbounded line, a ray with one endpoint, or a segment with two endpoints.
Synopsis: A constant for specifying a line segment in various geometry.scad functions. [true,true]
Description:
Treat a line as a segment. [true, true]
Example 1: Usage with line_intersection:
include <BOSL2/std.scad>
line1 = 10*[[9, 4], [5, 7]];
line2 = 10*[[2, 3], [6, 5]];
isect = line_intersection(line1, line2, SEGMENT, SEGMENT);
Synopsis: A constant for specifying a ray line in various geometry.scad functions. [true,false]
Description:
Treat a line as a ray, based at the first point. [true, false]
Example 1: Usage with line_intersection:
include <BOSL2/std.scad>
line = [[-30,0],[30,30]];
pt = [40,25];
closest = line_closest_point(line,pt,RAY);
Synopsis: A constant for specifying an unbounded line in various geometry.scad functions. [false,false]
Description:
Treat a line as an unbounded line. [false, false]
Example 1: Usage with line_intersection:
include <BOSL2/std.scad>
line1 = 10*[[9, 4], [5, 7]];
line2 = 10*[[2, 3], [6, 5]];
isect = line_intersection(line1, line2, LINE, SEGMENT);
Table of Contents
Function Index
Topics Index
Glossary
Cheat Sheet
Tutorials
Basic Modeling:
- constants.scad STD
- transforms.scad STD
- attachments.scad STD
- shapes2d.scad STD
- shapes3d.scad STD
- masks.scad STD
- drawing.scad STD
- distributors.scad STD
- color.scad STD
- partitions.scad STD
- miscellaneous.scad STD
Advanced Modeling:
- paths.scad STD
- regions.scad STD
- skin.scad STD
- vnf.scad STD
- beziers.scad STD
- nurbs.scad
- rounding.scad STD
- turtle3d.scad
- isosurface.scad
Math:
- math.scad STD
- linalg.scad STD
- vectors.scad STD
- coords.scad STD
- geometry.scad STD
- trigonometry.scad STD
Data Management:
- version.scad STD
- comparisons.scad STD
- lists.scad STD
- utility.scad STD
- strings.scad STD
- structs.scad STD
- fnliterals.scad
Threaded Parts:
Parts:
- ball_bearings.scad
- cubetruss.scad
- gears.scad
- hinges.scad
- joiners.scad
- linear_bearings.scad
- modular_hose.scad
- nema_steppers.scad
- polyhedra.scad
- sliders.scad
- tripod_mounts.scad
- walls.scad
- wiring.scad
- hooks.scad
STD = Included in std.scad