Merged thinning_wall() and braced_thinning_wall().

This commit is contained in:
Revar Desmera 2019-06-22 23:55:39 -07:00
parent 075172d957
commit 72c2df1ba4

View file

@ -8,6 +8,7 @@
// ``` // ```
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
include <BOSL2/paths.scad>
// Section: Walls // Section: Walls
@ -68,12 +69,13 @@ module narrowing_strut(w=10, l=100, wall=5, ang=30, anchor=BOTTOM, spin=0, orien
// thinning_wall(h, l, thick, [ang], [strut], [wall]); // thinning_wall(h, l, thick, [ang], [strut], [wall]);
// //
// Arguments: // Arguments:
// h = height of wall. // h = Height of wall.
// l = length of wall. If given as a vector of two numbers, specifies bottom and top lengths, respectively. // l = Length of wall. If given as a vector of two numbers, specifies bottom and top lengths, respectively.
// thick = thickness of wall. // thick = Thickness of wall.
// ang = maximum overhang angle of diagonal brace. // wall = The thickness of the thinned portion of the wall.
// strut = the width of the diagonal brace. // ang = Maximum overhang angle of diagonal brace.
// wall = the thickness of the thinned portion of the wall. // braces = If true, adds diagonal crossbraces for strength.
// strut = The width of the borders and diagonal braces.
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER` // anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0` // spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#orient). Default: `UP` // orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#orient). Default: `UP`
@ -82,179 +84,154 @@ module narrowing_strut(w=10, l=100, wall=5, ang=30, anchor=BOTTOM, spin=0, orien
// thinning_wall(h=50, l=80, thick=4); // thinning_wall(h=50, l=80, thick=4);
// Example: Trapezoidal // Example: Trapezoidal
// thinning_wall(h=50, l=[80,50], thick=4); // thinning_wall(h=50, l=[80,50], thick=4);
module thinning_wall(h=50, l=100, thick=5, ang=30, strut=5, wall=2, anchor=CENTER, spin=0, orient=UP) module thinning_wall(h=50, l=100, thick=5, ang=30, braces=false, strut=5, wall=2, anchor=CENTER, spin=0, orient=UP)
{ {
l1 = (l[0] == undef)? l : l[0]; l1 = (l[0] == undef)? l : l[0];
l2 = (l[1] == undef)? l : l[1]; l2 = (l[1] == undef)? l : l[1];
trap_ang = atan2((l2-l1)/2, h); bevel_h = strut + (thick-wall)/2/tan(ang);
corr1 = 1 + sin(trap_ang); cp1 = find_circle_2tangents([0,0,h/2], [l2/2,0,h/2], [l1/2,0,-h/2], r=strut)[0];
corr2 = 1 - sin(trap_ang); cp2 = find_circle_2tangents([0,0,h/2], [l2/2,0,h/2], [l1/2,0,-h/2], r=bevel_h)[0];
cp3 = find_circle_2tangents([0,0,-h/2], [l1/2,0,-h/2], [l2/2,0,h/2], r=bevel_h)[0];
cp4 = find_circle_2tangents([0,0,-h/2], [l1/2,0,-h/2], [l2/2,0,h/2], r=strut)[0];
z1 = h/2; z1 = h/2;
z2 = max(0.1, z1 - strut); z2 = cp1.z;
z3 = max(0.05, z2 - (thick-wall)/2*sin(90-ang)/sin(ang)); z3 = cp2.z;
x1 = l2/2; x1 = l2/2;
x2 = max(0.1, x1 - strut*corr1); x2 = cp1.x;
x3 = max(0.05, x2 - (thick-wall)/2*sin(90-ang)/sin(ang)*corr1); x3 = cp2.x;
x4 = l1/2; x4 = l1/2;
x5 = max(0.1, x4 - strut*corr2); x5 = cp4.x;
x6 = max(0.05, x5 - (thick-wall)/2*sin(90-ang)/sin(ang)*corr2); x6 = cp3.x;
y1 = thick/2; y1 = thick/2;
y2 = y1 - min(z2-z3, x2-x3) * sin(ang); y2 = wall/2;
corner1 = [ x2, 0, z2];
corner2 = [-x5, 0, -z2];
brace_len = norm(corner1-corner2);
size = [l1, thick, h]; size = [l1, thick, h];
orient_and_anchor(size, orient, anchor, spin=spin, size2=[l2,thick], chain=true) { orient_and_anchor(size, orient, anchor, spin=spin, size2=[l2,thick], chain=true) {
polyhedron(
points=[
[-x4, -y1, -z1],
[ x4, -y1, -z1],
[ x1, -y1, z1],
[-x1, -y1, z1],
[-x5, -y1, -z2],
[ x5, -y1, -z2],
[ x2, -y1, z2],
[-x2, -y1, z2],
[-x6, -y2, -z3],
[ x6, -y2, -z3],
[ x3, -y2, z3],
[-x3, -y2, z3],
[-x4, y1, -z1],
[ x4, y1, -z1],
[ x1, y1, z1],
[-x1, y1, z1],
[-x5, y1, -z2],
[ x5, y1, -z2],
[ x2, y1, z2],
[-x2, y1, z2],
[-x6, y2, -z3],
[ x6, y2, -z3],
[ x3, y2, z3],
[-x3, y2, z3],
],
faces=[
[ 4, 5, 1],
[ 5, 6, 2],
[ 6, 7, 3],
[ 7, 4, 0],
[ 4, 1, 0],
[ 5, 2, 1],
[ 6, 3, 2],
[ 7, 0, 3],
[ 8, 9, 5],
[ 9, 10, 6],
[10, 11, 7],
[11, 8, 4],
[ 8, 5, 4],
[ 9, 6, 5],
[10, 7, 6],
[11, 4, 7],
[11, 10, 9],
[20, 21, 22],
[11, 9, 8],
[20, 22, 23],
[16, 17, 21],
[17, 18, 22],
[18, 19, 23],
[19, 16, 20],
[16, 21, 20],
[17, 22, 21],
[18, 23, 22],
[19, 20, 23],
[12, 13, 17],
[13, 14, 18],
[14, 15, 19],
[15, 12, 16],
[12, 17, 16],
[13, 18, 17],
[14, 19, 18],
[15, 16, 19],
[ 0, 1, 13],
[ 1, 2, 14],
[ 2, 3, 15],
[ 3, 0, 12],
[ 0, 13, 12],
[ 1, 14, 13],
[ 2, 15, 14],
[ 3, 12, 15],
],
convexity=6
);
children();
}
}
// Module: braced_thinning_wall()
//
// Description:
// Makes a rectangular wall with cross-bracing, which thins to a smaller width in the center,
// with angled supports to prevent critical overhangs.
//
// Usage:
// braced_thinning_wall(h, l, thick, [ang], [strut], [wall]);
//
// Arguments:
// h = height of wall.
// l = length of wall.
// thick = thickness of wall.
// ang = maximum overhang angle of diagonal brace.
// strut = the width of the diagonal brace.
// wall = the thickness of the thinned portion of the wall.
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#orient). Default: `UP`
//
// Example:
// braced_thinning_wall(h=50, l=100, thick=5);
module braced_thinning_wall(h=50, l=100, thick=5, ang=30, strut=5, wall=2, anchor=CENTER, spin=0, orient=UP)
{
dang = atan((h-2*strut)/(l-2*strut));
dlen = (h-2*strut)/sin(dang);
size = [l, thick, h];
orient_and_anchor(size, orient, anchor, spin=spin, chain=true) {
union() { union() {
xrot_copies([0, 180]) { polyhedron(
down(h/2) narrowing_strut(w=thick, l=l, wall=strut, ang=ang); points=[
fwd(l/2) xrot(-90) narrowing_strut(w=thick, l=h-0.1, wall=strut, ang=ang); [-x4, -y1, -z1],
intersection() { [ x4, -y1, -z1],
cube(size=[thick, l, h], center=true); [ x1, -y1, z1],
xrot_copies([-dang,dang]) { [-x1, -y1, z1],
zspread(strut/2) {
scale([1,1,1.5]) yrot(45) { [-x5, -y1, -z2],
cube(size=[thick/sqrt(2), dlen, thick/sqrt(2)], center=true); [ x5, -y1, -z2],
} [ x2, -y1, z2],
[-x2, -y1, z2],
[-x6, -y2, -z3],
[ x6, -y2, -z3],
[ x3, -y2, z3],
[-x3, -y2, z3],
[-x4, y1, -z1],
[ x4, y1, -z1],
[ x1, y1, z1],
[-x1, y1, z1],
[-x5, y1, -z2],
[ x5, y1, -z2],
[ x2, y1, z2],
[-x2, y1, z2],
[-x6, y2, -z3],
[ x6, y2, -z3],
[ x3, y2, z3],
[-x3, y2, z3],
],
faces=[
[ 4, 5, 1],
[ 5, 6, 2],
[ 6, 7, 3],
[ 7, 4, 0],
[ 4, 1, 0],
[ 5, 2, 1],
[ 6, 3, 2],
[ 7, 0, 3],
[ 8, 9, 5],
[ 9, 10, 6],
[10, 11, 7],
[11, 8, 4],
[ 8, 5, 4],
[ 9, 6, 5],
[10, 7, 6],
[11, 4, 7],
[11, 10, 9],
[20, 21, 22],
[11, 9, 8],
[20, 22, 23],
[16, 17, 21],
[17, 18, 22],
[18, 19, 23],
[19, 16, 20],
[16, 21, 20],
[17, 22, 21],
[18, 23, 22],
[19, 20, 23],
[12, 13, 17],
[13, 14, 18],
[14, 15, 19],
[15, 12, 16],
[12, 17, 16],
[13, 18, 17],
[14, 19, 18],
[15, 16, 19],
[ 0, 1, 13],
[ 1, 2, 14],
[ 2, 3, 15],
[ 3, 0, 12],
[ 0, 13, 12],
[ 1, 14, 13],
[ 2, 15, 14],
[ 3, 12, 15],
],
convexity=6
);
if(braces) {
bracepath = [
[-strut*0.33,thick/2],
[ strut*0.33,thick/2],
[ strut*0.33+(thick-wall)/2/tan(ang), wall/2],
[ strut*0.33+(thick-wall)/2/tan(ang),-wall/2],
[ strut*0.33,-thick/2],
[-strut*0.33,-thick/2],
[-strut*0.33-(thick-wall)/2/tan(ang),-wall/2],
[-strut*0.33-(thick-wall)/2/tan(ang), wall/2]
];
xflip_copy() {
difference() {
extrude_from_to(corner1,corner2) {
polygon(bracepath);
} }
cube(size=[thick, dlen, strut/2], center=true);
} }
} }
} }
cube(size=[wall, l-0.1, h-0.1], center=true);
} }
children(); children();
} }
} }
// Module: thinning_triangle() // Module: thinning_triangle()
// //
// Description: // Description: