123 lines
No EOL
3.8 KiB
OpenSCAD
123 lines
No EOL
3.8 KiB
OpenSCAD
$fn = $preview ? 32 : 64;
|
|
|
|
*rotate([0, -90, -90]) import("/home/nettika/Downloads/8_Track.STL");
|
|
*translate([0, 98.6, 21.8]) rotate([-90, 0, -90]) import("/home/nettika/Downloads/Track_Lid.STL");
|
|
|
|
cartridge_length = 133;
|
|
cartridge_width = 102;
|
|
cartridge_height = 21;
|
|
wedge_width = 6;
|
|
wedge_depth = 16;
|
|
track_inset = 6;
|
|
foot_inset = 8;
|
|
gap_height = 1;
|
|
gap_depth = 0.3;
|
|
gap_elevation = 9;
|
|
|
|
module base_body() {
|
|
minkowski() {
|
|
translate([0, 0, 1]) linear_extrude(cartridge_height - 2) offset(-1) footprint();
|
|
sphere(1);
|
|
}
|
|
translate([wedge_depth-8, 0, cartridge_height]) {
|
|
translate([0, track_inset]) track(cartridge_length-wedge_depth+4);
|
|
translate([0, cartridge_width-track_inset]) track(cartridge_length-wedge_depth+4);
|
|
}
|
|
translate([wedge_depth, foot_inset, -0.5]) foot();
|
|
translate([wedge_depth, cartridge_width-foot_inset, -0.5]) foot();
|
|
}
|
|
|
|
module track(l, r=1, taper=12) rotate([0, 90, 0]) {
|
|
cylinder(r1=0, r2=r, h=taper);
|
|
translate([0, 0, taper]) cylinder(r=r, h=l-2*taper);
|
|
translate([0, 0, l-taper]) cylinder(r1=r, r2=0, h=taper);
|
|
}
|
|
|
|
module foot(w=2.5) {
|
|
cube([cartridge_length-wedge_depth-2, w, 2]);
|
|
translate([cartridge_length-wedge_depth-2, w, 1]) rotate([90, 90]) cylinder(r=1, h=w);
|
|
translate([0, w, 1]) rotate([90, 90]) cylinder(r=1, h=w);
|
|
}
|
|
|
|
color("salmon")
|
|
difference() {
|
|
base_body();
|
|
let(inset=2, d=6/*13*/) {
|
|
translate([0, 0, inset]) {
|
|
translate([0, 14]) cube([d, 20, cartridge_height-inset*2]);
|
|
translate([0, 40]) cube([d, 22, cartridge_height-inset*2]);
|
|
}
|
|
}
|
|
translate([0, 0, gap_elevation-(gap_height/2)])
|
|
linear_extrude(cartridge_height-gap_elevation+gap_height) {
|
|
for(i=[0:2.5:12.5]) {
|
|
polygon([
|
|
[cartridge_length-5-i, 0],
|
|
[cartridge_length-5-i, 1+gap_depth],
|
|
[cartridge_length-7.5-i, gap_depth],
|
|
[cartridge_length-7.5-i, 0]
|
|
]);
|
|
polygon([
|
|
[cartridge_length-5-i, cartridge_width],
|
|
[cartridge_length-5-i, cartridge_width-1-gap_depth],
|
|
[cartridge_length-7.5-i, cartridge_width-gap_depth],
|
|
[cartridge_length-7.5-i, cartridge_width]
|
|
]);
|
|
}
|
|
}
|
|
translate([0, 0, gap_elevation-(gap_height/2)]) linear_extrude(gap_height) {
|
|
difference() {
|
|
offset(10) footprint();
|
|
offset(-gap_depth) footprint();
|
|
}
|
|
}
|
|
translate([0, 0, -gap_height/2 - 2]) linear_extrude(gap_elevation+2) translate([53, cartridge_width-7]) rotate(45) offset(3) square([16, 16]);
|
|
}
|
|
|
|
color("teal")
|
|
let(h=6.4) {
|
|
translate([12, 79.5, (cartridge_height-h)/2]) cylinder(r=10, h);
|
|
translate([2, 14, (cartridge_height-h)/2]) cube([10, 65.5, h]);
|
|
}
|
|
|
|
module footprint() {
|
|
difference() {
|
|
polygon([
|
|
[0, wedge_width],
|
|
[0, cartridge_width - wedge_width],
|
|
[wedge_depth, cartridge_width],
|
|
[cartridge_length, cartridge_width],
|
|
[cartridge_length, 0],
|
|
[wedge_depth, 0],
|
|
]);
|
|
let(r=4) {
|
|
translate([cartridge_length - r, 0]) {
|
|
translate([0, r]) fillet(r, a1=90, a2=180);
|
|
translate([0, cartridge_width - r]) fillet(r, a1=0, a2=90);
|
|
}
|
|
}
|
|
let(m=wedge_width/wedge_depth, r=20) {
|
|
translate([wedge_depth + r * tan(atan(m)/2), 0]) {
|
|
translate([0, r]) fillet(r, a1=180, a2=180+atan(m));
|
|
translate([0, cartridge_width - r]) fillet(r, a1=0, a2=-atan(m));
|
|
}
|
|
}
|
|
let(m=wedge_depth/wedge_width, r=5) {
|
|
translate([r, 0]) {
|
|
translate([0, wedge_width + r * tan(atan(m)/2)]) fillet(r, a1=180+atan(1/m), a2=270);
|
|
translate([0, cartridge_width - wedge_width - r * tan(atan(m)/2)]) fillet(r, a1=270, a2=360-atan(1/m));
|
|
}
|
|
}
|
|
translate([-8, 76]) circle(r=12);
|
|
}
|
|
}
|
|
|
|
module fillet(r, d, a1=0, a2=360, p=10) {
|
|
difference() {
|
|
polygon([
|
|
[0, 0],
|
|
each [for (a=[a1:a2]) [p * sin(a) * r, p * cos(a) * r]],
|
|
]);
|
|
circle(r, d);
|
|
}
|
|
} |