diff --git a/CFTubes.scad b/CFTubes.scad index 30dfda2..5c41caa 100644 --- a/CFTubes.scad +++ b/CFTubes.scad @@ -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); diff --git a/CFTubes/ABS.scad b/CFTubes/ABS.scad index 1108746..9b52657 100644 --- a/CFTubes/ABS.scad +++ b/CFTubes/ABS.scad @@ -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 diff --git a/CFTubes/common.scad b/CFTubes/common.scad index 0c0ff15..bd55adf 100644 --- a/CFTubes/common.scad +++ b/CFTubes/common.scad @@ -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(); +} diff --git a/EllipticalNeck.scad b/EllipticalNeck.scad index 7c22026..7fc85d2 100644 --- a/EllipticalNeck.scad +++ b/EllipticalNeck.scad @@ -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); + } + } } } } diff --git a/UBassTuner.scad b/UBassTuner.scad index 11bc194..bc9fd2b 100644 --- a/UBassTuner.scad +++ b/UBassTuner.scad @@ -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); } diff --git a/common.scad b/common.scad index e6945fd..c841108 100644 --- a/common.scad +++ b/common.scad @@ -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) { diff --git a/scad-utils b/scad-utils index 27c7ede..26f8c2c 160000 --- a/scad-utils +++ b/scad-utils @@ -1 +1 @@ -Subproject commit 27c7ede3b7298f0a629553033e2a78e13e627bef +Subproject commit 26f8c2cf8124cdafe2fc21f9f9bbf2514e404834