From d558404c75fe65ca4474f8e4d724c0b250da6627 Mon Sep 17 00:00:00 2001 From: Nettika Date: Fri, 3 Oct 2025 23:39:45 +0000 Subject: [PATCH] Create initial cartridge model --- cartridge.scad | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 cartridge.scad diff --git a/cartridge.scad b/cartridge.scad new file mode 100644 index 0000000..ba98c78 --- /dev/null +++ b/cartridge.scad @@ -0,0 +1,123 @@ +$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); + } +} \ No newline at end of file