From f723e8c7303b843a8376648a82d6671507b1d32b Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Sun, 2 Feb 2025 14:52:25 +1030 Subject: [PATCH] First 0.08mm print attempt - sadly overtight tolerances --- CFTubes.scad | 101 ++++++++++++++++++++++++++++++++------------ EllipticalNeck.scad | 10 ++++- 2 files changed, 84 insertions(+), 27 deletions(-) diff --git a/CFTubes.scad b/CFTubes.scad index adfd976..298b410 100644 --- a/CFTubes.scad +++ b/CFTubes.scad @@ -641,15 +641,21 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { // 56mm wide neck string_spacing_nut = 10; // 50mm E to e string_spacing_bridge = 11.2; // 56mm E to e + function string_spacing(y) = lerp(string_spacing_bridge, string_spacing_nut, y/fret_scale_length(0)); string_margin = 3; // +6 - neck_width = string_spacing_bridge*(num_strings-1) + string_margin*2; + neck_width_nut = (num_strings-1)*string_spacing_nut + string_margin*2; + neck_width_bridge = (num_strings-1)*string_spacing_bridge + string_margin*2; + function neck_width_mm(y) = lerp(neck_width_bridge, neck_width_nut, y/fret_scale_length(0)); body_width = 96; - scallop_depth = 2.5; - _zero_fret_width = 3.0; + scallop_depth = 2.0; + _zero_fret_width = 3.6; _fret_width = 2.4; fret_widths = flatten([[_zero_fret_width], [ for (i = [1:num_frets]) _fret_width ]]); function get_fret_width(fret) = fret_widths[clamp(0, fret, num_frets)]; - target_neck_thickness = 16; //22; + fret_angle = 60; + max_fret_width = max(fret_widths); + max_fret_height = sin(fret_angle) * max_fret_width/2; + target_neck_thickness = 16; // echo(fret_scale_length(8)); // echo(fret_scale_length(9)); rx0 = -40; // Reinforcing rods start @@ -658,7 +664,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { 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, "mm")); + 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 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]]; @@ -670,6 +676,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { render() TaperNeck( num_frets = num_frets, fret_widths = fret_widths, + fret_angle = fret_angle, num_strings = num_strings, string_margin = string_margin, string_spacing_nut = string_spacing_nut, @@ -681,22 +688,40 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { ); } + 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 ? (fret_scale_length(from_fret) - get_fret_width(from_fret)/2) : x0; // hacky fix for included headpiece + tolerance = reference ? 0 : 0.24; + 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*21.5, rx1, -4], + [i*20.5, rx1, -4], // Bridgeside reinforcement - // [i*21.5, rx0, -4], - [i*17.25, rx0, -10], + [i*20.5, rx0, -4], + // [i*17.25, rx0, -10], // [i*17, rx0, -12], - [i*3.95, rx0, -16.5], + // [i*3.95, rx0, -16.5], ] ], [ // Headside reinforcement - [0, rx1, -4], - [0, rx1, -11], + // [0, rx1, -4], + // [0, rx1, -11], // Bridgeside reinforcement // [0, rx0, -11], ]]); @@ -704,7 +729,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { // Through span construction span_coords = CF_Span_Coords(ply=2); reinforcing_square_positions = [ - for (i=[-1,1]) each [ for (v = span_coords) [i*10, rx0, -10] + v ] + // for (i=[-1,1]) each [ for (v = span_coords) [i*10, rx0, -10] + v ] ]; echo(reinforcing_square_positions); @@ -723,6 +748,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { 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(); } } @@ -749,33 +775,44 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { } } - module HeadPiece() { - x0 = fret_scale_length(0) + fret_width/2; + function string_x(i, y) = (num_strings-i-1)*string_spacing(y) - neck_width_mm(y)/2 + string_margin; + + module HeadPiece(label=true) { + string_offsets = [-2, 0, 2.5, -2.5, 0, 2]; + x0 = fret_scale_length(0) + fret_widths[0]/2; end_radius = 12; x1 = x0 - rx0 + end_radius; + z1 = scallop_depth + max_fret_height; module StringHoles() { - for (i = [0:num_strings-1]) translate([(num_strings-i-1)*string_spacing - neck_width/2 + string_margin,0,0]) { - translate([0,0,scallop_depth+fret_width/2+string_diameters_mm[i]]) rotate([-105,0,0]) cylinder(h=30, d=string_diameters_mm[i]*2, $fn=cyl_ld_fn); - // translate([0,23,-4]) rotate([-150,0,0]) translate([0,0,0]) cylinder(h=20, d=4, $fn=cyl_ld_fn); + 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); hull() { - translate([0,29,-3.5]) sphere(d=5.5, $fn=360); - translate([0,29+11,-17]) sphere(d=7, $fn=360); + translate([0,0,z1+string_diameters_mm[i]]) sphere(d=string_diameters_mm[i]*2, $fn=360); + translate([string_offsets[i],27,-3.5]) sphere(d=min(string_diameters_mm[i]*2.2, 2.7), $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+24,-17]) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true, $fn=360); } } } + fw2 = fret_widths[0]/2; render() difference(){ hull() { - translate([0,fret_width/2,0]) scale([neck_width/2, 0.01, target_neck_thickness]) sphere(r=1, $fn=360); - translate([0,-rx0-end_radius,0]) scale([neck_width/2, end_radius, target_neck_thickness*0.93]) sphere(r=1, $fn=360); + translate([0,fw2,0]) scale([neck_width_mm(x0)/2, 0.01, target_neck_thickness]) sphere(r=1, $fn=360); + translate([0,-rx0-end_radius,0]) scale([neck_width_mm(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, fret_width/2 - 1000, -500]) 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); } StringHoles(); - translate([-10,fret_width/2+1,-10]) rotate([90,0,0]) linear_extrude(10) { + 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); } } @@ -853,22 +890,34 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { bridge_channel_depth = 7; if (reference) { - 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(); // Approximate tuner placement - TunerPlacement(); + // TunerPlacement(); // Render strings above for spacing reference string_excess = 80; for (i = [0:num_strings-1]) { - translate([(num_strings-i-1)*string_spacing - neck_width/2 + string_margin,0,5]) rotate([-90,0,0]) translate([0,0,-string_excess/2]) cylinder(h=fsl_mm+string_excess, d=string_diameters_mm[i], $fn=cyl_ld_fn); + 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); + } } } + %HeadPiece(false); } else if (from_fret >= 0) { RealPiece(from_fret, to_fret, include_from_fret = (from_fret==0)); + if ((from_fret == 0) && list_has(include_colours, 0)) { + echo("Making a headpiece"); + render() difference() { + translate([0, fret_scale_length(0), 0]) HeadPiece(false); + truss_rods(); + } + } } else if (from_fret == -1) { // String holding headpiece echo("Making a headpiece"); diff --git a/EllipticalNeck.scad b/EllipticalNeck.scad index cad198c..3dab5c7 100644 --- a/EllipticalNeck.scad +++ b/EllipticalNeck.scad @@ -273,10 +273,18 @@ module TaperNeck( translate([-neck_width_bridge, 0, 0]) cube([neck_width_bridge*2, (fret_scale_length(25)+fret_scale_length(24))/2, target_neck_thickness*3]); } } else { + has0 = list_has(include_colours, 0); has1 = list_has(include_colours, 1); has2 = list_has(include_colours, 2); has3 = list_has(include_colours, 3); - render() intersection() { + if (has0) { + render() difference() { + carved_stock(); + if (!has1) intersect_fret_layers(); + if (!has2) fret_inlays(); + if (!has3) fret_side_markers(); + } + } else render() intersection() { difference() { carved_stock(); if (!has1) intersect_fret_layers();