added all the scad files I could find
This commit is contained in:
parent
652ed93f6b
commit
3a6756e716
24 changed files with 1443 additions and 0 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,7 @@
|
|||
*.3mf
|
||||
*.stl
|
||||
*.gcode
|
||||
|
||||
# ---> Python
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
|
|
10
bedclip/README.md
Normal file
10
bedclip/README.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
bedclip for clipping stuff like my glasses to the rail on the headboard of my bed.
|
||||
|
||||
bedclip_thin_backhook7 is the most recent redesign, it (and likely any future designs) implement some important differences from previous attempts.
|
||||
|
||||
* It is designed with an aggressive inward rake on both of the clip arms
|
||||
* It relies on the flexibility of PETG to snap firmly onto the rail (which varies in width slightly from one side to the other)
|
||||
* It applies tension near the bottom of the clip and pulls itself onto the rail when , unlike prior designs which seated firmly but had a tendency for the back to pop up onto a diagonal under tension.
|
||||
* The hook is bigger to make it easier to hook stuff onto it blindly.
|
||||
|
||||
Overall as of version 7, it's working quite well and is quite stable and secure across the whole rail.
|
41
bedclip/bedclip.scad
Normal file
41
bedclip/bedclip.scad
Normal file
|
@ -0,0 +1,41 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) rotate([0,5,0]) rail_latch(5,5,30,1);
|
||||
translate([-raild/2-2,0,-5]) rotate([0,-5,0]) rail_latch(5,5,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,5,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-38,1,10]) rotate([0,-90,0]) hook();
|
||||
rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
hooked_rail_clip();
|
42
bedclip/bedclip_thin.scad
Normal file
42
bedclip/bedclip_thin.scad
Normal file
|
@ -0,0 +1,42 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
clipt = 3;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) rotate([0,5,0]) rail_latch(5,clipt,30,1);
|
||||
translate([-raild/2-2,0,-5]) rotate([0,-5,0]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-38,1,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,1,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
hooked_rail_clip();
|
55
bedclip/bedclip_thin_backhook.scad
Normal file
55
bedclip/bedclip_thin_backhook.scad
Normal file
|
@ -0,0 +1,55 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
clipt = 3;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
rotate([0,m*5,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,-8]) cube([x+2.5,y,z+15], center=true);
|
||||
translate([-3,0,-29]) cube([x+2.5,y,3], center=true);
|
||||
translate([-2.35,0,-25.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,30,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,1,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,1,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
55
bedclip/bedclip_thin_backhook2.scad
Normal file
55
bedclip/bedclip_thin_backhook2.scad
Normal file
|
@ -0,0 +1,55 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
clipt = 3;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
rotate([0,m*5,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-29]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.15,0,-25.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,30,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,1,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,1,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
55
bedclip/bedclip_thin_backhook3.scad
Normal file
55
bedclip/bedclip_thin_backhook3.scad
Normal file
|
@ -0,0 +1,55 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
clipt = 3;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
rotate([0,m*5,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,2.99]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-23]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.15,0,-19.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,24,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,1,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,1,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
56
bedclip/bedclip_thin_backhook4.scad
Normal file
56
bedclip/bedclip_thin_backhook4.scad
Normal file
|
@ -0,0 +1,56 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 7;
|
||||
clipt = 3;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
translate([1.1,0,0]) rotate([0,m*7,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.15,0,-23.5]) rotate([0,40,0]) cube([x-0.5,y,7], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,1,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,1,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
55
bedclip/bedclip_thin_backhook5.scad
Normal file
55
bedclip/bedclip_thin_backhook5.scad
Normal file
|
@ -0,0 +1,55 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 5;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
translate([1.1,0,0]) rotate([0,m*7,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.85,0,-22.2]) rotate([0,30,0]) #cube([x+0.5,y,12], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,3.251]) cube([3,3,6.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,3/2,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,clipt/2,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
56
bedclip/bedclip_thin_backhook6.scad
Normal file
56
bedclip/bedclip_thin_backhook6.scad
Normal file
|
@ -0,0 +1,56 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 5;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
translate([1.1,0,0]) rotate([0,m*7,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.85,0,-22.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true);
|
||||
translate([-1.85,0,-19.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,4.251]) cube([3,3,8.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([4.5,0,8.5+1.5]) cube([12,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,3/2,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,clipt/2,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
73
bedclip/bedclip_thin_backhook7.scad
Normal file
73
bedclip/bedclip_thin_backhook7.scad
Normal file
|
@ -0,0 +1,73 @@
|
|||
raild = 64.9;
|
||||
railh = 18.5;
|
||||
clipt = 5;
|
||||
|
||||
module rail_latch(x, y, z, m) {
|
||||
translate([1.1,0,0]) rotate([0,m*7,0]) difference() {
|
||||
cube([x,y,z], center=true);
|
||||
translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
module back_latch(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true);
|
||||
translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.85,0,-22.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true);
|
||||
translate([-1.85,0,-19.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module back_latch2(x, y, z, m) {
|
||||
|
||||
union() {
|
||||
translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+19], center=true);
|
||||
translate([-3,0,-28.25]) cube([x-0.5,y,3], center=true);
|
||||
translate([-1.85,0,-24.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true);
|
||||
//translate([-1.85,0,-21.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true);
|
||||
//translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
//translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module rail_clip() {
|
||||
//cube([raild, clipt, railh], center=true);
|
||||
union() {
|
||||
//color([1,0,1,0.2]) translate([raild/2+2,0.1,-5]) back_latch(5,clipt,27,1);
|
||||
translate([raild/2+4,0,-5]) rotate([0,10,0]) back_latch2(5,clipt,27,1);
|
||||
translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1);
|
||||
translate([2.5,0,railh/2+3.5]) cube([81.5,clipt,7], center=true);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
module hook() {
|
||||
union() {
|
||||
translate([0,0,4.251]) cube([3,3,8.502], center=true);
|
||||
//translate([0,0,6.5+1.5]) cube([3,3,3], center=true);
|
||||
//translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4);
|
||||
translate([4.5,0,8.5+1.5]) cube([12,3,3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module hooked_rail_clip() {
|
||||
union() {
|
||||
translate([-37.5,3/2,10]) rotate([0,-90,0]) hook();
|
||||
translate([0,clipt/2,0]) rail_clip();
|
||||
}
|
||||
}
|
||||
|
||||
rotate([90,0,0]) hooked_rail_clip();
|
184
electronics_box/Ebox.scad
Normal file
184
electronics_box/Ebox.scad
Normal file
|
@ -0,0 +1,184 @@
|
|||
pcb_w = 80.1;
|
||||
pcb_h = 105.0;
|
||||
pcb_t = 1.85;
|
||||
e = 0.001;
|
||||
clear = 10;
|
||||
wall_t = 1.5;
|
||||
box_t = 26;
|
||||
hole_diameter = 2.5;
|
||||
hole_in=72.9;
|
||||
hole_ctoc = hole_in + hole_diameter;
|
||||
hole_out = 77.9;
|
||||
hole_x_edge = 0.7;
|
||||
hole_y_edge = 1.2;
|
||||
midpair_y_dist = 73.15;
|
||||
botpair_y_dist = 21.8;
|
||||
bat_h = 26.5;
|
||||
batr_h = 24.5;
|
||||
bat_w = 51.8;
|
||||
bat_t = 17.1;
|
||||
batc_h = 36;
|
||||
batc_w = 68;
|
||||
standoff= 12;
|
||||
pin_t = 4.5;
|
||||
pin_dia = 2.0;
|
||||
pin_t2 = 6;
|
||||
pin_dia2 = 4.5;
|
||||
screen_t = 5.1;
|
||||
|
||||
|
||||
function allclear() = clear + wall_t;
|
||||
function toppair_y() = (pcb_h/2)-hole_y_edge-(hole_diameter/2);
|
||||
function toppair_x() = (pcb_w/2)-hole_x_edge-(hole_diameter/2);
|
||||
function wall_x() = (pcb_w/2)+allclear()/2-wall_t/2;
|
||||
function wall_y() = (pcb_h/2)+allclear()/2-wall_t/2;
|
||||
function midpair_x() = toppair_x();
|
||||
function midpair_y() = toppair_y() - midpair_y_dist - hole_diameter;
|
||||
function botpair_x() = toppair_x();
|
||||
function botpair_y() = midpair_y() - botpair_y_dist - hole_diameter;
|
||||
function pin_z() = pin_t2/2 + pin_t/2;
|
||||
function pin_zs() = pin_t2/2;
|
||||
function pin_zh(x) = pin_t2 + pin_t + x;
|
||||
function batc_pyramid() = batc_h/sin(45)/2;
|
||||
function batc_top() = pcb_h/2-bat_h/2-allclear()/2+batc_h/2;
|
||||
function batc_bot() = pcb_h/2-bat_h/2-allclear()/2-batc_h/2;
|
||||
function batc_cent() = pcb_h/2-bat_h/2-allclear()/2;
|
||||
|
||||
module boxbottom() {
|
||||
difference() {
|
||||
union() {
|
||||
translate([0,0,-wall_t+e]) linear_extrude(wall_t) square([pcb_w+allclear(), pcb_h+allclear()], center=true);
|
||||
|
||||
|
||||
// hole pins
|
||||
translate([toppair_x(), toppair_y(), pin_z()+pcb_t]) cylinder(h = pin_zh(pcb_t), r = pin_dia/2, center=true, $fn=40);
|
||||
translate([-toppair_x(), toppair_y(), pin_z()+pcb_t]) cylinder(h = pin_zh(pcb_t), r = pin_dia/2, center=true, $fn=40);
|
||||
translate([midpair_x(), midpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40);
|
||||
translate([-midpair_x(), midpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40);
|
||||
translate([botpair_x(), botpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40);
|
||||
translate([-botpair_x(), botpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40);
|
||||
|
||||
// standoff pins
|
||||
translate([toppair_x(), toppair_y(), pin_zs()+pcb_t/2]) cylinder(h = pin_zs()*2+pcb_t, r = pin_dia2/2, center=true, $fn=40);
|
||||
translate([-toppair_x(), toppair_y(), pin_zs()+pcb_t/2]) cylinder(h = pin_zs()*2+pcb_t, r = pin_dia2/2, center=true, $fn=40);
|
||||
translate([midpair_x(), midpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40);
|
||||
translate([-midpair_x(), midpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40);
|
||||
translate([botpair_x(), botpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40);
|
||||
translate([-botpair_x(), botpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40);
|
||||
|
||||
|
||||
|
||||
// corners
|
||||
//translate([wall_x(), wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true);
|
||||
//translate([-wall_x(), wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true);
|
||||
//translate([wall_x(), -wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true);
|
||||
//translate([-wall_x(), -wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true);
|
||||
|
||||
|
||||
// walls
|
||||
translate([wall_x(), 0, box_t/2]) cube([wall_t, pcb_h+allclear(), box_t], center=true);
|
||||
translate([-wall_x(), 0, box_t/2]) cube([wall_t, pcb_h+allclear(), box_t], center=true);
|
||||
translate([0, wall_y(), box_t/2]) cube([pcb_w+allclear(), wall_t,box_t], center=true);
|
||||
translate([0, -wall_y(), box_t/2]) cube([pcb_w+allclear(), wall_t, box_t], center=true);
|
||||
|
||||
// battery compartment
|
||||
translate([0,pcb_h/2-bat_h/2-allclear()/2,-1]) linear_extrude(3) square([batc_w+clear-e, batc_h+clear*1.2-e], center=true);
|
||||
|
||||
}
|
||||
union() {
|
||||
|
||||
translate([0,pcb_h/2-bat_h/2-allclear()/2,-wall_t]) linear_extrude(wall_t+e) square([batc_w, batc_h], center=true);
|
||||
//translate([0,pcb_h/2-bat_h/2-allclear()/2,0]) linear_extrude(wall_t*3+e) square([batc_w/2, batc_h+2], center=true);
|
||||
|
||||
// latch cuts
|
||||
translate([-15,batc_top()-batc_h/4+4,0]) linear_extrude(wall_t*3+e) square([15, batc_h/2], center=true);
|
||||
translate([15,batc_top()-batc_h/4+4,0]) linear_extrude(wall_t*3+e) square([15, batc_h/2], center=true);
|
||||
translate([0,batc_bot()+batc_h/4-4,0]) linear_extrude(wall_t*3+e) square([25, batc_h/2], center=true);
|
||||
|
||||
// pyramid cuts
|
||||
translate([-batc_w/2+batc_h/2,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4);
|
||||
translate([0,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4);
|
||||
translate([-batc_h/2+batc_w/2,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*color([1,1,0,0.4]) boxbottom();
|
||||
|
||||
module backstay() {
|
||||
difference() {
|
||||
cube([2, 1.5, bat_t*2/3], center=true);
|
||||
translate([1.5,0,0]) rotate([0,-8,0]) cube([2.1, 1.6, bat_t*4/3], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module batc_latch()
|
||||
{
|
||||
union() {
|
||||
translate([0,0,bat_t/2]) cube([4, 1, bat_t], center=true);
|
||||
translate([0,-0.4,bat_t+0.05]) rotate([45,0,0]) cube([4, 1.2, 1.35], center=true);
|
||||
translate([0,1-e,bat_t/3]) rotate([0,0,90]) backstay();
|
||||
}
|
||||
}
|
||||
|
||||
module batc_door() {
|
||||
union() {
|
||||
difference() {
|
||||
union() {
|
||||
translate([0, batc_cent(), (-wall_t+e)/2]) cube([batc_w-0.5, batc_h-0.5, wall_t], center=true);
|
||||
// rear latches
|
||||
latch_w = 4.2;
|
||||
translate([15,batc_top()-batc_h/4+(10.2-latch_w/2),wall_t*0.375-e*10])
|
||||
cube([14.6, latch_w, wall_t], center=true);
|
||||
translate([-15,batc_top()-batc_h/4+(10.2-latch_w/2),wall_t*0.5-e*10])
|
||||
cube([14.6, latch_w, wall_t], center=true);
|
||||
|
||||
// battery guides/latches
|
||||
translate([-15,batc_cent()+(bat_h/2)+2,-e*10]) batc_latch();
|
||||
translate([-15,batc_cent()-(batr_h/2)+2,-e*10]) rotate([0,0,180]) batc_latch();
|
||||
|
||||
translate([26,batc_cent(),0]) rotate([0,0,-90]) batc_latch();
|
||||
translate([-26,batc_cent(),0]) rotate([0,0,90]) batc_latch();
|
||||
|
||||
}
|
||||
//translate([-15,batc_top()-batc_h/4,wall_t*0.5-e*10])
|
||||
//cube([14.6, latch_w, wall_t], center=true);
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2,(-wall_t+e)/2]) cube([24.5, 12, 10], center=true);
|
||||
}
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2,(-wall_t+e)/2]) cube([22, 15, wall_t], center=true);
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2,wall_t*-0.1]) rotate([-2.5,0,0]) cube([22, 15, wall_t/2], center=true);
|
||||
}
|
||||
// spring
|
||||
cutw = 1.6;
|
||||
cutd = 5.0;
|
||||
translate([-cutd,pcb_h/2-bat_h-allclear()/2+1.5,(-wall_t+e)/2]) cube([21, cutw, 10], center=true);
|
||||
translate([cutd,pcb_h/2-bat_h-allclear()/2+5,(-wall_t+e)/2]) cube([21, cutw, 10], center=true);
|
||||
translate([cutd,pcb_h/2-bat_h-allclear()/2-2,(-wall_t+e)/2]) cube([21, cutw, 10], center=true);
|
||||
//translate([-2,pcb_h/2-bat_h-allclear()/2+3,(-wall_t+e)/2]) cube([21, 1, 10], center=true);
|
||||
//translate([-2,pcb_h/2-bat_h-allclear()/2-1,(-wall_t+e)/2]) cube([21, 1, 10], center=true);
|
||||
//translate([-2,pcb_h/2-bat_h-allclear()/2-5,(-wall_t+e)/2]) cube([21, 1, 10], center=true);
|
||||
|
||||
// spring latch
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2-9.5,(-wall_t+e)/2]) rotate([-45,0,0]) cube([23, 4, 11], center=true);
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2-10.25,(-wall_t+e)/4-0.35]) rotate([75,0,0]) cube([23, 3, 9.8], center=true);
|
||||
translate([0,pcb_h/2-bat_h-allclear()/2-10.65,(-wall_t+e)/0.75]) rotate([90,0,0]) cube([23, 3, 11.2], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
batc_door();
|
||||
|
||||
//color([1,0,0,0.2]) translate([0,0,pin_zs()*2]) linear_extrude(pcb_t) square([pcb_w, pcb_h], center=true);
|
||||
//color([0,0,1,1.0]) translate([0,pcb_h/2-bat_h/2-allclear()/2,bat_t/2]) cube([bat_w, bat_h, bat_t], center=true);
|
||||
//color([0,1,0.5,0.2]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff/2]) cylinder(h = standoff, r = pin_dia/2, center=true, $fn=40);
|
||||
//color([1,0.3,1,0.6]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff+pcb_t/2]) cylinder(h = pcb_t, r = pin_dia/2, center=true, $fn=40);
|
||||
//color([0,0.6,1,0.6]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff+pcb_t+screen_t/2]) cylinder(h = screen_t, r = pin_dia/2, center=true, $fn=40);
|
||||
//color([0,0.6,1,0.6]) translate([0,pcb_h/2-bat_h/2-allclear()/2,pin_t2+pcb_t+standoff+pcb_t]) linear_extrude(5) square([pcb_w-allclear(), bat_h], center=true);
|
||||
|
||||
|
||||
|
6
electronics_box/README.md
Normal file
6
electronics_box/README.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
A box for my electronics tester, consisting of a few different parts.
|
||||
|
||||
* The box itself
|
||||
* Glue-able stoppers that fit onto pins to secure the tester's PCB into the case
|
||||
* A removable battery door with a flexible latch to clip it in
|
||||
* A front cover to fit flush with the LCD, buttons, and ZIF socket (not yet implemented, probably also will need to be glued on)
|
9
fanclip/README.md
Normal file
9
fanclip/README.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
Very simple clip to disable the oscillating function on my Honeywell desk fan. Clips onto the knob (very firmly!) and prevents the knob from vibrating its way into the oscillate setting.
|
||||
|
||||
Notes:
|
||||
|
||||
* Probably clips *too* firmly, it doesn't flex much at all even with PETG. Barely snapped on, will likely need tool or break something to get it off
|
||||
* While the tall part of the clip fits the back of the knob just about perfectly, the cutaway from the bottom of the short side is too aggressive
|
||||
* However extending the front clip prongs to be taller would also make them stiffer
|
||||
* Possible solutions include thinning the walls, thinning just the prongs, or making the open cut more aggressive so it doesn't need to flex much
|
||||
* Either way, it suits its purpose at the moment and prevents fan oscillation, ever.
|
19
fanclip/fanclip1.scad
Normal file
19
fanclip/fanclip1.scad
Normal file
|
@ -0,0 +1,19 @@
|
|||
|
||||
module sample() {
|
||||
cylinder(19, 6, 6);
|
||||
|
||||
}
|
||||
|
||||
|
||||
module main_tube(c_cut, c_cut_h, m_cut) {
|
||||
difference() {
|
||||
cylinder(18, 12, 12);
|
||||
translate([0,0,-0.01]) cylinder(19, 6, 6);
|
||||
translate([-25,c_cut/2,-c_cut+c_cut_h]) rotate([0,90]) cylinder(50, c_cut, c_cut);
|
||||
translate([2,8,0]) rotate([0,0,-20]) cube([m_cut, m_cut*1.6, 50], center=true);
|
||||
translate([-2,8,0]) rotate([0,0,20]) cube([m_cut, m_cut*1.6, 50], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
//color([1,0,1,0.2]) sample();
|
||||
main_tube(20,9, 8);
|
1
hanging_bracket/README.md
Normal file
1
hanging_bracket/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
A simple (mostly) parametric bracket for hanging stuff, slanted sideways so it can be screwed in with powertools or whatever.
|
74
hanging_bracket/hanging_bracket.scad
Normal file
74
hanging_bracket/hanging_bracket.scad
Normal file
|
@ -0,0 +1,74 @@
|
|||
height = 95;
|
||||
width = 16;
|
||||
pillar_thickness = 5;
|
||||
prong_thickness = 4;
|
||||
prong_width = width;
|
||||
prong_depth = 120;
|
||||
prong_angle = 25;
|
||||
screw_hole_diameter = 5.5;
|
||||
screw_hole_count = 2;
|
||||
lh_rh = false;
|
||||
|
||||
fuzz = 0.01;
|
||||
|
||||
function triheight() = tan(prong_angle) * width;
|
||||
function thickness() = prong_thickness / cos(prong_angle);
|
||||
|
||||
module prong() {
|
||||
translate([-prong_width/2,0,0]) cube([prong_width*2, prong_depth, thickness()]);
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
module screw_hole(pos) {
|
||||
hole_pos = (prong_depth - pillar_thickness) * pos;
|
||||
hole_pos_mod = lh_rh ? pillar_thickness : 0;
|
||||
translate([-fuzz + prong_width/2, -fuzz + hole_pos_mod + hole_pos, -fuzz])
|
||||
union() {
|
||||
cylinder(h = thickness() * 2, d = screw_hole_diameter, $fn=32);
|
||||
translate([0,0,thickness()*0.255]) cylinder(h = thickness() * 0.75, d1 = 0, d2 = screw_hole_diameter*2, $fn=32);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
module prong_with_holes() {
|
||||
difference() {
|
||||
prong();
|
||||
for (i = [1: screw_hole_count])
|
||||
{
|
||||
screw_hole(i/(screw_hole_count+1));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
module pillar() {
|
||||
translate([0,0,0])
|
||||
union() {
|
||||
rotate([-90,0,0]) linear_extrude(pillar_thickness) polygon([[0, 0], [width, 0], [width, triheight()]]);
|
||||
cube([width, pillar_thickness, height+(fuzz*2)-triheight()]);
|
||||
translate([0,0, height]) rotate([-90,0,0]) linear_extrude(pillar_thickness) polygon([[0, 0], [width, triheight()], [0, triheight()]]);
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
module assembly() {
|
||||
difference() {
|
||||
union() {
|
||||
translate([0,0,-prong_thickness]) rotate([0, prong_angle, 0]) prong_with_holes();
|
||||
if (lh_rh) {
|
||||
pillar();
|
||||
} else {
|
||||
translate([0,prong_depth-pillar_thickness,0]) pillar();
|
||||
}
|
||||
translate([0,0,height+(prong_thickness*0.0)+(triheight()*0.0)]) rotate([0, prong_angle, 0]) prong();
|
||||
};
|
||||
translate([width,-prong_depth,-height]) cube([width*3, prong_depth*3, height*3]);
|
||||
translate([width*-3,-prong_depth,-height]) cube([width*3, prong_depth*3, height*3]);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
rotate([0,-90,0]) assembly();
|
||||
|
94
parametric_funnel/Funnel.scad
Normal file
94
parametric_funnel/Funnel.scad
Normal file
|
@ -0,0 +1,94 @@
|
|||
use <measurement.scad>
|
||||
|
||||
diameter_top = 80;
|
||||
diameter_throat = 15;
|
||||
diameter_bottom = 10;
|
||||
height_top = 100;
|
||||
height_bottom = 80;
|
||||
wall_thickness = 2;
|
||||
vent_pct = 10;
|
||||
tab = true;
|
||||
$fn = 50;
|
||||
|
||||
fuzz = 0.1;
|
||||
|
||||
radius_top = diameter_top/2;
|
||||
radius_throat = diameter_throat/2;
|
||||
radius_bottom = diameter_bottom/2;
|
||||
top_vent_pct = vent_pct/10;
|
||||
throat_vent_pct = vent_pct;
|
||||
bottom_vent_pct = vent_pct;
|
||||
tabsize=wall_thickness * 6;
|
||||
tablength=0.75; // reasonable sizes range from 0.5 - 2.0
|
||||
tabpos=90;
|
||||
|
||||
module solidshape(w, h) {
|
||||
t = radius_top + w;
|
||||
m = radius_throat + w;
|
||||
b = radius_bottom + w;
|
||||
ht = height_top - h + w;
|
||||
hb = height_bottom - h - h - w;
|
||||
ft=m-((2*fuzz*(t-m))/ht);
|
||||
vt=(t - w) * (top_vent_pct/100);
|
||||
vm=(m - w) * (throat_vent_pct/100);
|
||||
vb=(b - w) * (bottom_vent_pct/100);
|
||||
render() {
|
||||
difference() {
|
||||
union() {
|
||||
|
||||
translate([0,0,h+fuzz])
|
||||
cylinder(ht+fuzz, t, ft);
|
||||
|
||||
|
||||
translate([0,0,ht+h+h])
|
||||
cylinder(hb, m, b);
|
||||
}
|
||||
mw = (t-vt-m+vm+fuzz);
|
||||
//mw = t-vt-vm;
|
||||
ab = atan((m-vm-b+vb) / hb);
|
||||
at = atan(mw / ht);
|
||||
tcl = sqrt((mw^2)+(ht^2));
|
||||
|
||||
translate([m-vm, -m, ht+fuzz])
|
||||
rotate([0,-ab,0])
|
||||
#cube([m*2, m*2, hb*1.2]);
|
||||
translate([t+t-m-vt-vt+vm+fuzz+fuzz, -t, -ht+fuzz])
|
||||
rotate([0,-at,0])
|
||||
cube([t*2, t*2, tcl*1.2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module tabshape() {
|
||||
translate([-tabsize/2,0,fuzz])
|
||||
difference() {
|
||||
intersection() {
|
||||
cube([tabsize,tabsize*tablength*2,wall_thickness]);
|
||||
union() {
|
||||
cube([tabsize,tabsize*tablength,wall_thickness]);
|
||||
translate([tabsize/2, tabsize*tablength, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize);
|
||||
};
|
||||
}
|
||||
translate([tabsize/2, tabsize*tablength*0.9, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize/2);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
union() {
|
||||
difference() {
|
||||
//solidshape(wall_thickness, 0);
|
||||
solidshape(0,-fuzz);
|
||||
}
|
||||
if (tab)
|
||||
{
|
||||
rotate([0,0,tabpos])
|
||||
translate([0, radius_top, 0])
|
||||
tabshape();
|
||||
}
|
||||
}
|
||||
}
|
124
parametric_funnel/Funnel2.scad
Normal file
124
parametric_funnel/Funnel2.scad
Normal file
|
@ -0,0 +1,124 @@
|
|||
diameter_top = 120;
|
||||
diameter_throat = 15;
|
||||
diameter_bottom = 10;
|
||||
height_top = 100;
|
||||
height_bottom = 80;
|
||||
wall_thickness = 1.2;
|
||||
vent_pct = 100;
|
||||
tab = false;
|
||||
$fn = 50;
|
||||
|
||||
fuzz = 0.1;
|
||||
|
||||
radius_top = diameter_top/2;
|
||||
radius_throat = diameter_throat/2;
|
||||
radius_bottom = diameter_bottom/2;
|
||||
top_vent_pct = vent_pct/1;
|
||||
throat_vent_pct = vent_pct;
|
||||
bottom_vent_pct = vent_pct;
|
||||
tabsize=wall_thickness * 6;
|
||||
tablength=0.75; // reasonable sizes range from 0.5 - 2.0
|
||||
tabpos=90;
|
||||
|
||||
module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for top
|
||||
translate([throat_vent, 0, 0])
|
||||
rotate([0,0,180])
|
||||
translate([0, -throat, throat_h-fuzz])
|
||||
rotate([0,180+angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for bottom
|
||||
translate([throat_vent, -throat, throat_h-fuzz])
|
||||
rotate([0,-angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module solidshape(w, h) {
|
||||
t = radius_top + w;
|
||||
m = radius_throat + w;
|
||||
b = radius_bottom + w;
|
||||
ht = height_top - h + w;
|
||||
hb = height_bottom - h - h - w;
|
||||
ft=m-((2*fuzz*(t-m))/ht);
|
||||
vt=(t - w) * (top_vent_pct/100);
|
||||
vm=(m - w) * (throat_vent_pct/100);
|
||||
vb=(b - w) * (bottom_vent_pct/100);
|
||||
mw = (t-vt-m+vm+fuzz);
|
||||
//mw = t-vt-vm;
|
||||
ab = atan((m-vm-b+vb) / hb);
|
||||
at = atan((mw) / ht);
|
||||
tcl = sqrt((mw^2)+((ht)^2))-fuzz;
|
||||
|
||||
render() {
|
||||
difference() {
|
||||
union() {
|
||||
|
||||
translate([0,0,h+fuzz])
|
||||
cylinder(ht+wall_thickness, t, ft);
|
||||
|
||||
|
||||
translate([0,0,ht+h+h])
|
||||
cylinder(hb, m, b);
|
||||
}
|
||||
|
||||
|
||||
// vent for bottom
|
||||
ventblock_bottom(m-vm, m, ab, ht+h, hb);
|
||||
ventblock_top(m-vm, t, at, ht+h, tcl);
|
||||
|
||||
//translate([0,-m,0])
|
||||
//translate([0,0,ht])
|
||||
//rotate([0,180+at,180])
|
||||
//translate([m-vm, -m, 0])
|
||||
//rotate([0,180+at,0])
|
||||
//#cube([m*2, m*2, hb*2]);
|
||||
|
||||
// vent for top
|
||||
//translate([t+t-m-vt-vt+vm, -t, -ht])
|
||||
//rotate([0,-at,0])
|
||||
//#cube([t*2, t*2, tcl*2]);
|
||||
}
|
||||
//color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]);
|
||||
}
|
||||
}
|
||||
|
||||
module tabshape() {
|
||||
translate([-tabsize/2,0,fuzz])
|
||||
difference() {
|
||||
intersection() {
|
||||
cube([tabsize,tabsize*tablength*2,wall_thickness]);
|
||||
union() {
|
||||
cube([tabsize,tabsize*tablength,wall_thickness]);
|
||||
translate([tabsize/2, tabsize*tablength, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize);
|
||||
};
|
||||
}
|
||||
translate([tabsize/2, tabsize*tablength*0.9, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize/2);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
union() {
|
||||
difference() {
|
||||
solidshape(wall_thickness, 0);
|
||||
solidshape(0,-wall_thickness);
|
||||
}
|
||||
if (tab)
|
||||
{
|
||||
rotate([0,0,tabpos])
|
||||
translate([0, radius_top, 0])
|
||||
tabshape();
|
||||
}
|
||||
}
|
||||
}
|
110
parametric_funnel/Funnel3.scad
Normal file
110
parametric_funnel/Funnel3.scad
Normal file
|
@ -0,0 +1,110 @@
|
|||
module funnel(
|
||||
diameter_top = 120,
|
||||
diameter_throat = 15,
|
||||
diameter_bottom = 10,
|
||||
height_top = 100,
|
||||
height_bottom = 80,
|
||||
wall_thickness = 1.2,
|
||||
vent_pct = 25,
|
||||
tab = false)
|
||||
{
|
||||
$fn = 50;
|
||||
|
||||
fuzz = 0.1;
|
||||
|
||||
radius_top = diameter_top/2;
|
||||
radius_throat = diameter_throat/2;
|
||||
radius_bottom = diameter_bottom/2;
|
||||
// y = mx + b
|
||||
// mx = y - b
|
||||
// m = (y - b) / x
|
||||
// m = (y2 - y1) / (x2 - x1)
|
||||
// (-radius_top,0) - (-radius_throat,height_top)
|
||||
top_invslope = (radius_throat-radius_top) / -height_top;
|
||||
bottom_invslope = (radius_bottom-radius_throat) / -height_bottom;
|
||||
top_thickening = wall_thickness * top_invslope;
|
||||
bottom_thickening = wall_thickness * bottom_invslope;
|
||||
top_vent_pct = vent_pct/10;
|
||||
throat_vent_pct = vent_pct;
|
||||
bottom_vent_pct = vent_pct;
|
||||
tabsize=wall_thickness * 6;
|
||||
tablength=0.75; // reasonable sizes range from 0.5 - 2.0
|
||||
tabpos=90;
|
||||
|
||||
module ventblock_topx(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
|
||||
translate([throat_vent, 0, 0])
|
||||
rotate([0,0,180])
|
||||
translate([0, -throat, throat_h-fuzz])
|
||||
rotate([0,180+angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module ventblock_bottomx(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for bottom
|
||||
translate([throat_vent, -throat, throat_h-fuzz])
|
||||
rotate([0,-angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module ventblock_top(rt, rm, h1)
|
||||
{
|
||||
tsub = rt - (
|
||||
angle = atan(() / ());
|
||||
translate([rm, 0, 0])
|
||||
rotate([0,0,180])
|
||||
translate([0, -rm, h1-fuzz])
|
||||
rotate([0,180+angle,0])
|
||||
#cube([rt*2, rt*2, h1*2]);
|
||||
}
|
||||
|
||||
module ventblock_bottom(rm, rb, h1, h2)
|
||||
{
|
||||
translate([throat_vent, -throat, throat_h-fuzz])
|
||||
rotate([0,-angle,0])
|
||||
#cube([rm*2, rm*2, h2*2]);
|
||||
}
|
||||
|
||||
module p_solidfunnelshape(rt, rm, rb, h1, h2)
|
||||
{
|
||||
union() {
|
||||
cylinder(h1+wall_thickness,rt,rm-top_thickening);
|
||||
translate([0,0,h1])
|
||||
cylinder(h2+wall_thickness,rm,rb-bottom_thickening);
|
||||
}
|
||||
}
|
||||
|
||||
module p_ventedfunnelshape(rt, rm, rb, h1, h2)
|
||||
{
|
||||
difference() {
|
||||
p_solidfunnelshape(rt, rm, rb, h1, h2);
|
||||
union() {
|
||||
//ventblock_top(rm, rm, atan(top_invslope), h1, h1 + h2);
|
||||
//ventblock_bottom(rm, rm, atan(bottom_invslope), h1, h1 + h2);
|
||||
ventblock_top(rt, rm, h1);
|
||||
ventblock_bottom(rm, rb, h1, h2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module p_hollowfunnelshape(rt, rm, rb, h1, h2)
|
||||
{
|
||||
difference() {
|
||||
//p_ventedfunnelshape(rt, rm, rb, h1, h2);
|
||||
translate([0,0,-wall_thickness])
|
||||
p_ventedfunnelshape(rt-wall_thickness, rm-wall_thickness, rb-wall_thickness, h1+wall_thickness, h2+wall_thickness);
|
||||
}
|
||||
}
|
||||
|
||||
module demofunnel()
|
||||
{
|
||||
render() p_hollowfunnelshape(radius_top, radius_throat, radius_bottom, height_top, height_bottom);
|
||||
}
|
||||
demofunnel();
|
||||
|
||||
}
|
||||
funnel(150,50,40);
|
3
parametric_funnel/README.md
Normal file
3
parametric_funnel/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
A parametric funnel with options to include a hook/hanger, allow venting by flattening one side, or just flatten one side completely to fit into tighter spaces.
|
||||
|
||||
Kind of a learning experience to be honest, under the premise that it is always handy to have funnels. Haven't used or worked on these in a long time, I forget which file is the right one to use. TBD. I think they all work to make a funnel, but probably some have more features or features that work better.
|
150
remote_basket/Basket.scad
Normal file
150
remote_basket/Basket.scad
Normal file
|
@ -0,0 +1,150 @@
|
|||
diameter_top = 70;
|
||||
diameter_throat = 40;
|
||||
diameter_bottom = 10;
|
||||
height_top = 60;
|
||||
height_bottom = 80;
|
||||
wall_thickness = 1.2;
|
||||
vent_pct = 100;
|
||||
tab = false;
|
||||
$fn = 50;
|
||||
|
||||
fuzz = 0.1;
|
||||
|
||||
radius_top = diameter_top/2;
|
||||
radius_throat = diameter_throat/2;
|
||||
radius_bottom = diameter_bottom/2;
|
||||
top_vent_pct = vent_pct/2;
|
||||
throat_vent_pct = vent_pct;
|
||||
bottom_vent_pct = vent_pct;
|
||||
tabsize=wall_thickness * 6;
|
||||
tablength=0.75; // reasonable sizes range from 0.5 - 2.0
|
||||
tabpos=90;
|
||||
|
||||
module hexgrid_center(hexsize, hexh, hexw, hexd, gridt) {
|
||||
translate([-hexw/2,-hexd/2,-hexh/2]) hexgrid(hexsize, hexh, hexw, hexd, gridt);
|
||||
}
|
||||
module hexgrid(hexsize, hexh, hexw, hexd, gridt) {
|
||||
intersection() {
|
||||
hexgrid_only(hexsize, hexh, hexw, hexd, gridt);
|
||||
cube([hexw, hexd, hexh]);
|
||||
}
|
||||
}
|
||||
module hexgrid_only(hexsize, hexh, hexw, hexd, gridt) {
|
||||
rotate([0,-90,-90])
|
||||
for (Y = [0:(hexh/hexsize)+1]) {
|
||||
for (X = [0:(hexw/hexsize)+2]) {
|
||||
hexspaceY = (hexsize+gridt)*sin(60.1);
|
||||
hexspaceX = (hexsize+gridt)*sin(48.6);
|
||||
if (X % 2 == 0) {
|
||||
translate([Y*hexspaceY,X*hexspaceX,0]) rotate([0,0,90])cylinder(h=hexd, d=hexsize, $fn=6);
|
||||
} else {
|
||||
translate([(Y+0.5)*hexspaceY,X*hexspaceX,0]) rotate([0,0,90]) cylinder(h=hexd, d=hexsize, $fn=6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//color([0.5,0.5,1.0]) hexgrid_center(30, 200, 300, 400, 5);
|
||||
|
||||
module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for top
|
||||
translate([throat_vent, 0, 0])
|
||||
rotate([0,0,180])
|
||||
translate([0, -throat, throat_h-fuzz])
|
||||
rotate([0,180+angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for bottom
|
||||
translate([throat_vent, -throat, throat_h-fuzz])
|
||||
rotate([0,-angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module solidshape(w, h) {
|
||||
t = radius_top + w;
|
||||
m = radius_throat + w;
|
||||
b = radius_bottom + w;
|
||||
ht = height_top - h + w;
|
||||
hb = height_bottom - h - h - w;
|
||||
ft=m-((2*fuzz*(t-m))/ht);
|
||||
vt=(t - w) * (top_vent_pct/100);
|
||||
vm=(m - w) * (throat_vent_pct/100);
|
||||
vb=(b - w) * (bottom_vent_pct/100);
|
||||
mw = (t-vt-m+vm+fuzz);
|
||||
//mw = t-vt-vm;
|
||||
ab = atan((m-vm-b+vb) / hb);
|
||||
at = atan((mw) / ht);
|
||||
tcl = sqrt((mw^2)+((ht)^2))-fuzz;
|
||||
|
||||
render() {
|
||||
difference() {
|
||||
union() {
|
||||
|
||||
translate([0,0,h+fuzz])
|
||||
cylinder(ht+wall_thickness, t, ft);
|
||||
|
||||
|
||||
//translate([0,0,ht+h+h])
|
||||
//cylinder(hb, m, b);
|
||||
}
|
||||
|
||||
|
||||
// vent for bottom
|
||||
ventblock_bottom(m-vm, m, ab, ht+h, hb);
|
||||
ventblock_top(m-vm, t, at, ht+h, tcl);
|
||||
|
||||
//translate([0,-m,0])
|
||||
//translate([0,0,ht])
|
||||
//rotate([0,180+at,180])
|
||||
//translate([m-vm, -m, 0])
|
||||
//rotate([0,180+at,0])
|
||||
//#cube([m*2, m*2, hb*2]);
|
||||
|
||||
// vent for top
|
||||
//translate([t+t-m-vt-vt+vm, -t, -ht])
|
||||
//rotate([0,-at,0])
|
||||
//#cube([t*2, t*2, tcl*2]);
|
||||
}
|
||||
//color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]);
|
||||
}
|
||||
}
|
||||
|
||||
module tabshape() {
|
||||
translate([-tabsize/2,0,fuzz])
|
||||
difference() {
|
||||
intersection() {
|
||||
cube([tabsize,tabsize*tablength*2,wall_thickness]);
|
||||
union() {
|
||||
cube([tabsize,tabsize*tablength,wall_thickness]);
|
||||
translate([tabsize/2, tabsize*tablength, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize);
|
||||
};
|
||||
}
|
||||
translate([tabsize/2, tabsize*tablength*0.9, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize/2);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
union() {
|
||||
difference() {
|
||||
solidshape(wall_thickness, 0);
|
||||
solidshape(0,-wall_thickness);
|
||||
}
|
||||
if (tab)
|
||||
{
|
||||
rotate([0,0,tabpos])
|
||||
translate([0, radius_top, 0])
|
||||
tabshape();
|
||||
}
|
||||
}
|
||||
}
|
164
remote_basket/Basket_with_hexgrid.scad
Normal file
164
remote_basket/Basket_with_hexgrid.scad
Normal file
|
@ -0,0 +1,164 @@
|
|||
diameter_top = 65;
|
||||
diameter_throat = 36;
|
||||
diameter_bottom = 10;
|
||||
height_top = 95;
|
||||
height_bottom = 80;
|
||||
wall_thickness = 1.2;
|
||||
vent_pct = 100;
|
||||
tab = false;
|
||||
$fn = 50;
|
||||
|
||||
fuzz = 0.1;
|
||||
|
||||
radius_top = diameter_top/2;
|
||||
radius_throat = diameter_throat/2;
|
||||
radius_bottom = diameter_bottom/2;
|
||||
top_vent_pct = vent_pct/2;
|
||||
throat_vent_pct = vent_pct;
|
||||
bottom_vent_pct = vent_pct;
|
||||
tabsize=wall_thickness * 6;
|
||||
tablength=0.75; // reasonable sizes range from 0.5 - 2.0
|
||||
tabpos=90;
|
||||
|
||||
module hexgrid_center(hexsize, hexh, hexw, hexd, gridt) {
|
||||
translate([-hexw/2,-hexd/2,-hexh/2]) hexgrid(hexsize, hexh, hexw, hexd, gridt);
|
||||
}
|
||||
module hexgrid(hexsize, hexh, hexw, hexd, gridt) {
|
||||
intersection() {
|
||||
hexgrid_only(hexsize, hexh, hexw, hexd, gridt);
|
||||
cube([hexw, hexd, hexh]);
|
||||
}
|
||||
}
|
||||
module hexgrid_only(hexsize, hexh, hexw, hexd, gridt) {
|
||||
rotate([0,-90,-90])
|
||||
for (Y = [0:(hexh/hexsize)+1]) {
|
||||
for (X = [0:(hexw/hexsize)+2]) {
|
||||
hexspaceY = (hexsize+gridt)*sin(60.1);
|
||||
hexspaceX = (hexsize+gridt)*sin(48.6);
|
||||
if (X % 2 == 0) {
|
||||
translate([Y*hexspaceY,X*hexspaceX,0]) rotate([0,0,90])cylinder(h=hexd, d=hexsize, $fn=6);
|
||||
} else {
|
||||
translate([(Y+0.5)*hexspaceY,X*hexspaceX,0]) rotate([0,0,90]) cylinder(h=hexd, d=hexsize, $fn=6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//color([0.5,0.5,1.0]) hexgrid_center(30, 200, 300, 400, 5);
|
||||
|
||||
module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for top
|
||||
translate([throat_vent, 0, 0])
|
||||
rotate([0,0,180])
|
||||
translate([0, -throat, throat_h-fuzz+1.2])
|
||||
rotate([0,180+angle,0])
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b)
|
||||
{
|
||||
// vent for bottom
|
||||
translate([throat_vent, -throat, throat_h-fuzz])
|
||||
rotate([0,-angle,0])
|
||||
|
||||
cube([throat*2, throat*2, hyp_b*1.2]);
|
||||
|
||||
}
|
||||
|
||||
module solidshape(w, h) {
|
||||
t = radius_top + w;
|
||||
m = radius_throat + w;
|
||||
b = radius_bottom + w;
|
||||
ht = height_top - h + w;
|
||||
hb = height_bottom - h - h - w;
|
||||
ft=m-((2*fuzz*(t-m))/ht);
|
||||
vt=(t - w) * (top_vent_pct/100);
|
||||
vm=(m - w) * (throat_vent_pct/100);
|
||||
vb=(b - w) * (bottom_vent_pct/100);
|
||||
mw = (t-vt-m+vm+fuzz);
|
||||
//mw = t-vt-vm;
|
||||
ab = atan((m-vm-b+vb) / hb);
|
||||
at = atan((mw) / ht);
|
||||
tcl = sqrt((mw^2)+((ht)^2))-fuzz;
|
||||
|
||||
render() {
|
||||
difference() {
|
||||
union() {
|
||||
|
||||
translate([0,0,h+fuzz])
|
||||
cylinder(ht+wall_thickness, t, ft);
|
||||
|
||||
|
||||
//translate([0,0,ht+h+h])
|
||||
//cylinder(hb, m, b);
|
||||
}
|
||||
|
||||
|
||||
// vent for bottom
|
||||
ventblock_bottom(m-vm, m, ab, ht+h, hb);
|
||||
ventblock_top(m-vm, t, at, ht+h, tcl);
|
||||
|
||||
//translate([0,-m,0])
|
||||
//translate([0,0,ht])
|
||||
//rotate([0,180+at,180])
|
||||
//translate([m-vm, -m, 0])
|
||||
//rotate([0,180+at,0])
|
||||
//#cube([m*2, m*2, hb*2]);
|
||||
|
||||
// vent for top
|
||||
//translate([t+t-m-vt-vt+vm, -t, -ht])
|
||||
//rotate([0,-at,0])
|
||||
//#cube([t*2, t*2, tcl*2]);
|
||||
}
|
||||
//color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]);
|
||||
}
|
||||
}
|
||||
|
||||
module tabshape() {
|
||||
translate([-tabsize/2,0,fuzz])
|
||||
difference() {
|
||||
intersection() {
|
||||
cube([tabsize,tabsize*tablength*2,wall_thickness]);
|
||||
union() {
|
||||
cube([tabsize,tabsize*tablength,wall_thickness]);
|
||||
translate([tabsize/2, tabsize*tablength, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize);
|
||||
};
|
||||
}
|
||||
translate([tabsize/2, tabsize*tablength*0.9, 0])
|
||||
linear_extrude(wall_thickness)
|
||||
circle(d = tabsize/2);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
difference() {
|
||||
union() {
|
||||
difference() {
|
||||
solidshape(wall_thickness, 0);
|
||||
solidshape(0,-wall_thickness);
|
||||
}
|
||||
if (tab)
|
||||
{
|
||||
rotate([0,0,tabpos])
|
||||
translate([0, radius_top, 0])
|
||||
tabshape();
|
||||
}
|
||||
}
|
||||
xs = 23;
|
||||
translate([-xs+10,xs,height_top/2])
|
||||
rotate([0,90,45])
|
||||
hexgrid_center(5.7, 20, 68, 20, 1.1);
|
||||
translate([-xs+10,-xs,height_top/2])
|
||||
rotate([0,90,-45])
|
||||
hexgrid_center(5.7, 20, 68, 20, 1.1);
|
||||
translate([-xs-5,0,height_top/2])
|
||||
rotate([0,90,90])
|
||||
hexgrid_center(5.7, 20, 68, 20, 1.1);
|
||||
}
|
||||
}
|
||||
|
3
remote_basket/README.md
Normal file
3
remote_basket/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
A simple semi-circular basket that can hold a remote or two and has a flat spot to be command-stripped to a wall or cabinet.
|
||||
|
||||
Also comes in hexgrid edition for material saving, improved visibility, and extra coolness.
|
Loading…
Add table
Reference in a new issue