Fixed and simplified anchoring.

This commit is contained in:
Revar Desmera 2019-05-17 14:41:45 -07:00
parent 8b792c9414
commit 88ea4c94d9
16 changed files with 175 additions and 115 deletions

View file

@ -1,5 +1,5 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// LibFile: matrices.scad // LibFile: affine.scad
// Matrix math and affine transformation matrices. // Matrix math and affine transformation matrices.
// To use, add the following lines to the beginning of your file: // To use, add the following lines to the beginning of your file:
// ``` // ```

View file

@ -155,7 +155,8 @@ function _str_char_split(s,delim,n=0,acc=[],word="") =
// //
// Example: // Example:
// #cylinder(d=5, h=10); // #cylinder(d=5, h=10);
// orient_and_anchor([5,5,10], orient=ORIENT_Y, anchor=BACK, orig_anchor=UP) cylinder(d=5, h=10); // orient_and_anchor([5,5,10], orient=ORIENT_Y, anchor=BACK, orig_anchor=BOTTOM)
// cylinder(d=5, h=10);
module orient_and_anchor( module orient_and_anchor(
size=undef, orient=ORIENT_Z, anchor=CENTER, size=undef, orient=ORIENT_Z, anchor=CENTER,
center=undef, noncentered=BOTTOM, center=undef, noncentered=BOTTOM,
@ -194,14 +195,21 @@ module orient_and_anchor(
] ]
) )
) : concat( ) : concat(
(anchor==CENTER)? [] : [
let(anch = find_anchor(anchor, size.z, size, size2=size2, shift=shift, extra_anchors=anchors, geometry=geometry, two_d=two_d))
affine3d_translate(-anch[1])
],
(orient==ORIENT_Z)? [] : [ (orient==ORIENT_Z)? [] : [
affine3d_xrot(orient.x), affine3d_xrot(orient.x),
affine3d_yrot(orient.y), affine3d_yrot(orient.y),
affine3d_zrot(orient.z) affine3d_zrot(orient.z)
],
(anchor==CENTER)? [] : [
let(
anchr = is_vector(anchor)? rotate_points3d([anchor], orient, reverse=true)[0] : anchor,
anch = find_anchor(
anchr, size.z, size, size2=size2,
shift=shift, extra_anchors=anchors,
geometry=geometry, two_d=two_d
)
)
affine3d_translate(rotate_points3d([-anch[1]],orient)[0])
] ]
) )
)); ));
@ -436,8 +444,8 @@ module intersect(a, b=undef, keep=undef)
// Example: // Example:
// hulling("body") // hulling("body")
// sphere(d=100, $tags="body") { // sphere(d=100, $tags="body") {
// attach(CENTER) cube([40,100,100], anchor=CENTER, $tags="body"); // attach(CENTER) cube([40,90,90], anchor=CENTER, $tags="body");
// attach(CENTER) xcyl(d=40, h=100); // attach(CENTER) xcyl(d=40, h=120, $tags="other");
// } // }
module hulling(a) module hulling(a)
{ {

View file

@ -66,7 +66,7 @@ module debug_vertices(vertices, size=1, disabled=false) {
// faces = Array of faces by vertex numbers. // faces = Array of faces by vertex numbers.
// size = The size of the text used to label the faces and vertices. // size = The size of the text used to label the faces and vertices.
// disabled = If true, don't draw numbers, and draw children without transparency. Default = false. // disabled = If true, don't draw numbers, and draw children without transparency. Default = false.
// Example: // Example(EdgesMed):
// verts = [for (z=[-10,10], y=[-10,10], x=[-10,10]) [x,y,z]]; // verts = [for (z=[-10,10], y=[-10,10], x=[-10,10]) [x,y,z]];
// faces = [[0,1,2], [1,3,2], [0,4,5], [0,5,1], [1,5,7], [1,7,3], [3,7,6], [3,6,2], [2,6,4], [2,4,0], [4,6,7], [4,7,5]]; // faces = [[0,1,2], [1,3,2], [0,4,5], [0,5,1], [1,5,7], [1,7,3], [3,7,6], [3,6,2], [2,6,4], [2,4,0], [4,6,7], [4,7,5]];
// debug_faces(vertices=verts, faces=faces, size=2) { // debug_faces(vertices=verts, faces=faces, size=2) {
@ -130,7 +130,7 @@ module debug_faces(vertices, faces, size=1, disabled=false) {
// faces = Array of faces by vertex numbers. // faces = Array of faces by vertex numbers.
// txtsize = The size of the text used to label the faces and vertices. // txtsize = The size of the text used to label the faces and vertices.
// disabled = If true, act exactly like `polyhedron()`. Default = false. // disabled = If true, act exactly like `polyhedron()`. Default = false.
// Example: // Example(EdgesMed):
// verts = [for (z=[-10,10], a=[0:120:359.9]) [10*cos(a),10*sin(a),z]]; // verts = [for (z=[-10,10], a=[0:120:359.9]) [10*cos(a),10*sin(a),z]];
// faces = [[0,1,2], [5,4,3], [0,3,4], [0,4,1], [1,4,5], [1,5,2], [2,5,3], [2,3,0]]; // faces = [[0,1,2], [5,4,3], [0,3,4], [0,4,1], [1,4,5], [1,5,2], [2,5,3], [2,3,0]];
// debug_polyhedron(points=verts, faces=faces, txtsize=1); // debug_polyhedron(points=verts, faces=faces, txtsize=1);

View file

@ -2,7 +2,7 @@ include <BOSL2/std.scad>
$fn=32; $fn=32;
cuboid([60,40,40], rounding=5, edges=EDGES_Z_ALL, anchor=BOTTOM) { cuboid([60,40,40], rounding=5, edges=edges("Z"), anchor=BOTTOM) {
attach(TOP, BOTTOM) rounded_prismoid([60,40],[20,20], h=50, r1=5, r2=10) { attach(TOP, BOTTOM) rounded_prismoid([60,40],[20,20], h=50, r1=5, r2=10) {
attach(TOP) cylinder(d=20, h=30) { attach(TOP) cylinder(d=20, h=30) {
attach(TOP) cylinder(d1=50, d2=30, h=12); attach(TOP) cylinder(d1=50, d2=30, h=12);

View file

@ -144,12 +144,12 @@ function base_radius(mm_per_tooth=5, number_of_teeth=11, pressure_angle=28)
// Example(2D): // Example(2D):
// gear_tooth_profile(mm_per_tooth=5, number_of_teeth=20, pressure_angle=20); // gear_tooth_profile(mm_per_tooth=5, number_of_teeth=20, pressure_angle=20);
module gear_tooth_profile( module gear_tooth_profile(
mm_per_tooth = 3, //this is the "circular pitch", the circumference of the pitch circle divided by the number of teeth mm_per_tooth = 3,
number_of_teeth = 11, //total number of teeth around the entire perimeter number_of_teeth = 11,
pressure_angle = 28, //Controls how straight or bulged the tooth sides are. In degrees. pressure_angle = 28,
backlash = 0.0, //gap between two meshing teeth, in the direction along the circumference of the pitch circle backlash = 0.0,
bevelang = 0.0, //Gear face angle for bevelled gears. bevelang = 0.0,
clearance = undef, //gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters) clearance = undef,
interior = false interior = false
) { ) {
function polar(r,theta) = r*[sin(theta), cos(theta)]; //convert polar to cartesian coordinates function polar(r,theta) = r*[sin(theta), cos(theta)]; //convert polar to cartesian coordinates
@ -202,12 +202,12 @@ module gear_tooth_profile(
// Example(2D): Partial Gear // Example(2D): Partial Gear
// gear2d(mm_per_tooth=5, number_of_teeth=20, teeth_to_hide=15, pressure_angle=20); // gear2d(mm_per_tooth=5, number_of_teeth=20, teeth_to_hide=15, pressure_angle=20);
module gear2d( module gear2d(
mm_per_tooth = 3, //this is the "circular pitch", the circumference of the pitch circle divided by the number of teeth mm_per_tooth = 3,
number_of_teeth = 11, //total number of teeth around the entire perimeter number_of_teeth = 11,
teeth_to_hide = 0, //number of teeth to delete to make this only a fraction of a circle teeth_to_hide = 0,
pressure_angle = 28, //Controls how straight or bulged the tooth sides are. In degrees. pressure_angle = 28,
clearance = undef, //gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters) clearance = undef,
backlash = 0.0, //gap between two meshing teeth, in the direction along the circumference of the pitch circle backlash = 0.0,
bevelang = 0.0, bevelang = 0.0,
interior = false interior = false
) { ) {
@ -291,17 +291,17 @@ module gear2d(
// Example: Beveled Gear // Example: Beveled Gear
// gear(mm_per_tooth=5, number_of_teeth=20, thickness=10*cos(45), hole_diameter=5, twist=-30, bevelang=45, slices=12, $fa=1, $fs=1); // gear(mm_per_tooth=5, number_of_teeth=20, thickness=10*cos(45), hole_diameter=5, twist=-30, bevelang=45, slices=12, $fa=1, $fs=1);
module gear( module gear(
mm_per_tooth = 3, //this is the "circular pitch", the circumference of the pitch circle divided by the number of teeth mm_per_tooth = 3,
number_of_teeth = 11, //total number of teeth around the entire perimeter number_of_teeth = 11,
thickness = 6, //thickness of gear in mm thickness = 6,
hole_diameter = 3, //diameter of the hole in the center, in mm hole_diameter = 3,
teeth_to_hide = 0, //number of teeth to delete to make this only a fraction of a circle teeth_to_hide = 0,
pressure_angle = 28, //Controls how straight or bulged the tooth sides are. In degrees. pressure_angle = 28,
clearance = undef, //gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters) clearance = undef,
backlash = 0.0, //gap between two meshing teeth, in the direction along the circumference of the pitch circle backlash = 0.0,
bevelang = 0.0, //angle of bevelled gear face. bevelang = 0.0,
twist = undef, //teeth rotate this many degrees from bottom of gear to top. 360 makes the gear a screw with each thread going around once twist = undef,
slices = undef, //Number of slices to divide gear into. Useful for refining gears with `twist`. slices = undef,
interior = false, interior = false,
orient = ORIENT_Z, orient = ORIENT_Z,
anchor = CENTER anchor = CENTER
@ -310,7 +310,7 @@ module gear(
c = outer_radius(mm_per_tooth, number_of_teeth, clearance, interior); c = outer_radius(mm_per_tooth, number_of_teeth, clearance, interior);
r = root_radius(mm_per_tooth, number_of_teeth, clearance, interior); r = root_radius(mm_per_tooth, number_of_teeth, clearance, interior);
p2 = p - (thickness*tan(bevelang)); p2 = p - (thickness*tan(bevelang));
orient_and_anchor([p, p, thickness], orient, anchor, chain=true) { orient_and_anchor([p, p, thickness], orient, anchor, geometry="cylinder", chain=true) {
difference() { difference() {
linear_extrude(height=thickness, center=true, convexity=10, twist=twist, scale=p2/p, slices=slices) { linear_extrude(height=thickness, center=true, convexity=10, twist=twist, scale=p2/p, slices=slices) {
gear2d( gear2d(
@ -356,24 +356,48 @@ module gear(
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle // backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
// orient = Orientation of the rack. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_X`. // orient = Orientation of the rack. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_X`.
// anchor = Alignment of the rack. Use the constants from `constants.scad`. Default: `RIGHT`. // anchor = Alignment of the rack. Use the constants from `constants.scad`. Default: `RIGHT`.
// Anchors:
// "adendum" = At the tips of the teeth, at the center of rack.
// "adendum-left" = At the tips of the teeth, at the left end of the rack.
// "adendum-right" = At the tips of the teeth, at the right end of the rack.
// "adendum-top" = At the tips of the teeth, at the top of the rack.
// "adendum-bottom" = At the tips of the teeth, at the bottom of the rack.
// "dedendum" = At the base of the teeth, at the center of rack.
// "dedendum-left" = At the base of the teeth, at the left end of the rack.
// "dedendum-right" = At the base of the teeth, at the right end of the rack.
// "dedendum-top" = At the base of the teeth, at the top of the rack.
// "dedendum-bottom" = At the base of the teeth, at the bottom of the rack.
// Example: // Example:
// rack(mm_per_tooth=5, number_of_teeth=10, thickness=5, height=5, pressure_angle=20); // rack(mm_per_tooth=5, number_of_teeth=10, thickness=5, height=5, pressure_angle=20);
module rack( module rack(
mm_per_tooth = 5, //this is the "circular pitch", the circumference of the pitch circle divided by the number of teeth mm_per_tooth = 5,
number_of_teeth = 20, //total number of teeth along the rack number_of_teeth = 20,
thickness = 5, //thickness of rack in mm (affects each tooth) thickness = 5,
height = 10, //height of rack in mm, from tooth top to back of rack. height = 10,
pressure_angle = 28, //Controls how straight or bulged the tooth sides are. In degrees. pressure_angle = 28,
backlash = 0.0, //gap between two meshing teeth, in the direction along the circumference of the pitch circle backlash = 0.0,
clearance = undef, clearance = undef,
orient = ORIENT_X, orient = ORIENT_Z,
anchor = RIGHT anchor = CENTER
) { ) {
a = adendum(mm_per_tooth); a = adendum(mm_per_tooth);
d = dedendum(mm_per_tooth, clearance); d = dedendum(mm_per_tooth, clearance);
xa = a * sin(pressure_angle); xa = a * sin(pressure_angle);
xd = d * sin(pressure_angle); xd = d * sin(pressure_angle);
orient_and_anchor([(number_of_teeth-1)*mm_per_tooth, height, thickness], orient, anchor, orig_orient=ORIENT_X, chain=true) { l = number_of_teeth * mm_per_tooth;
anchors = [
anchorpt("adendum", [0,a,0], BACK),
anchorpt("adendum-left", [-l/2,a,0], LEFT),
anchorpt("adendum-right", [l/2,a,0], RIGHT),
anchorpt("adendum-top", [0,a,thickness/2], UP),
anchorpt("adendum-bottom", [0,a,-thickness/2], DOWN),
anchorpt("dedendum", [0,-d,0], BACK),
anchorpt("dedendum-left", [-l/2,-d,0], LEFT),
anchorpt("dedendum-right", [l/2,-d,0], RIGHT),
anchorpt("dedendum-top", [0,-d,thickness/2], UP),
anchorpt("dedendum-bottom", [0,-d,-thickness/2], DOWN),
];
orient_and_anchor([l, 2*abs(a-height), thickness], orient, anchor, anchors=anchors, chain=true) {
left((number_of_teeth-1)*mm_per_tooth/2) { left((number_of_teeth-1)*mm_per_tooth/2) {
linear_extrude(height = thickness, center = true, convexity = 10) { linear_extrude(height = thickness, center = true, convexity = 10) {
for (i = [0:number_of_teeth-1] ) { for (i = [0:number_of_teeth-1] ) {

View file

@ -34,7 +34,7 @@ module half_joiner_clear(h=20, w=10, a=30, clearance=0, overlap=0.01, orient=ORI
guide_size = w/3; guide_size = w/3;
guide_width = 2*(dmnd_height/2-guide_size)*tan(a); guide_width = 2*(dmnd_height/2-guide_size)*tan(a);
orient_and_anchor([w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y) {
union() { union() {
yspread(overlap, n=overlap>0? 2 : 1) { yspread(overlap, n=overlap>0? 2 : 1) {
difference() { difference() {
@ -50,7 +50,6 @@ module half_joiner_clear(h=20, w=10, a=30, clearance=0, overlap=0.01, orient=ORI
} }
if (overlap>0) cube([w+clearance, overlap+0.001, h], center=true); if (overlap>0) cube([w+clearance, overlap+0.001, h], center=true);
} }
children();
} }
} }
@ -87,7 +86,7 @@ module half_joiner(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, slop=PR
} }
} }
render(convexity=12) render(convexity=12)
orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y) {
difference() { difference() {
union() { union() {
// Make base. // Make base.
@ -133,7 +132,6 @@ module half_joiner(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, slop=PR
yrot(90) cylinder(r=screwsize*1.1/2, h=w+1, center=true, $fn=12); yrot(90) cylinder(r=screwsize*1.1/2, h=w+1, center=true, $fn=12);
} }
} }
children();
} }
} }
//half_joiner(screwsize=3, orient=ORIENT_Z, anchor=UP); //half_joiner(screwsize=3, orient=ORIENT_Z, anchor=UP);
@ -171,7 +169,7 @@ module half_joiner2(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, orient
} }
render(convexity=12) render(convexity=12)
orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y) {
difference() { difference() {
union () { union () {
fwd(l/2) cube(size=[w, l, h], center=true); fwd(l/2) cube(size=[w, l, h], center=true);
@ -186,7 +184,6 @@ module half_joiner2(h=20, w=10, l=10, a=30, screwsize=undef, guides=true, orient
xcyl(r=screwsize*1.1/2, l=w+1, $fn=12); xcyl(r=screwsize*1.1/2, l=w+1, $fn=12);
} }
} }
children();
} }
} }
@ -217,12 +214,11 @@ module joiner_clear(h=40, w=10, a=30, clearance=0, overlap=0.01, orient=ORIENT_Y
guide_size = w/3; guide_size = w/3;
guide_width = 2*(dmnd_height/2-guide_size)*tan(a); guide_width = 2*(dmnd_height/2-guide_size)*tan(a);
orient_and_anchor([w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y) {
union() { union() {
up(h/4) half_joiner_clear(h=h/2.0-0.01, w=w, a=a, overlap=overlap, clearance=clearance); up(h/4) half_joiner_clear(h=h/2.0-0.01, w=w, a=a, overlap=overlap, clearance=clearance);
down(h/4) half_joiner_clear(h=h/2.0-0.01, w=w, a=a, overlap=overlap, clearance=-0.01); down(h/4) half_joiner_clear(h=h/2.0-0.01, w=w, a=a, overlap=overlap, clearance=-0.01);
} }
children();
} }
} }
@ -245,7 +241,7 @@ module joiner_clear(h=40, w=10, a=30, clearance=0, overlap=0.01, orient=ORIENT_Y
// anchor = Alignment of the shape by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `CENTER`. // anchor = Alignment of the shape by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `CENTER`.
// Examples: // Examples:
// joiner(screwsize=3, orient=ORIENT_X); // joiner(screwsize=3, orient=ORIENT_X);
// joiner(w=10, l=10, h=40, orient=ORIENT_X) cuboid([10, 10*2, 40], anchor=LEFT); // joiner(w=10, l=10, h=40, orient=ORIENT_X) cuboid([10, 10*2, 40], anchor=RIGHT);
module joiner(h=40, w=10, l=10, a=30, screwsize=undef, guides=true, slop=PRINTER_SLOP, orient=ORIENT_Y, anchor=CENTER) module joiner(h=40, w=10, l=10, a=30, screwsize=undef, guides=true, slop=PRINTER_SLOP, orient=ORIENT_Y, anchor=CENTER)
{ {
if ($children > 0) { if ($children > 0) {
@ -254,12 +250,11 @@ module joiner(h=40, w=10, l=10, a=30, screwsize=undef, guides=true, slop=PRINTER
joiner_clear(h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor); joiner_clear(h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor);
} }
} }
orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y) {
union() { union() {
up(h/4) half_joiner(h=h/2, w=w, l=l, a=a, screwsize=screwsize, guides=guides, slop=slop); up(h/4) half_joiner(h=h/2, w=w, l=l, a=a, screwsize=screwsize, guides=guides, slop=slop);
down(h/4) half_joiner2(h=h/2, w=w, l=l, a=a, screwsize=screwsize, guides=guides); down(h/4) half_joiner2(h=h/2, w=w, l=l, a=a, screwsize=screwsize, guides=guides);
} }
children();
} }
} }
@ -293,11 +288,10 @@ module joiner_pair_clear(spacing=100, h=40, w=10, a=30, n=2, clearance=0, overla
guide_size = w/3; guide_size = w/3;
guide_width = 2*(dmnd_height/2-guide_size)*tan(a); guide_width = 2*(dmnd_height/2-guide_size)*tan(a);
orient_and_anchor([spacing+w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([spacing+w, guide_width, h], orient, anchor, orig_orient=ORIENT_Y) {
xspread(spacing, n=n) { xspread(spacing, n=n) {
joiner_clear(h=h, w=w, a=a, clearance=clearance, overlap=overlap); joiner_clear(h=h, w=w, a=a, clearance=clearance, overlap=overlap);
} }
children();
} }
} }
@ -322,7 +316,7 @@ module joiner_pair_clear(spacing=100, h=40, w=10, a=30, n=2, clearance=0, overla
// orient = Orientation of the shape. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Y`. // orient = Orientation of the shape. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Y`.
// anchor = Alignment of the shape by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `CENTER`. // anchor = Alignment of the shape by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `CENTER`.
// Examples: // Examples:
// joiner_pair(spacing=50, l=10, orient=ORIENT_X) cuboid([10, 50+10-0.1, 40], anchor=LEFT); // joiner_pair(spacing=50, l=10, orient=ORIENT_X) cuboid([10, 50+10-0.1, 40], anchor=RIGHT);
// joiner_pair(spacing=50, l=10, n=2, orient=ORIENT_X); // joiner_pair(spacing=50, l=10, n=2, orient=ORIENT_X);
// joiner_pair(spacing=50, l=10, n=3, alternate=false, orient=ORIENT_X); // joiner_pair(spacing=50, l=10, n=3, alternate=false, orient=ORIENT_X);
// joiner_pair(spacing=50, l=10, n=3, alternate=true, orient=ORIENT_X); // joiner_pair(spacing=50, l=10, n=3, alternate=true, orient=ORIENT_X);
@ -335,7 +329,7 @@ module joiner_pair(spacing=100, h=40, w=10, l=10, a=30, n=2, alternate=true, scr
joiner_pair_clear(spacing=spacing, h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor); joiner_pair_clear(spacing=spacing, h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor);
} }
} }
orient_and_anchor([spacing+w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([spacing+w, 2*l, h], orient, anchor, orig_orient=ORIENT_Y) {
left((n-1)*spacing/2) { left((n-1)*spacing/2) {
for (i=[0:n-1]) { for (i=[0:n-1]) {
right(i*spacing) { right(i*spacing) {
@ -345,7 +339,6 @@ module joiner_pair(spacing=100, h=40, w=10, l=10, a=30, n=2, alternate=true, scr
} }
} }
} }
children();
} }
} }
@ -377,13 +370,12 @@ module joiner_quad_clear(xspacing=undef, yspacing=undef, spacing1=undef, spacing
{ {
spacing1 = first_defined([spacing1, xspacing, 100]); spacing1 = first_defined([spacing1, xspacing, 100]);
spacing2 = first_defined([spacing2, yspacing, 50]); spacing2 = first_defined([spacing2, yspacing, 50]);
orient_and_anchor([w+spacing1, spacing2, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w+spacing1, spacing2, h], orient, anchor, orig_orient=ORIENT_Y) {
zrot_copies(n=2) { zrot_copies(n=2) {
back(spacing2/2) { back(spacing2/2) {
joiner_pair_clear(spacing=spacing1, n=n, h=h, w=w, a=a, clearance=clearance, overlap=overlap); joiner_pair_clear(spacing=spacing1, n=n, h=h, w=w, a=a, clearance=clearance, overlap=overlap);
} }
} }
children();
} }
} }
@ -423,13 +415,12 @@ module joiner_quad(spacing1=undef, spacing2=undef, xspacing=undef, yspacing=unde
joiner_quad_clear(spacing1=spacing1, spacing2=spacing2, h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor); joiner_quad_clear(spacing1=spacing1, spacing2=spacing2, h=h, w=w, a=a, clearance=0.1, orient=orient, anchor=anchor);
} }
} }
orient_and_anchor([w+spacing1, spacing2, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w+spacing1, spacing2, h], orient, anchor, orig_orient=ORIENT_Y) {
zrot_copies(n=2) { zrot_copies(n=2) {
back(spacing2/2) { back(spacing2/2) {
joiner_pair(spacing=spacing1, n=n, h=h, w=w, l=l, a=a, screwsize=screwsize, guides=guides, slop=slop); joiner_pair(spacing=spacing1, n=n, h=h, w=w, l=l, a=a, screwsize=screwsize, guides=guides, slop=slop);
} }
} }
children();
} }
} }

View file

@ -80,26 +80,43 @@ function get_lmXuu_bearing_length(size) = lookup(size, [
// anchor = Alignment of the housing by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `UP` // anchor = Alignment of the housing by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `UP`
// Example: // Example:
// linear_bearing_housing(d=19, l=29, wall=2, tab=6, screwsize=2.5); // linear_bearing_housing(d=19, l=29, wall=2, tab=6, screwsize=2.5);
module linear_bearing_housing(d=15, l=24, tab=7, gap=5, wall=3, tabwall=5, screwsize=3, orient=ORIENT_X, anchor=UP) module linear_bearing_housing(d=15, l=24, tab=7, gap=5, wall=3, tabwall=5, screwsize=3, orient=ORIENT_X, anchor=BOTTOM)
{ {
od = d+2*wall; od = d+2*wall;
ogap = gap+2*tabwall; ogap = gap+2*tabwall;
tabh = tab/2+od/2*sqrt(2)-ogap/2; tabh = tab/2+od/2*sqrt(2)-ogap/2;
orient_and_anchor([l, od, od], orient, anchor, orig_orient=ORIENT_X, chain=true) { h = od+tab/2;
anchors = [
anchorpt("axis", [0,0,-tab/2/2]),
anchorpt("screw", [0,2-ogap/2,tabh-tab/2/2],FWD),
anchorpt("nut", [0,ogap/2-2,tabh-tab/2/2],FWD)
];
orient_and_anchor([l, od, h], orient, anchor, anchors=anchors, orig_orient=ORIENT_X, chain=true) {
down(tab/2/2)
difference() { difference() {
union() { union() {
// Housing
zrot(90) teardrop(r=od/2,h=l); zrot(90) teardrop(r=od/2,h=l);
up(tabh) cube(size=[l,ogap,tab+0.05], center=true);
down(od/4) cube(size=[l,od,od/2], center=true); // Base
cube([l,od,od/2], anchor=TOP);
// Tabs
cube([l,ogap,od/2+tab/2], anchor=BOTTOM);
} }
// Clear bearing space
zrot(90) teardrop(r=d/2,h=l+0.05); zrot(90) teardrop(r=d/2,h=l+0.05);
up((d*sqrt(2)+tab)/2)
cube(size=[l+0.05,gap,d+tab], center=true); // Clear gap
cube([l+0.05,gap,od], anchor=BOTTOM);
up(tabh) { up(tabh) {
fwd(ogap/2-2+0.01) // Screwhole
xrot(90) screw(screwsize=screwsize*1.06, screwlen=ogap, headsize=screwsize*2, headlen=10); fwd(ogap/2-2+0.01) xrot(90) screw(screwsize=screwsize*1.06, screwlen=ogap, headsize=screwsize*2, headlen=10);
back(ogap/2+0.01)
xrot(90) metric_nut(size=screwsize, hole=false); // Nut holder
back(ogap/2-2+0.01) xrot(90) metric_nut(size=screwsize, hole=false);
} }
} }
children(); children();
@ -121,7 +138,7 @@ module linear_bearing_housing(d=15, l=24, tab=7, gap=5, wall=3, tabwall=5, screw
// anchor = Alignment of the housing by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `UP` // anchor = Alignment of the housing by the axis-negative (size1) end. Use the constants from `constants.scad`. Default: `UP`
// Example: // Example:
// lmXuu_housing(size=10, wall=2, tab=6, screwsize=2.5); // lmXuu_housing(size=10, wall=2, tab=6, screwsize=2.5);
module lmXuu_housing(size=8, tab=7, gap=5, wall=3, tabwall=5, screwsize=3, orient=ORIENT_X, anchor=UP) module lmXuu_housing(size=8, tab=7, gap=5, wall=3, tabwall=5, screwsize=3, orient=ORIENT_X, anchor=BOTTOM)
{ {
d = get_lmXuu_bearing_diam(size); d = get_lmXuu_bearing_diam(size);
l = get_lmXuu_bearing_length(size); l = get_lmXuu_bearing_length(size);

View file

@ -164,8 +164,8 @@ module cylinder_mask(
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered. // anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered.
// Example: // Example:
// difference() { // difference() {
// cube(50); // cube(50, anchor=BOTTOM+FRONT);
// #chamfer_mask(l=50, chamfer=10, orient=ORIENT_X, anchor=BOTTOM); // #chamfer_mask(l=50, chamfer=10, orient=ORIENT_X);
// } // }
module chamfer_mask(l=1, chamfer=1, orient=ORIENT_Z, anchor=CENTER) { module chamfer_mask(l=1, chamfer=1, orient=ORIENT_Z, anchor=CENTER) {
orient_and_anchor([chamfer*2, chamfer*2, l], orient, anchor, chain=true) { orient_and_anchor([chamfer*2, chamfer*2, l], orient, anchor, chain=true) {
@ -188,8 +188,8 @@ module chamfer_mask(l=1, chamfer=1, orient=ORIENT_Z, anchor=CENTER) {
// anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered. // anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered.
// Example: // Example:
// difference() { // difference() {
// left(40) cube(80); // cube(50, anchor=BOTTOM+FRONT);
// #chamfer_mask_x(l=80, chamfer=20); // #chamfer_mask_x(l=50, chamfer=10);
// } // }
module chamfer_mask_x(l=1.0, chamfer=1.0, anchor=CENTER) { module chamfer_mask_x(l=1.0, chamfer=1.0, anchor=CENTER) {
chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_X, anchor=anchor) children(); chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_X, anchor=anchor) children();
@ -209,8 +209,8 @@ module chamfer_mask_x(l=1.0, chamfer=1.0, anchor=CENTER) {
// anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered. // anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered.
// Example: // Example:
// difference() { // difference() {
// fwd(40) cube(80); // cube(50, anchor=BOTTOM+RIGHT);
// right(80) #chamfer_mask_y(l=80, chamfer=20); // #chamfer_mask_y(l=50, chamfer=10);
// } // }
module chamfer_mask_y(l=1.0, chamfer=1.0, anchor=CENTER) { module chamfer_mask_y(l=1.0, chamfer=1.0, anchor=CENTER) {
chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_Y, anchor=anchor) children(); chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_Y, anchor=anchor) children();
@ -230,8 +230,8 @@ module chamfer_mask_y(l=1.0, chamfer=1.0, anchor=CENTER) {
// anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered. // anchor = Alignment of the cylinder. Use the constants from constants.h. Default: centered.
// Example: // Example:
// difference() { // difference() {
// down(40) cube(80); // cube(50, anchor=FRONT+RIGHT);
// #chamfer_mask_z(l=80, chamfer=20); // #chamfer_mask_z(l=50, chamfer=10);
// } // }
module chamfer_mask_z(l=1.0, chamfer=1.0, anchor=CENTER) { module chamfer_mask_z(l=1.0, chamfer=1.0, anchor=CENTER) {
chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_Z, anchor=anchor) children(); chamfer_mask(l=l, chamfer=chamfer, orient=ORIENT_Z, anchor=anchor) children();
@ -295,6 +295,11 @@ module chamfer(chamfer=1, size=[1,1,1], edges=EDGES_ALL)
// cylinder(r=50, h=100, center=true); // cylinder(r=50, h=100, center=true);
// up(50) #chamfer_cylinder_mask(r=50, chamfer=10); // up(50) #chamfer_cylinder_mask(r=50, chamfer=10);
// } // }
// Example:
// difference() {
// cylinder(r=50, h=100, center=true);
// up(50) chamfer_cylinder_mask(r=50, chamfer=10);
// }
module chamfer_cylinder_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=false, orient=ORIENT_Z) module chamfer_cylinder_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=false, orient=ORIENT_Z)
{ {
r = get_radius(r=r, d=d, dflt=1); r = get_radius(r=r, d=d, dflt=1);
@ -325,6 +330,12 @@ module chamfer_cylinder_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=fa
// up(50) #chamfer_hole_mask(d=50, chamfer=10); // up(50) #chamfer_hole_mask(d=50, chamfer=10);
// } // }
// Example: // Example:
// difference() {
// cube(100, center=true);
// cylinder(d=50, h=100.1, center=true);
// up(50) chamfer_hole_mask(d=50, chamfer=10);
// }
// Example:
// chamfer_hole_mask(d=100, chamfer=25, ang=30, overage=10); // chamfer_hole_mask(d=100, chamfer=25, ang=30, overage=10);
module chamfer_hole_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=false, overage=0.1, orient=ORIENT_Z, anchor=CENTER) module chamfer_hole_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=false, overage=0.1, orient=ORIENT_Z, anchor=CENTER)
{ {
@ -659,6 +670,12 @@ module rounding_cylinder_mask(r=1.0, rounding=0.25)
// cylinder(r=50, h=100.1, center=true); // cylinder(r=50, h=100.1, center=true);
// up(50) #rounding_hole_mask(r=50, rounding=10); // up(50) #rounding_hole_mask(r=50, rounding=10);
// } // }
// Example(Med):
// difference() {
// cube([150,150,100], center=true);
// cylinder(r=50, h=100.1, center=true);
// up(50) rounding_hole_mask(r=50, rounding=10);
// }
// Example: // Example:
// rounding_hole_mask(r=40, rounding=20, $fa=2, $fs=2); // rounding_hole_mask(r=40, rounding=20, $fa=2, $fs=2);
module rounding_hole_mask(r=undef, d=undef, rounding=0.25, overage=0.1, orient=ORIENT_Z, anchor=CENTER) module rounding_hole_mask(r=undef, d=undef, rounding=0.25, overage=0.1, orient=ORIENT_Z, anchor=CENTER)

View file

@ -393,12 +393,12 @@ module screw(
anchor="base" anchor="base"
) { ) {
sides = max(12, segs(screwsize/2)); sides = max(12, segs(screwsize/2));
algn = countersunk? DOWN : anchor; algn = countersunk? TOP : anchor;
anchors = [ anchors = [
anchorpt("base", [0,0,-headlen/2+screwlen/2]), anchorpt("base", [0,0,-headlen/2+screwlen/2]),
anchorpt("sunken", [0,0,(headlen+screwlen)/2-0.01]) anchorpt("sunken", [0,0,(headlen+screwlen)/2-0.01])
]; ];
orient_and_anchor([headsize, headsize, headlen+screwlen], orient, algn, anchors=anchors, chain=true) { orient_and_anchor([screwsize, screwsize, headlen+screwlen], orient, algn, anchors=anchors, geometry="cylinder", chain=true) {
down(headlen/2-screwlen/2) { down(headlen/2-screwlen/2) {
down(screwlen/2) { down(screwlen/2) {
if (pitch == undef) { if (pitch == undef) {

View file

@ -100,7 +100,7 @@ function nema_motor_screw_depth(size) = lookup(size, [
// shaft = Shaft diameter. Default: 5mm // shaft = Shaft diameter. Default: 5mm
// shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 20mm // shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 20mm
// orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`. // orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `DOWN`. // anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `TOP`.
// Extra Anchors: // Extra Anchors:
// "shaft-top" = The top of the shaft. // "shaft-top" = The top of the shaft.
// "shaft-middle" = The middle of the shaft. // "shaft-middle" = The middle of the shaft.
@ -112,7 +112,7 @@ function nema_motor_screw_depth(size) = lookup(size, [
// "screw4" = The screw-hole in the X+Y- quadrant. // "screw4" = The screw-hole in the X+Y- quadrant.
// Example: // Example:
// nema11_stepper(); // nema11_stepper();
module nema11_stepper(h=24, shaft=5, shaft_len=20, orient=ORIENT_Z, anchor=DOWN) module nema11_stepper(h=24, shaft=5, shaft_len=20, orient=ORIENT_Z, anchor=TOP)
{ {
size = 11; size = 11;
motor_width = nema_motor_width(size); motor_width = nema_motor_width(size);
@ -163,7 +163,7 @@ module nema11_stepper(h=24, shaft=5, shaft_len=20, orient=ORIENT_Z, anchor=DOWN)
// shaft = Shaft diameter. Default: 5mm // shaft = Shaft diameter. Default: 5mm
// shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 24mm // shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 24mm
// orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`. // orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `DOWN`. // anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `TOP`.
// Extra Anchors: // Extra Anchors:
// "shaft-top" = The top of the shaft. // "shaft-top" = The top of the shaft.
// "shaft-middle" = The middle of the shaft. // "shaft-middle" = The middle of the shaft.
@ -175,7 +175,7 @@ module nema11_stepper(h=24, shaft=5, shaft_len=20, orient=ORIENT_Z, anchor=DOWN)
// "screw4" = The screw-hole in the X+Y- quadrant. // "screw4" = The screw-hole in the X+Y- quadrant.
// Example: // Example:
// nema14_stepper(); // nema14_stepper();
module nema14_stepper(h=24, shaft=5, shaft_len=24, orient=ORIENT_Z, anchor=DOWN) module nema14_stepper(h=24, shaft=5, shaft_len=24, orient=ORIENT_Z, anchor=TOP)
{ {
size = 14; size = 14;
motor_width = nema_motor_width(size); motor_width = nema_motor_width(size);
@ -226,7 +226,7 @@ module nema14_stepper(h=24, shaft=5, shaft_len=24, orient=ORIENT_Z, anchor=DOWN)
// shaft = Shaft diameter. Default: 5mm // shaft = Shaft diameter. Default: 5mm
// shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 20mm // shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 20mm
// orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`. // orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `DOWN`. // anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `TOP`.
// Extra Anchors: // Extra Anchors:
// "shaft-top" = The top of the shaft. // "shaft-top" = The top of the shaft.
// "shaft-middle" = The middle of the shaft. // "shaft-middle" = The middle of the shaft.
@ -308,7 +308,7 @@ module nema17_stepper(h=34, shaft=5, shaft_len=20, orient=ORIENT_Z, anchor=TOP)
// shaft = Shaft diameter. Default: 6.35mm // shaft = Shaft diameter. Default: 6.35mm
// shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 25mm // shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 25mm
// orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`. // orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `DOWN`. // anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `TOP`.
// Extra Anchors: // Extra Anchors:
// "shaft-top" = The top of the shaft. // "shaft-top" = The top of the shaft.
// "shaft-middle" = The middle of the shaft. // "shaft-middle" = The middle of the shaft.
@ -373,7 +373,7 @@ module nema23_stepper(h=50, shaft=6.35, shaft_len=25, orient=ORIENT_Z, anchor=TO
// shaft = Shaft diameter. Default: 12.7mm // shaft = Shaft diameter. Default: 12.7mm
// shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 32mm // shaft_len = Length of shaft protruding out the top of the stepper motor. Default: 32mm
// orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`. // orient = Orientation of the stepper. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `DOWN`. // anchor = Alignment of the stepper. Use the constants from `constants.scad`. Default: `TOP`.
// Extra Anchors: // Extra Anchors:
// "shaft-top" = The top of the shaft. // "shaft-top" = The top of the shaft.
// "shaft-middle" = The middle of the shaft. // "shaft-middle" = The middle of the shaft.

View file

@ -207,16 +207,13 @@ module extrude_from_to(pt1, pt2, convexity=undef, twist=undef, scale=undef, slic
// circle(r=40, $fn=6); // circle(r=40, $fn=6);
module extrude_2d_hollow(wall=2, height=50, twist=90, slices=60, center=undef, orient=ORIENT_Z, anchor=BOTTOM) module extrude_2d_hollow(wall=2, height=50, twist=90, slices=60, center=undef, orient=ORIENT_Z, anchor=BOTTOM)
{ {
orient_and_anchor([0,0,height], orient, anchor, center, chain=true) { linear_extrude(height=height, twist=twist, slices=slices, center=true) {
linear_extrude(height=height, twist=twist, slices=slices, center=true) { difference() {
difference() { children();
offset(r=-wall) {
children(); children();
offset(r=-wall) {
children();
}
} }
} }
children();
} }
} }
@ -427,7 +424,7 @@ module trace_polyline(pline, N=1, showpts=false, size=1, color="yellow") {
// points = The array of 2D polygon vertices. // points = The array of 2D polygon vertices.
// paths = The path connections between the vertices. // paths = The path connections between the vertices.
// convexity = The max number of walls a ray can pass through the given polygon paths. // convexity = The max number of walls a ray can pass through the given polygon paths.
// Example(2D): // Example(Big2D):
// debug_polygon( // debug_polygon(
// points=concat( // points=concat(
// path2d_regular_ngon(r=10, n=8), // path2d_regular_ngon(r=10, n=8),

View file

@ -145,11 +145,14 @@ class ImageProcessing(object):
"--imgsize={}".format(imgsizes[0]), "--imgsize={}".format(imgsizes[0]),
"--hardwarnings", "--hardwarnings",
"--projection=o", "--projection=o",
"--view=axes,scales",
"--autocenter", "--autocenter",
"--viewall", "--viewall",
"--camera", eye+",0,0,0" "--camera", eye+",0,0,0"
] ]
if "Edges" in extype: # Force render
scadcmd.extend(["--view=axes,scales,edges"])
else:
scadcmd.extend(["--view=axes,scales"])
if "FR" in extype: # Force render if "FR" in extype: # Force render
scadcmd.extend(["--render", ""]) scadcmd.extend(["--render", ""])
scadcmd.append(scriptfile) scadcmd.append(scriptfile)
@ -174,12 +177,15 @@ class ImageProcessing(object):
"--imgsize={}".format(imgsizes[0]), "--imgsize={}".format(imgsizes[0]),
"--hardwarnings", "--hardwarnings",
"--projection=o", "--projection=o",
"--view=axes,scales",
"--autocenter", "--autocenter",
"--viewall" "--viewall"
] ]
if "2D" in extype: # 2D viewpoint if "2D" in extype: # 2D viewpoint
scadcmd.extend(["--camera", "0,0,0,0,0,0,500"]) scadcmd.extend(["--camera", "0,0,0,0,0,0,500"])
if "Edges" in extype: # Force render
scadcmd.extend(["--view=axes,scales,edges"])
else:
scadcmd.extend(["--view=axes,scales"])
if "FR" in extype: # Force render if "FR" in extype: # Force render
scadcmd.extend(["--render", ""]) scadcmd.extend(["--render", ""])
scadcmd.append(scriptfile) scadcmd.append(scriptfile)

View file

@ -779,7 +779,7 @@ module tube(
od=undef, od1=undef, od2=undef, od=undef, od1=undef, od2=undef,
ir=undef, id=undef, ir1=undef, ir=undef, id=undef, ir1=undef,
ir2=undef, id1=undef, id2=undef, ir2=undef, id1=undef, id2=undef,
center=undef, orient=ORIENT_Z, anchor=UP, center=undef, orient=ORIENT_Z, anchor=BOTTOM,
realign=false realign=false
) { ) {
r1 = first_defined([or1, od1/2, r1, d1/2, or, od/2, r, d/2, ir1+wall, id1/2+wall, ir+wall, id/2+wall]); r1 = first_defined([or1, od1/2, r1, d1/2, or, od/2, r, d/2, ir1+wall, id1/2+wall, ir+wall, id/2+wall]);
@ -1128,7 +1128,7 @@ module pie_slice(
ang=30, l=undef, ang=30, l=undef,
r=10, r1=undef, r2=undef, r=10, r1=undef, r2=undef,
d=undef, d1=undef, d2=undef, d=undef, d1=undef, d2=undef,
orient=ORIENT_Z, anchor=UP, orient=ORIENT_Z, anchor=BOTTOM,
center=undef, h=undef center=undef, h=undef
) { ) {
l = first_defined([l, h, 1]); l = first_defined([l, h, 1]);
@ -1263,9 +1263,9 @@ module slot(
// center = If given and true, centers vertically. If given and false, drops flush with XY plane. Overrides `anchor`. // center = If given and true, centers vertically. If given and false, drops flush with XY plane. Overrides `anchor`.
// $fn2 = The `$fn` value to use on the small round endcaps. The major arcs are still based on `$fn`. Default: `$fn` // $fn2 = The `$fn` value to use on the small round endcaps. The major arcs are still based on `$fn`. Default: `$fn`
// //
// Example: Typical Arced Slot // Example(Med): Typical Arced Slot
// arced_slot(d=60, h=5, sd=10, sa=60, ea=280); // arced_slot(d=60, h=5, sd=10, sa=60, ea=280);
// Example: Conical Arced Slot // Example(Med): Conical Arced Slot
// arced_slot(r=60, h=5, sd1=10, sd2=15, sa=45, ea=180); // arced_slot(r=60, h=5, sd1=10, sd2=15, sa=45, ea=180);
module arced_slot( module arced_slot(
r=undef, d=undef, h=1.0, r=undef, d=undef, h=1.0,

View file

@ -29,7 +29,7 @@
// anchor = Alignment of the slider. Use the constants from `constants.scad`. Default: `UP`. // anchor = Alignment of the slider. Use the constants from `constants.scad`. Default: `UP`.
// Example: // Example:
// slider(l=30, base=10, wall=4, slop=0.2, orient=ORIENT_Y); // slider(l=30, base=10, wall=4, slop=0.2, orient=ORIENT_Y);
module slider(l=30, w=10, h=10, base=10, wall=5, ang=30, slop=PRINTER_SLOP, orient=ORIENT_Y, anchor=UP) module slider(l=30, w=10, h=10, base=10, wall=5, ang=30, slop=PRINTER_SLOP, orient=ORIENT_Y, anchor=BOTTOM)
{ {
full_width = w + 2*wall; full_width = w + 2*wall;
full_height = h + base; full_height = h + base;
@ -37,18 +37,18 @@ module slider(l=30, w=10, h=10, base=10, wall=5, ang=30, slop=PRINTER_SLOP, orie
orient_and_anchor([full_width, l, h+2*base], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([full_width, l, h+2*base], orient, anchor, orig_orient=ORIENT_Y, chain=true) {
down(base+h/2) { down(base+h/2) {
// Base // Base
cuboid([full_width, l, base-slop], chamfer=2, edges=edges([FRONT,BACK], except=BOT), anchor=UP); cuboid([full_width, l, base-slop], chamfer=2, edges=edges([FRONT,BACK], except=BOT), anchor=BOTTOM);
// Wall // Wall
xflip_copy(offset=w/2+slop) { xflip_copy(offset=w/2+slop) {
cuboid([wall, l, full_height], chamfer=2, edges=edges(RIGHT, except=BOT), anchor=UP+RIGHT); cuboid([wall, l, full_height], chamfer=2, edges=edges(RIGHT, except=BOT), anchor=BOTTOM+LEFT);
} }
// Sliders // Sliders
up(base+h/2) { up(base+h/2) {
xflip_copy(offset=w/2+slop+0.02) { xflip_copy(offset=w/2+slop+0.02) {
bev_h = h/2*tan(ang); bev_h = h/2*tan(ang);
prismoid([l, h], [l-w, 0], h=bev_h+0.01, orient=ORIENT_XNEG, anchor=LEFT); prismoid([l, h], [l-w, 0], h=bev_h+0.01, orient=ORIENT_XNEG, anchor=RIGHT);
} }
} }
} }
@ -73,7 +73,7 @@ module slider(l=30, w=10, h=10, base=10, wall=5, ang=30, slop=PRINTER_SLOP, orie
// anchor = Alignment of the rail. Use the constants from `constants.scad`. Default: `UP`. // anchor = Alignment of the rail. Use the constants from `constants.scad`. Default: `UP`.
// Example: // Example:
// rail(l=100, w=10, h=10); // rail(l=100, w=10, h=10);
module rail(l=30, w=10, h=10, chamfer=1.0, ang=30, orient=ORIENT_Y, anchor=UP) module rail(l=30, w=10, h=10, chamfer=1.0, ang=30, orient=ORIENT_Y, anchor=BOTTOM)
{ {
attack_ang = 30; attack_ang = 30;
attack_len = 2; attack_len = 2;
@ -99,7 +99,7 @@ module rail(l=30, w=10, h=10, chamfer=1.0, ang=30, orient=ORIENT_Y, anchor=UP)
y1 = l/2; y1 = l/2;
y2 = y1 - attack_len * cos(attack_ang); y2 = y1 - attack_len * cos(attack_ang);
orient_and_anchor([w, l, h], orient, anchor, orig_orient=ORIENT_Y, chain=true) { orient_and_anchor([w, h, l], orient, anchor, orig_orient=ORIENT_Y, chain=true) {
polyhedron( polyhedron(
convexity=4, convexity=4,
points=[ points=[

View file

@ -97,7 +97,7 @@ module thread_helix(base_d, pitch, thread_depth=undef, thread_angle=15, twist=72
// trapezoidal_threaded_rod(d=10, l=40, pitch=3, thread_angle=15, left_handed=true, starts=3, $fn=36); // trapezoidal_threaded_rod(d=10, l=40, pitch=3, thread_angle=15, left_handed=true, starts=3, $fn=36);
// trapezoidal_threaded_rod(d=25, l=40, pitch=10, thread_depth=8/3, thread_angle=50, starts=4, center=false, $fa=2, $fs=2); // trapezoidal_threaded_rod(d=25, l=40, pitch=10, thread_depth=8/3, thread_angle=50, starts=4, center=false, $fa=2, $fs=2);
// trapezoidal_threaded_rod(d=50, l=35, pitch=8, thread_angle=30, starts=3, bevel=true); // trapezoidal_threaded_rod(d=50, l=35, pitch=8, thread_angle=30, starts=3, bevel=true);
// trapezoidal_threaded_rod(l=25, d=10, pitch=2, thread_angle=15, starts=3, $fa=1, $fs=1, orient=ORIENT_X, anchor=UP); // trapezoidal_threaded_rod(l=25, d=10, pitch=2, thread_angle=15, starts=3, $fa=1, $fs=1, orient=ORIENT_X, anchor=BOTTOM);
module trapezoidal_threaded_rod( module trapezoidal_threaded_rod(
d=10, d=10,
l=100, l=100,
@ -872,7 +872,7 @@ module pco1881_neck(wall=2, orient=ORIENT_Z, anchor="support-ring")
// "inside-top" = Centered on the inside top of the cap. // "inside-top" = Centered on the inside top of the cap.
// Example: // Example:
// pco1881_cap(); // pco1881_cap();
module pco1881_cap(wall=2, orient=ORIENT_Z, anchor=TOP) module pco1881_cap(wall=2, orient=ORIENT_ZNEG, anchor=BOTTOM)
{ {
$fn = segs(33/2); $fn = segs(33/2);
w = 28.58 + 2*wall; w = 28.58 + 2*wall;

View file

@ -33,7 +33,7 @@
// //
// Example: // Example:
// narrowing_strut(w=10, l=100, wall=5, ang=30); // narrowing_strut(w=10, l=100, wall=5, ang=30);
module narrowing_strut(w=10, l=100, wall=5, ang=30, orient=ORIENT_Y, anchor=FRONT) module narrowing_strut(w=10, l=100, wall=5, ang=30, orient=ORIENT_Y, anchor=BOTTOM)
{ {
h = wall + w/2/tan(ang); h = wall + w/2/tan(ang);
size = [w, h, l]; size = [w, h, l];