Valentines Day revisions

This commit is contained in:
Luke Hubmayer-Werner 2025-02-15 01:19:07 +10:30
parent 9b60025172
commit d483e6f6b4
7 changed files with 197 additions and 128 deletions

View File

@ -45,7 +45,7 @@ module output_socket_placeholder(rear_clearance=0) {
// ShinKaiYaku65
// I swapped and because 12th fret should be the biggest marker, and having only 15 as a 2char marker would be too disorienting
// going with for 21
fret_inlays = [[3, "真"], [5, "尊"], [7, "正"], [9, "清"], [12, "評判"], [15, "愛"], [17, "徳"], [19, "賛"], [21, "良"], [24, "主イエス"], [27, "-"], [29, "-"], [31, "-"], [33, "-"]];
fret_inlays = [[3, "真"], [5, "尊"], [7, "正"], [9, "清"], [12, "評判"], [15, "愛"], [17, "徳"], [19, "賛"], [21, "良"], [24, "主イエス"], [27, "."], [29, "."], [31, "."], [33, "."]];
// Galatians 5:22-23
// ShinKaiYaku65 22 23
//
@ -1116,44 +1116,81 @@ COLOURSCHEME_PETGHF_BLUE = [BAMBU_PETGHF_LAKE_BLUE, BAMBU_PETGHF_LAKE_BLUE, "",
module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
$include_colours = include_colours;
$guitar_scale_length_mm = PBass_Scale_mm;
$id_lines = ["Zweisaiten", "250213-1"];
$id_lines = ["Zweisaiten", "250214"];
$fsl_mm = fret_scale_length(0);
$string_diameters_thous = [80, 105]; // Artist BST45130
$string_diameters_mm = $string_diameters_thous * 0.0254;
$neck_width_nut = 32;
$neck_width_bridge = 32;
$target_neck_thickness = 16;
$neck_width_nut = 35;
$neck_width_bridge = 35;
$target_neck_thickness = $neck_width_nut/2;
$num_strings = 2;
$string_spacing_nut = 20;
$string_spacing_bridge = 20;
$string_margin = 6;
$string_spacing_nut = 18;
$string_spacing_bridge = 18;
$string_margin = ($neck_width_nut - $string_spacing_nut)/2;
$num_frets = 29;
$num_frets = 33;
$fret_widths = default_fret_widths(3.6, 2.4);
$fret_angle = 60;
$fret_angle = 45;
$scallop_depth = 2.5;
$extra_thickness_above_center = 6;
y0 = -100;
headstock_length = 30;
y_end = behind_fret(0) + headstock_length;
y_fretboard_end = get_end_of_fretboard();
segment_cuts = [y0, 20, after_fret(29), after_fret(13), after_fret(5), behind_fret(0)+35];
echo(segment_cuts);
echo([ for (i=[1:len(segment_cuts)-1]) segment_cuts[i]-segment_cuts[i-1]]);
$segment_cuts = [y0, 0, after_fret(29), after_fret(13), after_fret(5), y_end];
echo($segment_cuts);
echo([ for (i=[1:len($segment_cuts)-1]) $segment_cuts[i]-$segment_cuts[i-1]]);
trussrod_y = 265;
$trussrod_positions = [
[[0, trussrod_y+630, -4], [0, 0, 180], "TrussRod"],
[[0, y0, -18], [0, 0, 0], "TrussRodSingleAction"],
];
$trussrods_extra = 0;
$dowel_positions = [
[ -6, $segment_cuts[4], -11],
[ 6, $segment_cuts[4], -11],
[ -6, $segment_cuts[3], -11],
[ 6, $segment_cuts[3], -11],
[-10, $segment_cuts[3], 0],
[ 10, $segment_cuts[3], 0],
// [ -9, $segment_cuts[2], -17],
// [ 9, $segment_cuts[2], -17],
[-10.25, $segment_cuts[2], 2.5],
[ 10.25, $segment_cuts[2], 2.5],
// [-10, $segment_cuts[1], 0],
// [ 10, $segment_cuts[1], 0],
[ -7, $segment_cuts[1], -21],
[ 7, $segment_cuts[1], -21],
];
$reinforcing_tube_positions = [
[-12, fret_scale_length(0)-CF_Tube_Len, 0],
[ 12, fret_scale_length(0)-CF_Tube_Len, 0],
[-12, y0+30, -16],
[ 12, y0+30, -16],
];
pickup_y = fret_scale_length(36);
module ElectronicsCavities(diff=false) {
// Directly under the strings would hit the second truss rod :(
//for (i=[0,1]) translate([string_x(i, pickup_y), pickup_y, -10]) relay_coil_placeholder();
z_pickup = -10;
for (i=[0,1]) mirror([i, 0, 0]) translate([12, pickup_y, z_pickup]) relay_coil_placeholder(top_clearance = diff ? 40 : 0);
// translate([0, pickup_y-8, -20]) rotate([0, 90, 0]) cylinder_outer(d=6, h=neck_width()+10, center=true);
// translate([5, pickup_y-38, -10]) rotate([0, 90, 0]) output_socket_placeholder();
output_socket_y = pickup_y-26;
translate([output_socket_l/2, output_socket_y, -10]) rotate([0, 0, 90]) output_socket_placeholder(rear_clearance = diff ? 40 : 0);
translate([output_socket_l/2 - 100, output_socket_y + output_socket_w/2 - 2, -10-1]) cube([100, 9, 2]);
if (diff) {
l = y_fretboard_end - $segment_cuts[1];
translate([-500, y_fretboard_end-l, -11]) cube([1000, l, 1000]);
} else {
// Directly under the strings would hit the second truss rod :(
//for (i=[0,1]) translate([string_x(i, pickup_y), pickup_y, -10]) relay_coil_placeholder();
z_pickup = -10;
for (i=[0,1]) mirror([i, 0, 0]) translate([8, pickup_y, z_pickup]) relay_coil_placeholder(top_clearance = diff ? 40 : 0);
// translate([0, pickup_y-8, -20]) rotate([0, 90, 0]) cylinder_outer(d=6, h=neck_width()+10, center=true);
// translate([5, pickup_y-38, -10]) rotate([0, 90, 0]) output_socket_placeholder();
output_socket_y = pickup_y-26;
translate([output_socket_l/2, output_socket_y, -10]) rotate([0, 0, 90]) output_socket_placeholder(rear_clearance = diff ? 40 : 0);
translate([output_socket_l/2 - 100, output_socket_y + output_socket_w/2 - 2, -10-1]) cube([100, 9, 2]);
}
}
module Tuners() {
@ -1161,24 +1198,24 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
// for (i=[0:1])
// mirror([i,0,0]) translate([15, (i*32)-66, -26]) rotate([0, -90, 0]) UBassTuner(from_side=false, from_below=true);
// Tuners to the top, knobs pointing out the back
for (i=[0:1])
mirror([i,0,0]) translate([-3.5, -78, -32]) rotate([0, 0, -90]) UBassTuner(from_side=false, from_below=true, hole_tolerance=0.5);
for (i=[0:1]) for (j=[0:1])
mirror([i,0,0]) translate([-6, -85, -34]) mirror([0,j,0]) rotate([0, 0, -90]) UBassTuner(from_side=false, from_below=true, hole_tolerance=0.5, skip_ear=true);
// rotate([180, -90, 0]) UBassTuner(from_side=false, from_below=true);
}
module MyBodySegment() {
body_height = 24;
// Truss Rod overlapping - pseudo body joint
body_height = 26;
epsilon = 0.000001;
radius = 4;
w = neck_width() - radius*2;
curve_dist = 40;
step = 0.08;
steps = curve_dist/step;
slope_start = 425;
slope_start = 435;
slope_end = 485;
translate([-neck_width()/2, y0, -body_height]) round_cube([neck_width(), slope_start, body_height], radius);
hull() {
// translate([-w/2, 475+y0-epsilon, -epsilon]) cube([30, epsilon, epsilon]);
// translate([-w/2, +y0, -body_height]) cube([30, 460, body_height]);
$fn = 64;
for (i = [0,1]) mirror([i, 0, 0]) {
translate([w/2, radius+y0, radius-body_height]) sphere(radius);
@ -1188,41 +1225,41 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
// translate([+w/2, 495+y0, 0]) sphere(radius);
// translate([-w/2, 495+y0, 0]) sphere(radius);
difference() {
translate([0, 490+y0, 0]) sphere(d=neck_width(), $fn=360);
translate([0, 490+y0, 50]) cube([100, 100, 100], center=true);
translate([0, slope_end+y0, 0]) sphere(d=neck_width(), $fn=360);
translate([0, slope_end+y0, 50]) cube([100, 100, 100], center=true);
}
}
// Tuner bulge
tuner_bulge_w = 54;
tuner_bulge_l = 45;
tuner_bulge_taper = 15;
tuner_bulge_w = 56;
tuner_bulge_l = 25;
tuner_bulge_taper = 12;
hull() {
translate([-tuner_bulge_w/2, y0, -body_height]) round_cube([tuner_bulge_w, tuner_bulge_l, body_height], r = radius);
translate([-neck_width()/2, y0, -body_height]) round_cube([neck_width(), tuner_bulge_l+tuner_bulge_taper, body_height], r = radius);
}
// Electronics bulge
hull() {
bulge_w = 42.5;
bulge_l = 55;
bulge_y = pickup_y-40;
translate([-neck_width()/2, bulge_y-15, -body_height]) round_cube([neck_width(), bulge_l+30, body_height+$extra_thickness_above_center], r = radius);
translate([-bulge_w/2, pickup_y-40, $extra_thickness_above_center-body_height]) round_cube([bulge_w, bulge_l, body_height], r = radius);
}
// hull() {
// bulge_w = 36;
// bulge_l = 55;
// bulge_y = pickup_y-40;
// translate([-neck_width()/2, bulge_y-15, -body_height]) round_cube([neck_width(), bulge_l+30, body_height+$extra_thickness_above_center], r = radius);
// translate([-bulge_w/2, pickup_y-40, $extra_thickness_above_center-body_height]) round_cube([bulge_w, bulge_l, body_height], r = radius);
// }
}
module HeadPiece() {
x0 = behind_fret(0);
end_radius = 12;
x2 = x0 + 29;
x1 = x2 - end_radius;
y0 = behind_fret(0);
end_radius = 14;
y_end = y0 + headstock_length;
y1 = y_end - end_radius;
z0 = $scallop_depth + $extra_thickness_above_center;
z1 = $scallop_depth + get_max_fret_height() + $extra_thickness_above_center;
module StringHoles() {
$fn=360;
ballend_v = [0,x0+21,-3];
for (i = [0:$num_strings-1]) translate([string_x(i, x0),0,0]) {
ballend_v = [0,y0+21,-3];
for (i = [0:$num_strings-1]) translate([string_x(i, y0),0,0]) {
max_dia = 4; // ball wrap is like 3.8mm on these strings
hole_dia = min(4, $string_diameters_mm[i]*1.5 + 1);
string_v = [0, fret_scale_length(0), z1+hole_dia/2];
@ -1240,18 +1277,18 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
}
}
module Label() {
// translate([0, lerp(x0, x2, 0.5), z0-0.5]) linear_extrude(0.5) text(ichthys, font="Noto Sans", size=6, halign="center", valign="center");
// translate([0, lerp(x0, x2, 0.5), z0-0.5]) linear_extrude(0.5) text(chirho, font="DejaVu Sans", size=12, halign="center", valign="center");
translate([0, lerp(x0, x2, 0.5), z0-0.5]) linear_extrude(0.5) text(khiro, font="Noto Sans Coptic", size=12, halign="center", valign="center");
// translate([0, lerp(y0, y_end, 0.5), z0-0.5]) linear_extrude(0.5) text(ichthys, font="Noto Sans", size=6, halign="center", valign="center");
// translate([0, lerp(y0, y_end, 0.5), z0-0.5]) linear_extrude(0.5) text(chirho, font="DejaVu Sans", size=12, halign="center", valign="center");
translate([0, lerp(y0, y_end, 0.5), z0-0.5]) linear_extrude(0.5) text(khiro, font="Noto Sans Coptic", size=12, halign="center", valign="center");
}
if (list_has(include_colours, 0)) render() difference(){
$fn=360;
hull() {
translate([0,x0,0]) scale([neck_width(x0)/2, 0.01, $target_neck_thickness]) sphere(r=1);
translate([0,x1,0]) scale([neck_width(x1)/2, end_radius, $target_neck_thickness*1.0]) sphere(r=1);
translate([0,y0,0]) scale([neck_width(y0)/2, 0.01, $target_neck_thickness]) sphere(r=1);
translate([0,y1,0]) scale([neck_width(y1)/2, end_radius, $target_neck_thickness*1.0]) sphere(r=1);
}
translate([-500, x0, z0]) cube([1000, 1000, 1000]);
translate([-500, x0-1000, -500]) cube([1000, 1000, 1000]);
translate([-500, y0, z0]) cube([1000, 1000, 1000]);
translate([-500, y0-1000, -500]) cube([1000, 1000, 1000]);
StringHoles();
Label();
}
@ -1264,69 +1301,41 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
TaperNeck(fret_side_marker_x_angle=-23, fret_side_marker_y_angle=15) MyBodySegment();
}
module TrussRods(taper_points=segment_cuts, extra=0, tolerance=0.6) {
y1 = 270;
y2 = y1 + 630;
translate([0, y2, -4]) rotate([0, 0, 180]) TrussRod(taper_points=[ for (pt=taper_points) y2-pt ], extra=extra, tolerance=tolerance);
translate([0, y0, -16]) TrussRodSingleAction(taper_points=[ for (pt=taper_points) pt-y0 ], extra=extra, tolerance=tolerance);
}
dowel_positions = [
[-10, segment_cuts[4], 0],
[ 10, segment_cuts[4], 0],
[-10, segment_cuts[3], 0],
[ 10, segment_cuts[3], 0],
[ -9, segment_cuts[2], -17],
[ 9, segment_cuts[2], -17],
[-10.25, segment_cuts[2], 2.5],
[ 10.25, segment_cuts[2], 2.5],
[-10, segment_cuts[1], 0],
[ 10, segment_cuts[1], 0],
[-10, segment_cuts[1], -17],
[ 10, segment_cuts[1], -17],
];
module Dowels() {
for (v=dowel_positions) translate(v) Dowel();
}
module MyBody() {
render() difference() {
MyNeck();
TrussRods(extra=20);
Dowels();
Reinforcements($trussrods_extra = 20);
ElectronicsCavities(diff=true);
Tuners();
// Add a belt hole
arc = arc_points([[23, -13], [-23, -13], [0, -3]], 1);
belthole_r = 3;
belthole_fn = 72;
belthole_x0 = 135;
belthole_x1 = 260;
belthole_y1 = trussrod_y-5;
belthole_y0 = 140;
render() for (i = [0:len(arc)-2]) {
$fn = belthole_fn;
hull() {
translate([arc[i][0], belthole_x0, arc[i][1]]) sphere(belthole_r);
translate([arc[i+1][0], belthole_x0, arc[i+1][1]]) sphere(belthole_r);
translate([arc[i][0], belthole_x1, arc[i][1]]) sphere(belthole_r);
translate([arc[i+1][0], belthole_x1, arc[i+1][1]]) sphere(belthole_r);
x0 = arc[i][0];
x1 = arc[i+1][0];
m = 20;
cx0 = m*(1-cos(x0*120/neck_width()));
cx1 = m*(1-cos(x1*120/neck_width()));
translate([x0, belthole_y0-cx0, arc[i][1]]) sphere(belthole_r);
translate([x1, belthole_y0-cx1, arc[i+1][1]]) sphere(belthole_r);
translate([x0, belthole_y1+cx0, arc[i][1]]) sphere(belthole_r);
translate([x1, belthole_y1+cx1, arc[i+1][1]]) sphere(belthole_r);
}
}
}
}
reinforcing_tube_positions = [
// [-10, 125, 0],
// [ 10, 125, 0],
// [ 0, -95, -24],
];
module CFs(x0=-1000, x1=-1000) {
for (v = reinforcing_tube_positions) CFTubeCutout2(v, x0, x1);
}
module BottomLabel(depth=0.8) {
y0 = segment_cuts[segment];
y0 = $segment_cuts[segment];
size = 2.7;
v_spacing = 0.3;
z0 = [-4, -4, 4.8, -10.8, -10.8][segment];
@ -1337,8 +1346,7 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
}
if (preview) {
// TrussRods();
// CFs();
Reinforcements();
ElectronicsCavities();
Tuners();
color("#FF000080") MyBody();
@ -1352,8 +1360,8 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
difference() {
intersection() {
MyBody();
y0 = segment_cuts[segment];
y1 = segment_cuts[segment+1];
y0 = $segment_cuts[segment];
y1 = $segment_cuts[segment+1];
translate([-500, y0, -500]) cube([1000, y1-y0, 1000]);
}
if (!list_has($include_colours, 4)) BottomLabel();
@ -1363,11 +1371,12 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
}
}
colour_scheme = COLOURSCHEME_ABS_BLUE;
// TwoBangerMk2(preview=true);
segment = "bridge";
color(colour_scheme[0]) TwoBangerMk2([0], segment);
color(colour_scheme[1]) TwoBangerMk2([1], segment);
color(colour_scheme[2]) TwoBangerMk2([2], segment);
color(colour_scheme[3]) TwoBangerMk2([3], segment);
color("red") TwoBangerMk2([4], segment);
// colour_scheme = COLOURSCHEME_ABS_BLUE;
colour_scheme = COLOURSCHEME_ABS_CLOWNFISH;
TwoBangerMk2(preview=true);
// segment = "bridge";
// color(colour_scheme[0]) TwoBangerMk2([0], segment);
// color(colour_scheme[1]) TwoBangerMk2([1], segment);
// color(colour_scheme[2]) TwoBangerMk2([2], segment);
// color(colour_scheme[3]) TwoBangerMk2([3], segment);
// color("red") TwoBangerMk2([4], segment);

View File

@ -1,4 +1,4 @@
CF_Square_Width_tolerance = 0.4; // Add to CF_Square_Width when making holes
CF_Tube_OD_tolerance = 0.5;
CF_Tube_OD_tolerance = 0.45;
SS_Dowel_OD_tight = 5.25; // 5.2 very tight on most layer settings, 5.25 slightly loose (ABS 4 perimeters, 24% gyroid infill)
SS_Dowel_OD_loose = 5.3; // 5.2 very tight on most layer settings, 5.25 slightly loose

View File

@ -232,3 +232,52 @@ module TrussRodSingleAction(length = 460, tolerance = 0, taper_l = 3.0, taper_ex
];
TrussRodGeneric(length=length, tolerance=tolerance, stages=stages, taper_l=taper_l, taper_extra=taper_extra, taper_points=taper_points, extra=extra);
}
module TrussRods(extra=0, tolerance=0.6) {
for (rod = $trussrod_positions) {
pos = rod[0];
rot = rod[1];
m = rod[2];
// Transform absolute taper points to relate to the position and rotation of the rod
// Currently this will only work well for truss rods aligned along the Y axis
y_mul = cos(rot[2]); // This should be +1 for 0 rotation, -1 for 180 rotation. Incomplete for now, only covers 180° Z rotation.
taper_points = [ for (y = $segment_cuts) y_mul*(y - pos[1]) ];
// echo(rod, y_mul, taper_points)
translate(pos) rotate(rot) {
if (m == "TrussRodSingleAction") TrussRodSingleAction(extra=$trussrods_extra, tolerance=tolerance, taper_points=taper_points);
if (m == "TrussRod") TrussRod(extra=$trussrods_extra, tolerance=tolerance, taper_points=taper_points);
}
}
}
module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance) {
d = CF_Tube_OD + tolerance;
taper_OD = (CF_Tube_OD*taper_mul) + tolerance;
l = CF_Tube_Len;
$fn = 90;
for (v = $reinforcing_tube_positions) {
y0 = v[1];
y1 = y0+l;
translate(v = v) rotate([-90, 0, 0]) cylinder_beak(d=d, h=l);
for (cut_y = $segment_cuts) {
if (cut_y == y0) {
// Taper in only (beginning of segment)
translate([v[0], cut_y, v[2]]) rotate([-90,0,0]) cylinder_outer(d=taper_OD, d2=d, h=taper_length);
} else if (cut_y == y1) {
// Taper out only (end of segment)
translate([v[0], cut_y, v[2]]) rotate([90,0,0]) cylinder_outer(d=taper_OD, d2=d, h=taper_length);
} else if ((y1 > cut_y) && (cut_y > y0)) {
// Taper in and out (tube spans multiple segments)
translate([v[0], cut_y, v[2]]) for (i=[-1,1]) rotate([i*90,0,0]) cylinder_outer(d=taper_OD, d2=d, h=taper_length);
}
}
}
}
module Dowels() {
for (v = $dowel_positions) translate(v) Dowel();
}
module Reinforcements() {
TrussRods();
CFs();
Dowels();
}

View File

@ -10,6 +10,9 @@ function get_fret_height(fret) = sin($fret_angle) * get_fret_width(fret)/2;
function get_max_fret_width() = max($fret_widths);
function arc_starting_angle_to_height_ratio(angle) = ((1-cos(angle))/(sin(angle)));
function get_max_fret_height() = arc_starting_angle_to_height_ratio($fret_angle) * get_max_fret_width()/2;
function get_max_scallop_angle() = (is_undef($max_scallop_angle) || $max_scallop_angle <= 0) ? $fret_angle : $max_scallop_angle;
function get_final_scallop_length() = $scallop_depth / arc_starting_angle_to_height_ratio(get_max_scallop_angle());
function get_end_of_fretboard() = after_fret($num_frets) - get_final_scallop_length();
function behind_fret(fret) = fret_scale_length(fret) + get_fret_width(fret)/2;
function after_fret(fret) = fret_scale_length(fret) - get_fret_width(fret)/2;
@ -164,7 +167,6 @@ module neck(string_spacing=18, string_margin=4.5, num_strings=3, target_neck_thi
module TaperNeck(
target_neck_thickness_additional_points = [],
max_scallop_angle = $fret_angle, // match this to fret_angle for a nice continuous look
filler = false,
fret_side_marker_x_angle = -37,
fret_side_marker_y_angle = -4,
@ -176,9 +178,8 @@ module TaperNeck(
z1 = z0 + $scallop_depth; // Frets protrude from here
z2 = z1 + get_max_fret_height(); // Nothing above this => thickest top of neck
y2 = fret_scale_length($num_frets) - get_fret_width($num_frets)/2; // bridge-side edge of final fret
final_scallop_length = $scallop_depth / arc_starting_angle_to_height_ratio(max_scallop_angle);
y1 = y2 - final_scallop_length;
y2 = after_fret($num_frets); // bridge-side edge of final fret
y1 = y2 - get_final_scallop_length();
module neck_stock() {
angle_excess = asin(z2/$target_neck_thickness);
@ -213,13 +214,13 @@ module TaperNeck(
module scallop(fret) {
x0 = fret_scale_length(fret) - get_fret_width(fret)/2;
x_fret = fret_scale_length(fret+1) + get_fret_width(fret+1)/2;
x1 = (fret < $num_frets) ? x_fret : (x0 - final_scallop_length*2);
x1 = (fret < $num_frets) ? x_fret : (x0 - get_final_scallop_length()*2);
xmid = lerp(x0, x1, 0.5);
xdelta = x0-x1;
maxdepth_angle = 90+arc_points_angle([[x0, z1], [x1, z1], [xmid, z0]]);
// echo(str(maxdepth_angle));
a = min(max_scallop_angle, maxdepth_angle);
a = min(get_max_scallop_angle(), maxdepth_angle);
fn = 50;
fn2 = fn * 2;
ca = cos(a);
@ -263,19 +264,25 @@ module TaperNeck(
for (num_text = fret_inlays) {
fret = num_text[0];
if (fret <= $num_frets) {
x0 = fret_scale_length(fret-1)-get_fret_width(fret-1)/2;
x1 = fret_scale_length(fret)+get_fret_width(fret)/2;
x_mid = lerp(x0, x1, 0.5);
max_height = x0 - x1 - 4;
max_width = neck_width(x_mid) * 0.8;
y0 = behind_fret(fret);
y1 = after_fret(fret-1);
y_mid = lerp(y0, y1, 0.5);
max_height = y1 - y0 - 4;
max_width = neck_width(y_mid) * 0.8;
estimated_width_chars = len(num_text[1])*7/5;
fontsize_from_max_width = max_width/estimated_width_chars;
fontsize_from_max_height = max_height;
// echo(str(max_width, " ", estimated_width_chars, " ", fontsize_from_max_height, " ", fontsize_from_max_width));
desired_fontsize = min(fontsize_from_max_height, fontsize_from_max_width);
translate([0, x_mid, z0-0.5])
linear_extrude(30)
text(text = num_text[1], font = JP_Sans_Font, halign = "center", valign = "center", size = clamp(2, desired_fontsize, 10));
fontsize = clamp(2, desired_fontsize, 10);
t = num_text[1];
translate([0, y_mid, z0-0.5]) linear_extrude(30) {
if (t == ".") {
circle(d=fontsize*0.9, $fn=72);
} else {
text(text = num_text[1], font = JP_Sans_Font, halign = "center", valign = "center", size = fontsize);
}
}
}
}
}

View File

@ -1,10 +1,10 @@
module UBassTuner(from_below=false, from_side=true, hole_tolerance=0) {
module UBassTuner(from_below=false, from_side=true, hole_tolerance=0, skip_ear=false) {
t_base = 11;
d_thread = 11.0 + 0.25 + hole_tolerance;
d_collar = 13.8 + 0.2 + hole_tolerance; // Add some tolerance
l_collar = 8; // doesn't include hex
l_collarnut_to_top_of_peg = 19; //22;
l_collarnut_to_top_of_peg = 22; //19; == washer diameter //22;
d_top_of_peg = 16+2 + hole_tolerance;
max_thread = 5.0; // thread to cover without the collar
w_tag = 19;
@ -95,7 +95,7 @@ module UBassTuner(from_below=false, from_side=true, hole_tolerance=0) {
}
}
// ear clearance
color(clear_color) hull() {
if (!skip_ear) color(clear_color) hull() {
translate([l_wormshaft_collar, 0, 0]) rotate([0, 90, 0]) cylinder(h=0.1, d=d_wormshaft_collar, $fn=72);
translate([l_wormshaft_ear, 0, 0]) rotate([0, 90, 0]) cylinder(h=0.1, d=d_wormshaft_ear, $fn=72);
}

View File

@ -90,11 +90,15 @@ module circle_outer(d) {
circle(d=d*fudge);
}
module cylinder_outer(d, h, center=false) {
module cylinder_outer(d, h, center=false, d2=undef) {
// Regular circle inscribes, this circumscribes
$fn = (is_undef($fn) || $fn<3) ? 72 : $fn;
fudge = 1/cos(180/$fn);
cylinder(d=d*fudge, h=h, center=center);
if (is_undef(d2)) {
cylinder(d=d*fudge, h=h, center=center);
} else {
cylinder(d1=d*fudge, d2=d2*fudge, h=h, center=center);
}
}
module cylinder_beak(d, h, beak=0.75) {

@ -1 +1 @@
Subproject commit 27c7ede3b7298f0a629553033e2a78e13e627bef
Subproject commit 26f8c2cf8124cdafe2fc21f9f9bbf2514e404834