mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2024-12-29 16:29:40 +00:00
Merged thinning_wall() and braced_thinning_wall().
This commit is contained in:
parent
075172d957
commit
72c2df1ba4
1 changed files with 131 additions and 154 deletions
285
walls.scad
285
walls.scad
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue