Fixed wedge/triangle shapes anchoring issues.

This commit is contained in:
Revar Desmera 2023-03-28 20:39:37 -07:00
parent 9b150c9728
commit cc14ca2872
2 changed files with 48 additions and 14 deletions

View file

@ -839,13 +839,20 @@ module octagon(r, d, or, od, ir, id, side, rounding=0, realign=false, align_tip,
// --- // ---
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER` // 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` // spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// Extra Anchors:
// hypot = Center of angled side, perpendicular to that side.
// Example(2D): // Example(2D):
// right_triangle([40,30]); // right_triangle([40,30]);
// Example(2D): With `center=true` // Example(2D): With `center=true`
// right_triangle([40,30], center=true); // right_triangle([40,30], center=true);
// Example(2D): Anchors // Example(2D): Standard Anchors
// right_triangle([40,30]) // right_triangle([80,30], center=true)
// show_anchors(); // show_anchors(custom=false);
// color([0.5,0.5,0.5,0.1])
// square([80,30], center=true);
// Example(2D): Named Anchors
// right_triangle([80,30], center=true)
// show_anchors(std=false);
function right_triangle(size=[1,1], center, anchor, spin=0) = function right_triangle(size=[1,1], center, anchor, spin=0) =
let( let(
size = is_num(size)? [size,size] : size, size = is_num(size)? [size,size] : size,
@ -854,15 +861,21 @@ function right_triangle(size=[1,1], center, anchor, spin=0) =
assert(is_vector(size,2)) assert(is_vector(size,2))
assert(min(size)>0, "Must give positive size") assert(min(size)>0, "Must give positive size")
let( let(
path = [ [size.x/2,-size.y/2], [-size.x/2,-size.y/2], [-size.x/2,size.y/2] ] path = [ [size.x/2,-size.y/2], [-size.x/2,-size.y/2], [-size.x/2,size.y/2] ],
) reorient(anchor,spin, two_d=true, size=[size.x,size.y], size2=0, shift=-size.x/2, p=path); anchors = [
named_anchor("hypot", CTR, unit([size.y,size.x])),
]
) reorient(anchor,spin, two_d=true, size=[size.x,size.y], anchors=anchors, p=path);
module right_triangle(size=[1,1], center, anchor, spin=0) { module right_triangle(size=[1,1], center, anchor, spin=0) {
size = is_num(size)? [size,size] : size; size = is_num(size)? [size,size] : size;
anchor = get_anchor(anchor, center, [-1,-1], [-1,-1]); anchor = get_anchor(anchor, center, [-1,-1], [-1,-1]);
check = assert(is_vector(size,2)); check = assert(is_vector(size,2));
path = right_triangle(size, center=true); path = right_triangle(size, anchor="origin");
attachable(anchor,spin, two_d=true, size=[size.x,size.y], size2=0, shift=-size.x/2) { anchors = [
named_anchor("hypot", CTR, unit([size.y,size.x])),
];
attachable(anchor,spin, two_d=true, size=[size.x,size.y], anchors=anchors) {
polygon(path); polygon(path);
children(); children();
} }
@ -1062,7 +1075,7 @@ function trapezoid(h, w1, w2, ang, shift, chamfer=0, rounding=0, flip=false, anc
module trapezoid(h, w1, w2, ang, shift, chamfer=0, rounding=0, flip=false, anchor=CENTER, spin=0, atype="box", angle) { module trapezoid(h, w1, w2, ang, shift, chamfer=0, rounding=0, flip=false, anchor=CENTER, spin=0, atype="box", angle) {
path_over = trapezoid(h=h, w1=w1, w2=w2, ang=ang, shift=shift, chamfer=chamfer, rounding=rounding, path_over = trapezoid(h=h, w1=w1, w2=w2, ang=ang, shift=shift, chamfer=chamfer, rounding=rounding,
flip=flip, angle=angle,atype=atype,_return_override=true); flip=flip, angle=angle,atype=atype,anchor="origin",_return_override=true);
path=path_over[0]; path=path_over[0];
override = path_over[1]; override = path_over[1];
ang = force_list(ang,2); ang = force_list(ang,2);

View file

@ -1111,19 +1111,35 @@ function rect_tube(
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0` // 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` // orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
// //
// Extra Anchors:
// hypot = Center of angled wedge face, perpendicular to that face.
// hypot_left = Left side of angled wedge face, bisecting the angle between the left side and angled faces.
// hypot_right = Right side of angled wedge face, bisecting the angle between the right side and angled faces.
//
// Example: Centered // Example: Centered
// wedge([20, 40, 15], center=true); // wedge([20, 40, 15], center=true);
// Example: *Non*-Centered // Example: *Non*-Centered
// wedge([20, 40, 15]); // wedge([20, 40, 15]);
// Example: Standard Connectors // Example: Standard Anchors
// wedge([20, 40, 15]) show_anchors(); // wedge([40, 80, 30], center=true)
// show_anchors(custom=false);
// color([0.5,0.5,0.5,0.1])
// cube([40, 80, 30], center=true);
// Example: Named Anchors
// wedge([40, 80, 30], center=true)
// show_anchors(std=false);
module wedge(size=[1, 1, 1], center, anchor, spin=0, orient=UP) module wedge(size=[1, 1, 1], center, anchor, spin=0, orient=UP)
{ {
size = scalar_vec3(size); size = scalar_vec3(size);
anchor = get_anchor(anchor, center, -[1,1,1], -[1,1,1]); anchor = get_anchor(anchor, center, -[1,1,1], -[1,1,1]);
vnf = wedge(size, center=true); vnf = wedge(size, anchor="origin");
attachable(anchor,spin,orient, size=size, size2=[size.x,0], shift=[0,-size.y/2]) { anchors = [
named_anchor("hypot", CTR, unit([0,size.z,size.y],UP)),
named_anchor("hypot_left", [-size.x/2,0,0], unit(unit([0,size.z,size.y],UP)+LEFT)),
named_anchor("hypot_right", [size.x/2,0,0], unit(unit([0,size.z,size.y],UP)+RIGHT)),
];
attachable(anchor,spin,orient, size=size, anchors=anchors) {
if (size.z > 0) { if (size.z > 0) {
vnf_polyhedron(vnf); vnf_polyhedron(vnf);
} }
@ -1144,9 +1160,14 @@ function wedge(size=[1,1,1], center, anchor, spin=0, orient=UP) =
[0,1,2], [3,5,4], [0,3,1], [1,3,4], [0,1,2], [3,5,4], [0,3,1], [1,3,4],
[1,4,2], [2,4,5], [2,5,3], [0,2,3], [1,4,2], [2,4,5], [2,5,3], [0,2,3],
], ],
vnf = [scale(size/2,p=pts), faces] vnf = [scale(size/2,p=pts), faces],
anchors = [
named_anchor("hypot", CTR, unit([0,size.z,size.y],UP)),
named_anchor("hypot_left", [-size.x/2,0,0], unit(unit([0,size.z,size.y],UP)+LEFT)),
named_anchor("hypot_right", [size.x/2,0,0], unit(unit([0,size.z,size.y],UP)+RIGHT)),
]
) )
reorient(anchor,spin,orient, size=size, size2=[size.x,0], shift=[0,-size.y/2], p=vnf); reorient(anchor,spin,orient, size=size, anchors=anchors, p=vnf);
// Section: Cylinders // Section: Cylinders