210 lines
5.1 KiB
OpenSCAD
210 lines
5.1 KiB
OpenSCAD
|
ep = 0.01;
|
||
|
t = 3; // thickness
|
||
|
w = 32; // width
|
||
|
dt = 36; // door thickness
|
||
|
|
||
|
hookDescent = 100;
|
||
|
backDescent = dt / 3;
|
||
|
|
||
|
module backSupport(descent, rakeAngle = 20) {
|
||
|
topExt = sin(rakeAngle)*descent;
|
||
|
|
||
|
difference() {
|
||
|
union() {
|
||
|
cube([t, descent, w]);
|
||
|
|
||
|
translate([topExt, -1, 0])
|
||
|
rotate([0, 0, rakeAngle])
|
||
|
translate([0, -t, 0])
|
||
|
cube([t, descent + t, w]);
|
||
|
|
||
|
cube([topExt, t, w]);
|
||
|
}
|
||
|
|
||
|
union() {
|
||
|
translate([-ep, -2*t, -ep])
|
||
|
cube([topExt + 2*t, 2*t, w + 2*ep]);
|
||
|
|
||
|
translate([topExt + 2*t/3, -ep, -ep])
|
||
|
cube([t, descent, w + 2*ep]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module hookAndSupport(descent, hookSize = 32, angle = 45, debug=false) {
|
||
|
hw = hookSize / 2;
|
||
|
hookDist = hookSize * 2.5;
|
||
|
hookOffsetX = sin(angle) * hookDist;
|
||
|
hookOffsetY = cos(angle) * hookDist;
|
||
|
|
||
|
fpr = 2/5; // frame attachment point ratio
|
||
|
aBAF = (90 - angle)/2;
|
||
|
l = hookDist;
|
||
|
lAC = hookDist * fpr;
|
||
|
lCG = lAC * sin(angle);
|
||
|
lCD = hookOffsetX;
|
||
|
lCE = lCG/cos(angle);
|
||
|
lAF = lAC*cos(angle) / cos(aBAF);
|
||
|
lGE = lCE*sin(angle);
|
||
|
lGF = lAF*sin(aBAF);
|
||
|
lCF = lCG + lGF;
|
||
|
lEF = sqrt(lGE*lGE + lGF*lGF);
|
||
|
lCI = lCF*cos(angle);
|
||
|
lFI = lCF*sin(angle);
|
||
|
lDI = lCD - lCI;
|
||
|
lDF = sqrt(lDI*lDI + lEF*lEF);
|
||
|
aGEF = atan(lGF/lGE);
|
||
|
aCAE = 90 - angle;
|
||
|
aCEF = aCAE + aGEF;
|
||
|
aEDF = atan(lFI/lDI) + 1;
|
||
|
|
||
|
phi = (90 - angle)/2;
|
||
|
g0 = l*fpr;
|
||
|
g1 = g0*sin(angle);
|
||
|
g2 = (g0 * cos(angle) * sin(phi))/cos(phi);
|
||
|
o = (g0 * cos(angle))/cos(phi);
|
||
|
p1 = (g0 * sin(angle))/cos(angle);
|
||
|
|
||
|
translate([t/4, descent - t, 0])
|
||
|
union() {
|
||
|
color("Salmon")
|
||
|
translate([-hookOffsetX, -hookOffsetY, 0])
|
||
|
sphere(hookSize / 2);
|
||
|
|
||
|
translate([0, 0, -hw/2])
|
||
|
union() {
|
||
|
color("LightBlue")
|
||
|
rotate([0, 0, 270 - angle])
|
||
|
translate([-t/2, -t/2, 0])
|
||
|
cube([hookDist + t, t, hw]);
|
||
|
|
||
|
color("LightGreen")
|
||
|
translate([0, -lAC, 0])
|
||
|
rotate([0, 0, 180 - angle])
|
||
|
translate([-t/2, -t/2, 0])
|
||
|
cube([lCF + t/2, t, hw]);
|
||
|
|
||
|
color("Orange")
|
||
|
rotate([0, 0, aBAF + 180])
|
||
|
translate([-t/2, -t/2, 0])
|
||
|
cube([lAF + t/2, t, hw]);
|
||
|
|
||
|
color("Plum")
|
||
|
translate([-lCD, -g0 -t/2, 0])
|
||
|
cube([lCD + t/2, t, hw]);
|
||
|
|
||
|
color("Turquoise")
|
||
|
translate([-lCE, -lAC, 0])
|
||
|
rotate([0, 0, aCEF])
|
||
|
translate([-t/2, -t/2, 0])
|
||
|
cube([lEF + t/2, t, hw]);
|
||
|
|
||
|
color("SlateBlue")
|
||
|
translate([-lCD + t/2, -lAC, 0])
|
||
|
rotate([0, 0, aEDF])
|
||
|
translate([-t/2, -t/2, 0])
|
||
|
cube([lDF + t/2, t, hw]);
|
||
|
|
||
|
color("Linen")
|
||
|
translate([-lCD, -2*lAC, 0])
|
||
|
cube([t, lAC, hw]);
|
||
|
|
||
|
$fn=32;
|
||
|
color("DodgerBlue")
|
||
|
linear_extrude(height=hw)
|
||
|
circle(r = t);
|
||
|
|
||
|
translate([-lCI, -lAC + lFI, 0])
|
||
|
color("DodgerBlue")
|
||
|
linear_extrude(height=hw)
|
||
|
circle(r = t);
|
||
|
|
||
|
translate([-lCD + t/2, -lAC, 0])
|
||
|
color("DodgerBlue")
|
||
|
linear_extrude(height=hw)
|
||
|
circle(r = t);
|
||
|
|
||
|
}
|
||
|
|
||
|
// Point Labels
|
||
|
if (debug) {
|
||
|
color("Red")
|
||
|
translate([0, 0, w/2+1])
|
||
|
union() {
|
||
|
translate([-t/2, 0, 0])
|
||
|
rotate([180, 0, 0])
|
||
|
linear_extrude(height=1) text(text = "A",size = 4);
|
||
|
|
||
|
translate([-hookOffsetX + t/2, -hookOffsetY + t/2, 0])
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "B",size = 4);
|
||
|
|
||
|
translate([t/2, -lAC + t/2, 0])
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "C",size = 4);
|
||
|
|
||
|
translate([-hookOffsetX + t/2, -lAC, 0]) union() {
|
||
|
translate([0, -hookOffsetY + lAC, 0])
|
||
|
cube([0.5, hookOffsetY - lAC, 1]);
|
||
|
|
||
|
translate([0, t/2, 0])
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "D",size = 4);
|
||
|
}
|
||
|
|
||
|
translate([-lCE + t/2, -lAC + t/2, 0])
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "E",size = 4);
|
||
|
|
||
|
translate([-t/2, 0, 0])
|
||
|
rotate([0, 0, aBAF])
|
||
|
translate([-lAF + t/2, 0, 0])
|
||
|
rotate([0, 0, 180 - aBAF])
|
||
|
linear_extrude(height=1) text(text = "F",size = 4);
|
||
|
|
||
|
translate([0, -lAC + t/2, 0])
|
||
|
rotate([0, 0, -angle])
|
||
|
translate([-lCG + t/2, 0, 0])
|
||
|
rotate([0, 0, 180 + angle])
|
||
|
linear_extrude(height=1) text(text = "G",size = 4);
|
||
|
|
||
|
translate([-lCE, 0, 0])
|
||
|
union() {
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "H",size = 4);
|
||
|
|
||
|
translate([0, -lAC, 0])
|
||
|
cube([0.5, lAC, 1]);
|
||
|
|
||
|
cube([lCE, 0.5, 1]);
|
||
|
}
|
||
|
|
||
|
union() {
|
||
|
translate([-lCI - t, -lAC + t/2, 0])
|
||
|
rotate([0, 0, 180])
|
||
|
linear_extrude(height=1) text(text = "I",size = 4);
|
||
|
translate([-lCI, -lAC, 0])
|
||
|
cube([0.5, lFI, 1]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
union() {
|
||
|
translate([0, 0, -w/2]) union() {
|
||
|
color("Moccasin")
|
||
|
translate([t, 0, 0])
|
||
|
cube([dt + 2*ep, t, w]);
|
||
|
|
||
|
color("WhiteSmoke")
|
||
|
cube([t, hookDescent, w]);
|
||
|
|
||
|
color("WhiteSmoke")
|
||
|
translate([dt + t, 0, 0])
|
||
|
backSupport(descent = backDescent, rakeAngle = 36);
|
||
|
}
|
||
|
|
||
|
hookAndSupport(descent = hookDescent, hookSize = w, angle = 36, debug=false);
|
||
|
}
|