Pickup_Length = 58; // Tolerance Pickup_Width = 28.5; // Tolerance Pickup_Height = 20; Pickup_Offset = -37.5; Magnet_Height = 3; Corner_Radius = 1.5; // Half-guessed Hole_Spacing = 65; Cavity_Width = 64; // Tolerance Tang_Height = 1.5; Tang_Groove_Height = Tang_Height + 0.25; body_h = 20; Engrave_String = "P01β²"; Font = "GFS Didot"; // Font_JP = "New Tegomin"; Font_JP = "Yuji Boku"; module cyl(d=10, z0=-100, z1=100, $fn=128) translate([0,0,z0]) cylinder(h=z1-z0, r=d/2, $fn=$fn); module circ(r=10) circle(r=r, $fn=128); pl1 = Pickup_Length/2 - Corner_Radius; pw1 = Pickup_Width/2 - Corner_Radius; module half_pickup() { difference() { union() { // translate([-Pickup_Length/2, -Pickup_Width/2, 0]) cube([Pickup_Length, Pickup_Width, Pickup_Height]); color([0.3, 0.3, 0.3]) hull() for (x = [-pl1, pl1]) for (y = [-pw1, pw1]) translate([x, y, 0]) cyl(d=Corner_Radius*2, z0=Magnet_Height, z1=Pickup_Height); for (x = [-29, 29]) color([0.3, 0.3, 0.3]) translate([x, 0, 0]) cyl(d=12, z0=6, z1=16); color([0.5, 0.5, 0.6]) translate([-20, -5, 0]) cube([40, 10, Magnet_Height]); for (x = [-14.25:9.5:14.25]) color([0.7, 0.75, 0.8]) translate([x, 0, 0]) cyl(d=4, z0=Pickup_Height, z1=Pickup_Height+2); } for (x = [-Hole_Spacing/2, Hole_Spacing/2]) translate([x, 0, 0]) cyl(d=3); } } module for_each_pickup() { for (off = [[0, 0], [Pickup_Offset, Pickup_Width]]) translate(off) children(); } module split_pickup() { for_each_pickup() half_pickup(); } module pickup_outline(grow=0.5) { union() { hull() { for (x = [-pl1-grow, pl1+grow]) for (y = [-pw1-grow, pw1+grow]) translate([x, y]) circ(r=Corner_Radius); } for (x = [-29, 29]) translate([x, 0]) circ(r=6+grow); } } module body_outline(shrink=0, body_r=8) { union() { hull() { // Base Plate for (x = [-60+body_r, 20-body_r]) for (y = [-18+body_r, Cavity_Width-18-body_r]) translate([x,y]) circ(body_r - shrink); for (off = [[0, 0], [Pickup_Offset, Pickup_Width]]) translate(off) for (x = [-29, 29]) translate([x, 0]) circ((12+5)/2 - shrink); // Jack Plate translate([-67, 20]) circ(6 - shrink); // Pad pickup corners dist = Pickup_Length/2 + 5 - body_r; translate([dist, -18+body_r]) circ(body_r - shrink); translate([Pickup_Offset - dist, Cavity_Width-18-body_r]) circ(body_r - shrink); } hull() { translate([-67, 20]) circ(6 - shrink); translate([-67, -9]) circ(6 - shrink); translate([-60+body_r, -18+body_r]) circ(body_r - shrink); } } } module tang(margin=0.1) { // Negative margin as subtraction for the slot difference() { body_outline(shrink=1+margin); body_outline(shrink=2-margin); translate([45, 0]) square(40+margin, center=true); translate([-83, 32]) square(40+margin, center=true); }; translate([-60,11.5]) square([27-margin, 1-margin]); translate([-6,17]) square([27-margin, 1-margin]); } // color("blue") translate([-60, -18, -1]) cube([80, Cavity_Width, 1]); module lower() { difference() { union() { taper = 5; translate([0,0,taper]) minkowski($fn = $preview ? 8 : 64) { sphere(r = taper, $fn = $preview ? 8 : 64); linear_extrude(0.0001) body_outline(shrink=taper); } // hull() { // linear_extrude(taper) body_outline(shrink=3); translate([0,0,taper]) linear_extrude(body_h-taper) body_outline(); // } // tang color("blue") translate([0,0,body_h]) linear_extrude(Tang_Height) tang(); } // Subtractions // Jack cavity hull() { translate([-69, -10, 2.5]) cube([15, 20, 20]); translate([-69, -10, 10]) cube([35, 20, 20]); } // Jack hole translate([0,0,14]) rotate([0,-90,0]) cyl(d=11,z0=60); // Wire channels translate([0,0,5]) linear_extrude(body_h) union() { translate([-35, 7]) square([25,6], center=true); translate([-66, 13]) square([6,20], center=true); } // M4 holes to mount to body for (off = [[Pickup_Offset-5, 0], [5, Pickup_Width]]) translate(off) { cyl(d=4); cyl(d=9.5, z0=5); } for_each_pickup() { // Pickup adjustment brass insert holes for (x = [-Hole_Spacing/2, Hole_Spacing/2]) translate([x, 0, 0]) { cyl(5.1); hull(){ cyl(5.25, z0=7, z1=10); cyl(6, z0=9, z1=20); } } // Pickup outlines translate([0,0,10]) linear_extrude(100) pickup_outline(); } translate([4, 38, body_h-2]) linear_extrude(5) text(text = Engrave_String, size = 6, halign="center", valign="center", font=Font); translate([14, 28, body_h-2]) linear_extrude(5) text(text = "下", size = 8, halign="center", valign="center", font=Font_JP); } } module upper(wall_height=3.5, roof_height=2.5) { module elec_cavity() { hull() { for (off = [[-27, -11], [-52, -11], [-66, -8], [-66, 7], [-27, 7]]) translate(off) circ(r=2.5); } } module walls() { difference() { body_outline(); for_each_pickup() pickup_outline(); elec_cavity(); } } module roof() { difference() { body_outline(); for_each_pickup() pickup_outline(); } } difference() { union() { linear_extrude(Tang_Groove_Height) difference() { walls(); tang(-0.1); } h = wall_height - Tang_Groove_Height; translate([0, 0, Tang_Groove_Height]) linear_extrude(h) walls(); intersection() { translate([0,0,wall_height]) linear_extrude(roof_height) roof(); translate([0,0,wall_height]) minkowski($fn = $preview ? 8 : 64) { sphere(roof_height, $fn = $preview ? 8 : 64); linear_extrude(0.001) body_outline(shrink=roof_height); } } } linear_extrude(100) for_each_pickup() pickup_outline(); // Engravings translate([0, 0, wall_height+0.5]) linear_extrude(100) { translate([-2,22]) text(text = "LHW", size = 4, font=Font); translate([-6,17]) text(text = "2023-03-29", size = 4, font=Font); translate([-50,0]) text(text = Engrave_String, size = 6, halign="center", valign="center", font=Font); translate([-50,-8]) text(text = "上", size = 8, halign="center", valign="center", font=Font_JP); } // Jack hole translate([0,0,14-body_h]) rotate([0,-90,0]) cyl(d=11+2,z0=60); } } // lower(); upper(); // translate([0,0,10]) split_pickup();