251 lines
8 KiB
OpenSCAD
251 lines
8 KiB
OpenSCAD
|
litho_height = 100;
|
||
|
litho_width = 70;
|
||
|
litho_support = 5;
|
||
|
middle_width = 15;
|
||
|
base_height = 35;
|
||
|
wall_width = 4;
|
||
|
panel_thick = 2;
|
||
|
tolerance = 1;
|
||
|
base_width = litho_width + 2*litho_support + 6*wall_width;
|
||
|
top_height = 20;
|
||
|
top_r1 = base_width;
|
||
|
top_r2 = 2*litho_support;
|
||
|
top_r3 = 2*litho_support;
|
||
|
|
||
|
|
||
|
module base() {
|
||
|
module baseform(width, height, cylinder_r, cylinder_offset) {
|
||
|
union() {
|
||
|
cube([width, width, height]);
|
||
|
translate([-cylinder_offset, -cylinder_offset, 0])
|
||
|
cylinder(r1=cylinder_r, r2=litho_support, h=0.75*height);
|
||
|
translate([width+cylinder_offset, -cylinder_offset, 0])
|
||
|
cylinder(r1=cylinder_r, r2=litho_support, h=0.75*height);
|
||
|
translate([-cylinder_offset, width+cylinder_offset, 0])
|
||
|
cylinder(r1=cylinder_r, r2=litho_support, h=0.75*height);
|
||
|
translate([width+cylinder_offset, width+cylinder_offset, 0])
|
||
|
cylinder(r1=cylinder_r, r2=litho_support, h=0.75*height);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module angle() {
|
||
|
difference() {
|
||
|
cube([
|
||
|
litho_support+3*wall_width,
|
||
|
litho_support+3*wall_width,
|
||
|
litho_height+base_height+wall_width+litho_support]);
|
||
|
translate([wall_width, 3*wall_width, base_height-litho_support])
|
||
|
cube([
|
||
|
wall_width,
|
||
|
litho_support+wall_width,
|
||
|
litho_height+2*litho_support+2*wall_width]);
|
||
|
translate([3*wall_width, wall_width, base_height-litho_support])
|
||
|
cube([
|
||
|
litho_support+2*wall_width,
|
||
|
wall_width,
|
||
|
litho_height+2*litho_support+2*wall_width]);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
union() {
|
||
|
difference() {
|
||
|
baseform(
|
||
|
base_width,
|
||
|
base_height,
|
||
|
litho_support+2*wall_width, -litho_support);
|
||
|
|
||
|
translate([
|
||
|
3*wall_width,
|
||
|
3*wall_width,
|
||
|
wall_width]
|
||
|
)
|
||
|
cube([
|
||
|
base_width-6*wall_width,
|
||
|
base_width-6*wall_width,
|
||
|
base_height]);
|
||
|
|
||
|
translate([
|
||
|
wall_width,
|
||
|
wall_width,
|
||
|
base_height-litho_support-wall_width]
|
||
|
)
|
||
|
cube([
|
||
|
base_width-2*wall_width,
|
||
|
base_width-2*wall_width,
|
||
|
base_height]);
|
||
|
|
||
|
translate([base_width/2-20, 3*wall_width, base_height/2-3]) rotate([90, 0, 0])
|
||
|
cylinder(r=10.25, h=4*wall_width, $fn=100); //power button
|
||
|
|
||
|
translate([base_width/2, 3*wall_width, base_height/2-9]) rotate([90, 0, 0])
|
||
|
cylinder(r=4, h=4*wall_width, $fn=100); //color button
|
||
|
|
||
|
translate([base_width/2, 3*wall_width, base_height/2+3]) rotate([90, 0, 0])
|
||
|
cylinder(r=4, h=4*wall_width, $fn=100); //mode button
|
||
|
|
||
|
translate([base_width/2+20, 3*wall_width, base_height/2]) rotate([90, 0, 0])
|
||
|
cylinder(r=4.25, h=4*wall_width, $fn=100); //power jack
|
||
|
|
||
|
translate([base_width/2-35, panel_thick, wall_width])
|
||
|
cube([42, 4*wall_width, base_height-litho_support-wall_width]);
|
||
|
|
||
|
translate([base_width/2+15, panel_thick, wall_width])
|
||
|
cube([12, 4*wall_width, base_height-litho_support-wall_width]);
|
||
|
}
|
||
|
|
||
|
// Four angles
|
||
|
angle();
|
||
|
translate([base_width, 0, 0]) rotate([0, 0, 90]) angle();
|
||
|
translate([base_width, base_width, 0]) rotate([0, 0, 180]) angle();
|
||
|
translate([0, base_width, 0]) rotate([0, 0, -90]) angle();
|
||
|
|
||
|
translate([0, 0, base_height+litho_height])
|
||
|
difference() {
|
||
|
cube([base_width, base_width, litho_support+wall_width]);
|
||
|
translate([wall_width, wall_width, -wall_width])
|
||
|
cube([
|
||
|
base_width-2*wall_width,
|
||
|
base_width-2*wall_width,
|
||
|
litho_support+3*wall_width]);
|
||
|
|
||
|
}
|
||
|
|
||
|
translate([
|
||
|
base_width/2-middle_width/2,
|
||
|
base_width/2-middle_width/2,
|
||
|
wall_width
|
||
|
]) cube([middle_width, middle_width, base_height+litho_height]);
|
||
|
|
||
|
// card supports
|
||
|
|
||
|
translate([18, base_width-45, wall_width])
|
||
|
difference() {
|
||
|
cube([35+2*panel_thick, 26+2*panel_thick, 3*wall_width]);
|
||
|
translate([panel_thick, panel_thick, wall_width])
|
||
|
cube([35, 26, 4*wall_width]);
|
||
|
translate([35-panel_thick, panel_thick+5, wall_width])
|
||
|
cube([4*panel_thick, 16, 4*wall_width]);
|
||
|
};
|
||
|
|
||
|
|
||
|
translate([18, base_width-60, wall_width])
|
||
|
difference() {
|
||
|
cube([16+2*panel_thick, 13+2*panel_thick, 3*wall_width]);
|
||
|
translate([panel_thick, panel_thick, wall_width])
|
||
|
cube([16, 13, 4*wall_width]);
|
||
|
};
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module inside_plate(height) {
|
||
|
difference() {
|
||
|
cube([
|
||
|
base_width-2*wall_width-2*tolerance,
|
||
|
base_width-2*wall_width-2*tolerance,
|
||
|
height]);
|
||
|
|
||
|
translate([-wall_width, -wall_width, -height]) cube([
|
||
|
litho_support+4*wall_width,
|
||
|
litho_support+4*wall_width,
|
||
|
3*height
|
||
|
]);
|
||
|
translate([
|
||
|
base_width-litho_support-5*wall_width,
|
||
|
-wall_width,
|
||
|
-height])
|
||
|
cube([
|
||
|
litho_support+4*wall_width,
|
||
|
litho_support+4*wall_width,
|
||
|
3*height
|
||
|
]);
|
||
|
translate([
|
||
|
-wall_width,
|
||
|
base_width-litho_support-5*wall_width,
|
||
|
-height
|
||
|
]) cube([
|
||
|
litho_support+4*wall_width,
|
||
|
litho_support+4*wall_width,
|
||
|
3*height
|
||
|
]);
|
||
|
translate([
|
||
|
base_width-litho_support-5*wall_width,
|
||
|
base_width-litho_support-5*wall_width,
|
||
|
-height
|
||
|
]) cube([
|
||
|
litho_support+4*wall_width,
|
||
|
litho_support+4*wall_width,
|
||
|
3*height
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module separator() {
|
||
|
translate([wall_width+tolerance, wall_width+tolerance, base_height-litho_support-wall_width])
|
||
|
difference() {
|
||
|
inside_plate(wall_width);
|
||
|
translate([
|
||
|
base_width/2-wall_width,
|
||
|
base_width/2-wall_width,
|
||
|
-wall_width
|
||
|
]) cylinder(r=middle_width, h=3*wall_width);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module top() {
|
||
|
translate([0, 0, base_height+litho_height+2*wall_width])
|
||
|
union() {
|
||
|
translate([
|
||
|
wall_width+tolerance,
|
||
|
wall_width+tolerance, 0])
|
||
|
inside_plate(2*(litho_support-wall_width));
|
||
|
translate([0, 0, 2*(litho_support-wall_width)])
|
||
|
difference() {
|
||
|
translate([
|
||
|
base_width/2,
|
||
|
base_width/2,
|
||
|
top_height/2
|
||
|
]) cylinder(
|
||
|
h=top_height,
|
||
|
r1=top_r1,
|
||
|
r2=top_r2,
|
||
|
center=true,
|
||
|
$fn=100);
|
||
|
|
||
|
translate([
|
||
|
base_width/2,
|
||
|
-1.7*top_r1,
|
||
|
5.25*top_r1
|
||
|
]) sphere(r=5.5*top_r1, $fn=100);
|
||
|
|
||
|
translate([
|
||
|
-1.7*top_r1,
|
||
|
base_width/2,
|
||
|
5.25*top_r1
|
||
|
]) sphere(r=5.5*top_r1, $fn=100);
|
||
|
|
||
|
translate([
|
||
|
base_width/2,
|
||
|
base_width+1.7*top_r1,
|
||
|
5.25*top_r1
|
||
|
]) sphere(r=5.5*top_r1, $fn=100);
|
||
|
|
||
|
translate([
|
||
|
base_width+1.7*top_r1,
|
||
|
base_width/2,
|
||
|
5.25*top_r1
|
||
|
]) sphere(r=5.5*top_r1, $fn=100);
|
||
|
|
||
|
};
|
||
|
translate([
|
||
|
base_width/2,
|
||
|
base_width/2,
|
||
|
top_r3/2+top_height
|
||
|
]) sphere(r=top_r3);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
base();
|
||
|
//separator();
|
||
|
//top();
|