diff --git a/CFTubes.scad b/CFTubes.scad index c8cafe8..ab704da 100644 --- a/CFTubes.scad +++ b/CFTubes.scad @@ -14,6 +14,7 @@ include shumbucker_h = 20.3; shumbucker_l = 23.1; +shumbucker_lu = 17.1; // Upper shumbucker_w1 = 66.4; shumbucker_w2 = 82.9; // 1.6mm in, a 2.0mm hole on each side relay_coil_housing_w = 15.2; @@ -661,10 +662,11 @@ module Nylon6String(render_colour_0=true, render_colour_1=true, render_colour_2= -module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { +module Steel6String(include_colours, segment=-1, reference=false) { + // Artist Strat clone has a neck thickness of about 20mm at the 12th fret, where we want to overlap the truss rods + // We will probably have to overlap them horizontally, far from ideal, to achieve the desired thinness. $include_colours = include_colours; - $id_line_0 = "ABS"; - $id_line_1 = "2"; + $id_lines = ["ABS", "2"]; $guitar_scale_length_mm = Fender_Scale_mm; $fsl_mm = fret_scale_length(0); @@ -674,7 +676,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { $num_frets = 22; $num_strings = 6; // 56mm wide neck - $string_spacing_nut = 10; // 50mm E to e + $string_spacing_nut = 9; // 45mm E to e $string_spacing_bridge = 11.2; // 56mm E to e $string_margin = 3; // +6 $neck_width_nut = default_neck_width_nut(); @@ -682,113 +684,68 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { body_width = 96; $scallop_depth = 2.0; $fret_widths = default_fret_widths(3.6, 2.4); - $fret_angle = 60; + $fret_angle = 50; $target_neck_thickness = 16; // echo(fret_scale_length(8)); // echo(fret_scale_length(9)); - rx0 = -40; // Reinforcing rods start - rx1 = rx0+280; + // rx0 = -40; // Reinforcing rods start + // rx1 = rx0+280; + + + // Artist Strat has about 18cm of headstock and 10cm past bridge on body + y0 = -160; + headstock_length = 36; + y_end = behind_fret(0) + headstock_length; + y_fretboard_end = get_end_of_fretboard(); + + $segment_cuts = [y0, 0, after_fret(22), after_fret(8), behind_fret(0), y_end]; + echo("Segment cuts:", $segment_cuts, "have lengths", [ for (i=[1:len($segment_cuts)-1]) $segment_cuts[i]-$segment_cuts[i-1]]); target_neck_thickness_additional_points = []; - // target_neck_thickness_additional_points = [[rx0+CF_Tube_Len+20, 22], [0, 22]]; - echo(str("Making a Steel 6 String with scale length ", fsl_mm, "mm = ", fsl_mm/25.4, "in and neck width ", neck_width_nut, "mm")); - assert(fsl_mm == Fender_Scale_mm); // Make sure the function correctly uses our changed global + // trussrod_y = 265; + $trussrod_positions = [ + [[0, y_end-3, -9.5], [0, 0, 180], "TrussRodSingleAction"], + // [[-8, y0, -32], [1.3, 0, 0], "TrussRod"], + ]; + $trussrods_extra = 0; + $dowel_positions = [ + [ -9, $segment_cuts[4], -10], + [ 9, $segment_cuts[4], -10], + [ -8, $segment_cuts[3], -11], + [ 8, $segment_cuts[3], -11], + [-44, $segment_cuts[2], -22], + [ 44, $segment_cuts[2], -22], + [-44, $segment_cuts[2], -6], + [ 44, $segment_cuts[2], -6], + [-10, $segment_cuts[1], -4], + [ 10, $segment_cuts[1], -4], + [-17, $segment_cuts[1], -16], + [ 17, $segment_cuts[1], -16], + ]; + $reinforcing_tube_positions = [ + [-17, y_end-25-CF_Tube_Len, -4.5], + [ 17, y_end-25-CF_Tube_Len, -4.5], + [ 0, y0, -24], + ]; + $reinforcing_square_positions = [ + [-12, y0, -34], + [ 12, y0, -34], + [-12, y0, -24], + [ 12, y0, -24], + [-24, y0, -24], + [ 24, y0, -24], + ]; - function CF_Span_Coords(full_length = 700, ply = 3) = [for (i=[0:ply-1]) [0, lerp(0, full_length-CF_Tube_Len, i/(ply-1)), CF_Square_Width*i]]; - module CF_Span(full_length = 700, ply = 3, hole = true) { - for (v = CF_Span_Coords(full_length, ply)) - translate(v) CFSquare(hole=hole); - } module MyNeck(inlays_only=false, side_markers_only=false, fret_layers_only=false, engrave_markers=false, remove_fret_layers=false) { render() TaperNeck(target_neck_thickness_additional_points = target_neck_thickness_additional_points); } - module truss_rods() { - include_from_fret = (from_fret==0); - x0 = fret_scale_length(to_fret) - get_fret_width(to_fret)/2; - //x1 = fret_scale_length(from_fret) + ((include_from_fret)?1:(-1)) * get_fret_width(from_fret)/2; - x1 = include_from_fret ? x0 : (fret_scale_length(from_fret) - get_fret_width(from_fret)/2); // hacky fix for included headpiece - tolerance = reference ? 0 : 0.6; - rod_mm = 630; - v = [0, 40, -9]; - // Nut facing bridge - // o = v[1]; - // taper_points = reference ? [] : [x0-o, x1-o]; - // translate(v) TrussRod(taper_points = taper_points, tolerance = tolerance, extra = !reference); - // Nut facing headstock - o = v[1]; - taper_points = reference ? [] : [rod_mm-(x0-o), rod_mm-(x1-o)]; - translate(v + [0, rod_mm, 0]) rotate([0, 0, 180]) TrussRod(taper_points = taper_points, tolerance = tolerance, extra = !reference); - } - - reinforcing_tube_positions = flatten([ - [ - for (i=[-1,1]) each [ - // Headside reinforcement - [i*20.5, rx1, -4], - // Bridgeside reinforcement - [i*20.5, rx0, -4], - // [i*17.25, rx0, -10], - // [i*17, rx0, -12], - // [i*3.95, rx0, -16.5], - ] - ], - [ - // Headside reinforcement - // [0, rx1, -4], - // [0, rx1, -11], - // Bridgeside reinforcement - // [0, rx0, -11], - ]]); - echo(reinforcing_tube_positions); - // Through span construction - rx2 = fret_scale_length(15) - CF_Tube_Len; - reinforcing_square_positions = flatten([ - [ - for (i=[-1,1]) each [ - // Headside reinforcement - // [i*20.5, rx1, -4], - // Bridgeside reinforcement - [i*12, rx2, -6], - // [i*17.25, rx2, -10], - // [i*17, rx0, -12], - // [i*3.95, rx0, -16.5], - ] - ], - [ - // Headside reinforcement - // [0, rx1, -4], - // [0, rx1, -11], - // Bridgeside reinforcement - // [0, rx0, -11], - ]]); - echo(reinforcing_square_positions); - - - // neck(num_frets=num_frets, num_strings=num_strings, string_margin=string_margin, string_spacing=string_spacing); - // %neck(num_frets=num_frets, num_strings=num_strings, string_margin=string_margin, string_spacing=string_spacing, scallop_depth=scallop_depth, target_neck_thickness=target_neck_thickness); - module NeckFragment(from_fret, to_fret, to_origin=true, include_from_fret=false) { - x0 = fret_scale_length(to_fret) - get_fret_width(to_fret)/2; - x1 = fret_scale_length(from_fret) + ((include_from_fret)?1:(-1)) * get_fret_width(from_fret)/2; - xn = fsl_mm + fret_widths[0]; - - //translate([0,to_origin ? -x0 : 0,0]) - render() difference() { - MyNeck(); - translate([-100, 0, -100]) cube([200, x0, 200]); - translate([-100, x1, -100]) cube([200, xn-x1, 200]); - for (v = reinforcing_tube_positions) CFTubeCutout2(v, x0, x1); - for (v = reinforcing_square_positions) CFSquareCutout2(v, x0, x1); - truss_rods(); - } - } - module RealPiece(from_fret, to_fret, include_from_fret=false) { // midpoint = (fret_scale_length(from_fret) - fret_scale_length(to_fret) + (include_from_fret ? fret_width : 0))/2; module IDText(thickness = 0.2, inset = 0, extra_line=str("F", to_fret)) { translate([0,0,-8]) rotate([-90,180,180]) translate([0,0,-thickness-inset]) linear_extrude(thickness) { - text(str(id_line_0, id_line_1), size=2.25, halign="center", valign="center", $fn=100); + text(str($id_lines[0], $id_lines[1]), size=2.25, halign="center", valign="center", $fn=100); translate([0,-3]) text(extra_line, size=2.25, halign="center", valign="center", $fn=100); } } @@ -807,46 +764,44 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { } } - function string_x(i, y) = (num_strings-i-1)*string_spacing(y) - neck_width(y)/2 + string_margin; - module HeadPiece(label=true) { - string_offsets = [-2.5, 0, 2.5, -2.5, 0, 2.5]; - x0 = fret_scale_length(0) + fret_widths[0]/2; + string_offsets = [-2.4, 0, 2.4, -2.4, 0, 2.4]; + y0 = behind_fret(0); end_radius = 12; - x1 = x0 - rx0 + end_radius; - z1 = scallop_depth + max_fret_height; + y1 = y0 + headstock_length; + z0 = $scallop_depth; + z1 = z0 + get_max_fret_height(); + z2 = z0 + 2.5; //get_max_fret_height(); module StringHoles() { - for (i = [0:num_strings-1]) translate([string_x(i, x0),0,0]) { - // translate([0,0,z1+string_diameters_mm[i]]) rotate([-105,0,0]) cylinder(h=30, d=string_diameters_mm[i]*2, $fn=cyl_ld_fn); + for (i = [0:$num_strings-1]) translate([string_x(i, y0),y0,0]) { + string_v = [0,0,z1+$string_diameters_mm[i]]; + ballend_v = [string_offsets[i],27,-3.5]; hull() { - translate([0,0,z1+string_diameters_mm[i]]) sphere(d=min(2.6, string_diameters_mm[i]*1.2 + 1), $fn=360); - translate([string_offsets[i],27,-3.5]) sphere(d=2.6, $fn=360); + translate(string_v) sphere(d=min(2.6, $string_diameters_mm[i]*1.2 + 1), $fn=360); + translate(ballend_v) sphere(d=2.6, $fn=360); } hull() { // String ball ends are roughly 3mm by 4mm cylinder(d=4, h=3) - // translate([string_offsets[i],29,-3.5]) sphere(d=5.5, $fn=360); - // translate([string_offsets[i],29+11,-17]) sphere(d=7, $fn=360); - translate([string_offsets[i],27,-3.5]) rotate([0, 90, 0]) cylinder(d=4.5, h=3.5, center=true, $fn=360); - translate([string_offsets[i],27+27,-17]) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true, $fn=360); + translate(ballend_v) rotate([0, 90, 0]) cylinder(d=4.5, h=3.5, center=true, $fn=360); + translate(ballend_v+ballend_v-string_v) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true, $fn=360); } } } - fw2 = fret_widths[0]/2; + module Label() { + translate([0, lerp(y0, y_end, 0.55), z2-0.5]) linear_extrude(0.5) scale(1.0) import(file = "svgs/Ichthys.plain.svg", center=true); + } render() difference(){ hull() { - translate([0,fw2,0]) scale([neck_width(x0)/2, 0.01, target_neck_thickness]) sphere(r=1, $fn=360); - translate([0,-rx0-end_radius,0]) scale([neck_width(x1)/2, end_radius, target_neck_thickness*1.0]) sphere(r=1, $fn=360); - } - translate([-500, 0, scallop_depth]) cube([1000, 1000, 1000]); - translate([-500, fw2 - 1000, -500]) cube([1000, 1000, 1000]); - translate([0, -fret_scale_length(0), 0]) { - for (v = reinforcing_tube_positions) CFTubeCutout2(v, x0, x1); - for (v = reinforcing_square_positions) CFSquareCutout2(v, x0, x1); + translate([0,y0,0]) scale([neck_width(y0)/2, 0.01, $target_neck_thickness]) sphere(r=1, $fn=360); + translate([0,y1-end_radius,0]) scale([neck_width(y1)/2, end_radius, $target_neck_thickness*1.0]) sphere(r=1, $fn=360); } + // Chop excess + translate([-500, y0, z2]) cube([1000, 1000, 1000]); + translate([-500, y0, z0]) rotate([10,0,0]) cube([1000, 1000, 1000]); + + translate([-500, y0 - 1000, -500]) cube([1000, 1000, 1000]); StringHoles(); - if (label) translate([-10,fw2+1,-10]) rotate([90,0,0]) linear_extrude(10) { - text(str(id_line_0, id_line_1), size=2.9, halign="center", valign="center", $fn=100); - } + Label(); } // StringHoles(); } @@ -918,25 +873,29 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { } } } + + module Shumbucker() { + translate([-shumbucker_w1/2, -shumbucker_l/2, 0]) cube([shumbucker_w1, shumbucker_l, shumbucker_h]); + translate([-shumbucker_w2/2, -shumbucker_l/2, 0]) cube([shumbucker_w2, shumbucker_l, 4]); + } + bridge_channel_width = 5; bridge_channel_depth = 7; if (reference) { - /*translate([0, -fsl_mm, 0]) */union() { + /*translate([0, -$fsl_mm, 0]) */union() { c_cf = [0.4, 0.5, 0.5]; %MyNeck(); - // CF square stacks - truss_rods(); - for (v = reinforcing_tube_positions) color(c_cf) translate(v) CFTube(); - for (v = reinforcing_square_positions) color(c_cf) translate(v) CFSquare(); + color(c_cf) Reinforcements(); + translate([0, fret_scale_length(24), 1-shumbucker_h]) Shumbucker(); // Approximate tuner placement // TunerPlacement(); // Render strings above for spacing reference string_excess = 80; - for (i = [0:num_strings-1]) { + for (i = [0:$num_strings-1]) { hull() { - translate([string_x(i, -string_excess), -string_excess, 5]) sphere(d=string_diameters_mm[i], $fn=cyl_ld_fn); - translate([string_x(i, fsl_mm+5), fsl_mm+5, 5]) sphere(d=string_diameters_mm[i], $fn=cyl_ld_fn); + translate([string_x(i, -string_excess), -string_excess, 5]) sphere(d=$string_diameters_mm[i], $fn=cyl_ld_fn); + translate([string_x(i, $fsl_mm+5), $fsl_mm+5, 5]) sphere(d=$string_diameters_mm[i], $fn=cyl_ld_fn); } } } @@ -1054,35 +1013,6 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { } } -// echo(fret_scale_length(0) - fret_scale_length(8)); // 225.724 -// echo(fret_scale_length(8) - fret_scale_length(24)); // 240.335 -// fret_tube(0, 8); -// //translate([30, 0, 0]) -// fret_tube(8, 24); - -// headpiece(); -// UBassTuner(); - -// fret_tube_filler(24, 100); -// tailpiece(); -// bridge(); - -// Guitar_Scale_Length_mm = Classical_Short_Scale_mm; -// Nylon6String(reference=true); -// translate([0, fret_scale_length(22), 0]) Nylon6String(from_fret=0, to_fret=22); -// translate([0, Guitar_Scale_Length_mm, 0]) rotate([0,0,180]) Nylon6String(reference=true); -// rotate([0,0,180]) Nylon6String(from_fret=-1); -// Nylon6String(from_fret=-2); -// Nylon6String(from_fret=-3); -// Nylon6String(from_fret=-4); -// %Nylon6String(from_fret=-5); - -// difference() { -// translate([-15, -60, 0]) cube([50, 120, 8]); -// translate([0, 55, 3]) rotate([180,0,0]) NylonTuner(); -// } - - // Colour schemes include @@ -1095,12 +1025,13 @@ COLOURSCHEME_ABS_BLUE = [BAMBU_ABS_NAVY_BLUE, BAMBU_ABS_AZURE, BAMBU_ABS_AZURE, COLOURSCHEME_PETGHF_BLUE = [BAMBU_PETGHF_LAKE_BLUE, BAMBU_PETGHF_LAKE_BLUE, "", ""]; // colour_scheme = COLOURSCHEME_ABSGF_CLOWNFISH; -// colour_scheme = COLOURSCHEME_ABS_BLUE; +colour_scheme = COLOURSCHEME_ABS_BLUE; // color(colour_scheme[0]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[0]); // color(colour_scheme[1]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[1]); // color(colour_scheme[2]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[2]); // color(colour_scheme[3]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[3]); -// rotate([90,0,0]) Steel6String(include_colours=[0,1,2,3], reference=true); +// rotate([90,0,0]) +Steel6String(include_colours=[0,1,2,3], reference=true); // TrussRodSingleAction(); // translate([20, 0]) TrussRod(); @@ -1374,11 +1305,11 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) { } // colour_scheme = COLOURSCHEME_ABS_BLUE; -colour_scheme = COLOURSCHEME_ABS_CLOWNFISH; -// TwoBangerMk2(preview=true); -segment = 1; -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_CLOWNFISH; +// // TwoBangerMk2(preview=true); +// segment = 1; +// 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/common.scad b/CFTubes/common.scad index bd55adf..bf1cc53 100644 --- a/CFTubes/common.scad +++ b/CFTubes/common.scad @@ -250,12 +250,12 @@ module TrussRods(extra=0, tolerance=0.6) { } } } -module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance) { +module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance, tolerance_length = CF_Square_Width_tolerance) { d = CF_Tube_OD + tolerance; taper_OD = (CF_Tube_OD*taper_mul) + tolerance; - l = CF_Tube_Len; + l = CF_Tube_Len;// + tolerance_length*2; $fn = 90; - for (v = $reinforcing_tube_positions) { + if (!is_undef($reinforcing_tube_positions)) for (v = $reinforcing_tube_positions) { y0 = v[1]; y1 = y0+l; translate(v = v) rotate([-90, 0, 0]) cylinder_beak(d=d, h=l); @@ -272,6 +272,37 @@ module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance) } } } + + w = CF_Square_Width + tolerance; + taper_w = (CF_Square_Width * taper_mul) + tolerance; + taper_epsilon = 0.00001; + if (!is_undef($reinforcing_square_positions)) for (v = $reinforcing_square_positions) { + y0 = v[1]; + y1 = y0+l; + // Full square rod, unconditional + translate([v[0]-w/2, v[1], v[2]-w/2]) cube([w, l, w]); + for (cut_y = $segment_cuts) { + if (cut_y == y0) { + // Taper in only (beginning of segment) + hull() { + translate([v[0], cut_y+taper_epsilon/2, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true); + translate([v[0], cut_y+taper_length/2, v[2]]) cube([w, taper_length, w], center=true); + } + } else if (cut_y == y1) { + // Taper out only (end of segment) + hull() { + translate([v[0], cut_y-taper_epsilon/2, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true); + translate([v[0], cut_y-taper_length/2, v[2]]) cube([w, taper_length, w], center=true); + } + } else if ((y1 > cut_y) && (cut_y > y0)) { + // Taper in and out (tube spans multiple segments) + hull() { + translate([v[0], cut_y, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true); + translate([v[0], cut_y, v[2]]) cube([w, taper_length*2, w], center=true); + } + } + } + } } module Dowels() { for (v = $dowel_positions) translate(v) Dowel(); diff --git a/EllipticalNeck.scad b/EllipticalNeck.scad index 7fc85d2..c482bdc 100644 --- a/EllipticalNeck.scad +++ b/EllipticalNeck.scad @@ -1,4 +1,5 @@ // Include after common.scad +$extra_thickness_above_center = is_undef($extra_thickness_above_center) ? 0 : $extra_thickness_above_center; function default_fret_widths(zero_fret_width, other_fret_width) = flatten([[zero_fret_width], [ for (i = [1:$num_frets]) other_fret_width ]]); function default_neck_width_nut() = ($num_strings-1)*$string_spacing_nut + $string_margin*2; @@ -276,6 +277,7 @@ module TaperNeck( desired_fontsize = min(fontsize_from_max_height, fontsize_from_max_width); fontsize = clamp(2, desired_fontsize, 10); t = num_text[1]; + // TODO: account for shallow scallops translate([0, y_mid, z0-0.5]) linear_extrude(30) { if (t == ".") { circle(d=fontsize*0.9, $fn=72);