diff --git a/CFTubes.scad b/CFTubes.scad index b880e09..a9ea2df 100644 --- a/CFTubes.scad +++ b/CFTubes.scad @@ -636,33 +636,28 @@ 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) { - id_line_0 = "ABS"; - id_line_1 = "2"; - fsl_mm = fret_scale_length(0); + $include_colours = include_colours; + $id_line_0 = "ABS"; + $id_line_1 = "2"; + $guitar_scale_length_mm = Fender_Scale_mm; + $fsl_mm = fret_scale_length(0); - string_diameters_thous = [9, 11, 16, 24, 32, 42]; // Artist ELST942 - string_diameters_mm = string_diameters_thous * 0.0254; + $string_diameters_thous = [9, 11, 16, 24, 32, 42]; // Artist ELST942 + $string_diameters_mm = $string_diameters_thous * 0.0254; - num_frets = 22; - num_strings = 6; + $num_frets = 22; + $num_strings = 6; // 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_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)); + $string_spacing_nut = 10; // 50mm E to e + $string_spacing_bridge = 11.2; // 56mm E to e + $string_margin = 3; // +6 + $neck_width_nut = default_neck_width_nut(); + $neck_width_bridge = default_neck_width_bridge(); body_width = 96; - 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)]; - fret_angle = 60; - max_fret_width = max(fret_widths); - max_fret_height = sin(fret_angle) * max_fret_width/2; - target_neck_thickness = 16; + $scallop_depth = 2.0; + $fret_widths = default_fret_widths(3.6, 2.4); + $fret_angle = 60; + $target_neck_thickness = 16; // echo(fret_scale_length(8)); // echo(fret_scale_length(9)); rx0 = -40; // Reinforcing rods start @@ -680,19 +675,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { 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( - 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, - string_spacing_bridge = string_spacing_bridge, - scallop_depth = scallop_depth, - target_neck_thickness = target_neck_thickness, - target_neck_thickness_additional_points = target_neck_thickness_additional_points, - include_colours = include_colours, - ); + render() TaperNeck(target_neck_thickness_additional_points = target_neck_thickness_additional_points); } module truss_rods() { @@ -798,7 +781,7 @@ 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_mm(y)/2 + string_margin; + 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]; @@ -825,8 +808,8 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) { fw2 = fret_widths[0]/2; render() difference(){ hull() { - 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([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]); @@ -1105,41 +1088,31 @@ 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_line_0 = "ABS"; - id_line_1 = "2"; - fsl_mm = fret_scale_length(0); + $id_line_0 = "ABS"; + $id_line_1 = "2"; + $fsl_mm = fret_scale_length(0); - string_diameters_thous = [80, 105]; // Artist BST45130 - string_diameters_mm = string_diameters_thous * 0.0254; + $string_diameters_thous = [80, 105]; // Artist BST45130 + $string_diameters_mm = $string_diameters_thous * 0.0254; - neck_width_nut = 32; //(num_strings-1)*string_spacing_nut + string_margin*2; - neck_width_bridge = 32; //(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)); - target_neck_thickness = 16; + $neck_width_nut = 32; + $neck_width_bridge = 32; + $target_neck_thickness = 16; - num_strings = 2; - string_spacing_nut = 20; - string_spacing_bridge = 20; - function string_spacing(y) = lerp(string_spacing_bridge, string_spacing_nut, y/fret_scale_length(0)); - string_margin = 6; - function string_x(i, y) = (num_strings-i-1)*string_spacing(y) - neck_width_mm(y)/2 + string_margin; + $num_strings = 2; + $string_spacing_nut = 20; + $string_spacing_bridge = 20; + $string_margin = 6; - num_frets = 30; - _zero_fret_width = 3.6; - _fret_width = 2.4; - fret_widths = flatten([[_zero_fret_width], [ for (i = [1:num_frets]) _fret_width ]]); - fret_angle = 60; - function get_fret_width(fret) = fret_widths[clamp(0, fret, num_frets)]; - function get_fret_height(fret) = sin(fret_angle) * get_fret_width(fret)/2; - max_fret_width = max(fret_widths); - max_fret_height = sin(fret_angle) * max_fret_width/2; - scallop_depth = 2.5; - extra_height = 6; + $num_frets = 30; + $fret_widths = default_fret_widths(3.6, 2.4); + $fret_angle = 60; + $scallop_depth = 2.5; + $extra_thickness_above_center = 6; - function behind_fret(fret) = fret_scale_length(fret) + fret_widths[fret]/2; - function after_fret(fret) = fret_scale_length(fret) - fret_widths[fret]/2; - segment_cuts = [-100, after_fret(num_frets), after_fret(29), after_fret(13), after_fret(5), behind_fret(0)+35]; + segment_cuts = [-100, after_fret($num_frets), 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]]); @@ -1177,27 +1150,29 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) { end_radius = 25; x2 = x0 + 30; x1 = x2 - end_radius; - z0 = scallop_depth + extra_height; - z1 = scallop_depth + max_fret_height + extra_height; + z0 = $scallop_depth + $extra_thickness_above_center; + z1 = $scallop_depth + get_max_fret_height() + $extra_thickness_above_center; module StringHoles() { - for (i = [0:num_strings-1]) translate([string_x(i, x0),0,0]) { + $fn=360; + for (i = [0:$num_strings-1]) translate([string_x(i, x0),0,0]) { ballend_v = [0,x1+10,-3]; hull() { - translate([0,fret_scale_length(0),z1+string_diameters_mm[i]/2]) sphere(d=min(2.6, string_diameters_mm[i]*1.2 + 1), $fn=360); - translate(ballend_v) sphere(d=2.6, $fn=360); + translate([0,fret_scale_length(0),z1+$string_diameters_mm[i]/2]) sphere(d=min(2.6, $string_diameters_mm[i]*1.2 + 1)); + translate(ballend_v) sphere(d=2.6); } hull() { // String ball ends are roughly 3mm by 4mm cylinder(d=4, h=3) // Bass string ball ends are roughly 3mm by 4mm cylinder(d=6, h=4.5) - translate(ballend_v) rotate([0, 90, 0]) cylinder(d=4.5, h=3.5, center=true, $fn=360); - translate([0,x2,-30]) 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); + translate([0,x2,-30]) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true); } } } if (list_has(include_colours, 0)) render() difference(){ + $fn=360; hull() { - translate([0,x0,0]) scale([neck_width_mm(x0)/2, 0.01, target_neck_thickness]) sphere(r=1, $fn=360); - translate([0,x1,0]) scale([neck_width_mm(x1)/2, end_radius, target_neck_thickness*1.0]) sphere(r=1, $fn=360); + 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([-500, x0, z0]) cube([1000, 1000, 1000]); translate([-500, x0-1000, -500]) cube([1000, 1000, 1000]); @@ -1211,37 +1186,13 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) { module MyNeck() { HeadPiece(); - TaperNeck( - string_spacing_bridge=20, - string_spacing_nut=20, - num_strings=num_strings, - string_margin=5, - target_neck_thickness=15, - scallop_depth=scallop_depth, - extra_height=extra_height, - fret_widths=fret_widths, - num_frets=num_frets, - fret_side_marker_x_angle=-23, - fret_side_marker_y_angle=5, - include_colours=include_colours, - ) MyBodySegment(); + TaperNeck(fret_side_marker_x_angle=-23, fret_side_marker_y_angle=5) MyBodySegment(); } module TrussRods(taper_points=segment_cuts, extra=0) { translate([0, 630+270, -4]) rotate([0, 0, 180]) TrussRod(taper_points=taper_points, extra=extra); translate([0, -100, -16]) TrussRodSingleAction(taper_points=taper_points, extra=extra); } - module Dowel() { - h = 27; - rotate([-90, 0, 0]) { - $fn=72; - translate([0, 0, -h/2]) cylinder_beak(d=5.25, h=h); - hull() { - cylinder(d=6, h=0.00001, center=true); - cylinder(d=5.25, h=3, center=true); - } - } - } module Dowels() { translate([-10, segment_cuts[3], 0]) Dowel(); translate([ 10, segment_cuts[3], 0]) Dowel(); @@ -1265,11 +1216,12 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) { belthole_x0 = 130; belthole_x1 = 260; render() for (i = [0:len(arc)-2]) { + $fn = belthole_fn; hull() { - translate([arc[i][0], belthole_x0, arc[i][1]]) sphere(belthole_r, $fn=belthole_fn); - translate([arc[i+1][0], belthole_x0, arc[i+1][1]]) sphere(belthole_r, $fn=belthole_fn); - translate([arc[i][0], belthole_x1, arc[i][1]]) sphere(belthole_r, $fn=belthole_fn); - translate([arc[i+1][0], belthole_x1, arc[i+1][1]]) sphere(belthole_r, $fn=belthole_fn); + 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); } } } diff --git a/CFTubes/common.scad b/CFTubes/common.scad index 3f9541a..d37b8e2 100644 --- a/CFTubes/common.scad +++ b/CFTubes/common.scad @@ -6,6 +6,19 @@ CF_Square_ID = 5.0; // Inner diameter, sadly doesn't fit the tubes cyl_hd_fn = $preview ? 32 : 512; cyl_ld_fn = $preview ? 24 : 72; + +module Dowel() { + h = 27; + rotate([-90, 0, 0]) { + $fn=72; + translate([0, 0, -h/2]) cylinder_beak(d=5.25, h=h); + hull() { + cylinder(d=6, h=0.00001, center=true); + cylinder_outer(d=5.25, h=3, center=true); + } + } +} + module CFTube(hole=true) { // Align +y rotate([0, 0, 90]) render() difference() { rotate([0, 90, 0]) cylinder(h=CF_Tube_Len, d=CF_Tube_OD, $fn=cyl_hd_fn); diff --git a/EllipticalNeck.scad b/EllipticalNeck.scad index 590a889..107c11b 100644 --- a/EllipticalNeck.scad +++ b/EllipticalNeck.scad @@ -1,5 +1,21 @@ // Include after common.scad +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; +function default_neck_width_bridge() = ($num_strings-1)*$string_spacing_bridge + $string_margin*2; + +function neck_width(mm=0, fret=-9999) = lerp($neck_width_bridge, $neck_width_nut, (fret>-9999) ? (2^(-fret/12)) : (mm/fret_scale_length(0))); +function get_fret_width(fret) = $fret_widths[clamp(0, fret, len($fret_widths)-1)]; +function get_fret_height(fret) = sin($fret_angle) * get_fret_width(fret)/2; +function get_max_fret_width() = max($fret_widths); +function get_max_fret_height() = sin($fret_angle) * get_max_fret_width()/2; +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; + +function string_spacing(y) = lerp($string_spacing_bridge, $string_spacing_nut, y/fret_scale_length(0)); +function string_x(i, y) = ($num_strings-i-1)*string_spacing(y) - neck_width(y)/2 + $string_margin; + + module neck(string_spacing=18, string_margin=4.5, num_strings=3, target_neck_thickness=15, target_neck_thickness_additional_points=[], scallop_depth=3, num_frets=24, fret_width=2.4, filler=false, inlays_only=false, side_markers_only=false, fret_layers_only=false, remove_fret_layers=false, engrave_markers=true) { fw2 = fret_width/2; neck_length = fret_scale_length(0)+fw2; @@ -130,50 +146,35 @@ module neck(string_spacing=18, string_margin=4.5, num_strings=3, target_neck_thi } module TaperNeck( - string_spacing_nut = 10.0, - string_spacing_bridge = 11.6, - num_strings = 6, - string_margin = 4.5, - target_neck_thickness = 15, target_neck_thickness_additional_points = [], - scallop_depth = 2, - extra_height = 0, - num_frets = 24, - fret_widths = [], - fret_angle = 60, // 90 is semicircle - max_scallop_angle = 60, // match this to fret_angle for a nice continuous look + 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, - include_colours = [0, 1, 2, 3], // 0: Base neck/fretboard 1: Frets 2: Inlays 3: Side markers + // $include_colours = [0, 1, 2, 3], // 0: Base neck/fretboard 1: Frets 2: Inlays 3: Side markers ){ - neck_length = fret_scale_length(0) + fret_widths[0]/2; - // neck_width = (num_strings-1)*string_spacing_nut + 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(fret) = lerp(neck_width_bridge, neck_width_nut, 2^(-fret/12)); - function neck_width_mm(mm) = lerp(neck_width_bridge, neck_width_nut, mm/fret_scale_length(0)); - function get_fret_width(fret) = fret_widths[clamp(0, fret, num_frets)]; - max_fret_width = max(fret_widths); - max_fret_height = sin(fret_angle) * max_fret_width/2; - z0 = extra_height; // Deepest scallops hit here, => thinnest top of neck - z1 = z0 + scallop_depth; // Frets protrude from here - z2 = z1 + max_fret_height; // Nothing above this => thickest top of neck + neck_length = fret_scale_length(0) + get_fret_width(0)/2; + + $max_fret_width = max($fret_widths); + $max_fret_height = sin($fret_angle) * $max_fret_width/2; + z0 = $extra_thickness_above_center; // Deepest scallops hit here, => thinnest top of neck + z1 = z0 + $scallop_depth; // Frets protrude from here + z2 = z1 + $max_fret_height; // Nothing above this => thickest top of neck module neck_stock() { - angle_excess = asin(z2/target_neck_thickness); + angle_excess = asin(z2/$target_neck_thickness); a0 = 90-angle_excess; a1 = 270+angle_excess; rotate([-90, 0, 0]) if (len(target_neck_thickness_additional_points) < 1) { render() hull() { translate([0,0,neck_length-0.0001]) linear_extrude(0.0001) - polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width_mm(neck_length)*0.5*sin(a), -target_neck_thickness*cos(a)]]); // Ellipse + polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width(neck_length)*0.5*sin(a), -$target_neck_thickness*cos(a)]]); // Ellipse translate([0,0,0]) linear_extrude(0.0001) - polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width_mm(0)*0.5*sin(a), -target_neck_thickness*cos(a)]]); // Ellipse + polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width(0)*0.5*sin(a), -$target_neck_thickness*cos(a)]]); // Ellipse } } else { - pts = flatten([[[neck_length, target_neck_thickness]], target_neck_thickness_additional_points]); + pts = flatten([[[neck_length, $target_neck_thickness]], target_neck_thickness_additional_points]); echo(pts); for (i = [0:len(pts)-2]) { pt0 = pts[i]; @@ -206,14 +207,14 @@ module TaperNeck( r = xdelta / (2*sa); arc = [ for (i = [-fn:fn]) [xmid+xdelta*i/fn2, z1-r*(sqrt(1 - ((sa*i/fn)^2))-ca)] ]; // echo(arc); - rotate([90, 0, 90]) linear_extrude(neck_width_bridge, center=true) polygon(arc); + rotate([90, 0, 90]) linear_extrude($neck_width_bridge, center=true) polygon(arc); } module scallops() { - for (fret = [0:num_frets]) { + for (fret = [0:$num_frets]) { scallop(fret); } } - module fret_bump(fw, a = fret_angle) { + module fret_bump(fw, a = $fret_angle) { // a must be in range (0,90] for correct geometry fn = 50; fn2 = fn * 2; @@ -222,15 +223,15 @@ module TaperNeck( r = fw / (2*sa); arc = [ for (i = [-fn:fn]) [fw*i/fn2, r*(sqrt(1 - ((sa*i/fn)^2))-ca)] ]; // echo("fret_bump", a, ca, arc); - rotate([90, 0, 90]) linear_extrude(neck_width_bridge, center=true) polygon(arc); + rotate([90, 0, 90]) linear_extrude($neck_width_bridge, center=true) polygon(arc); } module fret_bumps() { - for (fret = [0:num_frets]) + for (fret = [0:$num_frets]) translate([0, fret_scale_length(fret), z1]) fret_bump(get_fret_width(fret)); } module intersect_fret_layers() { - for (fret = [0:num_frets]) { + for (fret = [0:$num_frets]) { translate([-500, fret_scale_length(fret)-get_fret_width(fret)/2, -500]) cube([1000, get_fret_width(fret), 1000]); } @@ -241,12 +242,12 @@ module TaperNeck( module fret_inlays() { for (num_text = fret_inlays) { fret = num_text[0]; - if (fret <= num_frets) { + 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_mm(x_mid) * 0.8; + max_width = neck_width(x_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; @@ -261,14 +262,14 @@ module TaperNeck( module fret_side_markers() { for (num_text = fret_inlays) { fret = num_text[0]; - if (fret <= num_frets) { + 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; diff = x0 - x1; mid = lerp(x0, x1, 0.67); fontsize = min(5, diff*0.6); rotate([0, fret_side_marker_y_angle-90, 0]) - translate([0, mid, neck_width_mm(mid)/2-3]) + translate([0, mid, neck_width(mid)/2-3]) linear_extrude(50) rotate(fret_side_marker_x_angle) text(text = str(fret), font = JP_Serif_Font, halign = "right", valign = "center", size = fontsize); @@ -280,11 +281,11 @@ module TaperNeck( render() difference() { neck_stock() children(); scallops(); - scallop(num_frets+1); + scallop($num_frets+1); // Chop off anything above the frets - translate([-neck_width_bridge, 0, z1]) cube([neck_width_bridge*2, $guitar_scale_length_mm*3, target_neck_thickness*3]); + translate([-$neck_width_bridge, 0, z1]) cube([$neck_width_bridge*2, $guitar_scale_length_mm*3, $target_neck_thickness*3]); // Reduce rest of the body to 0 - translate([-neck_width_bridge, 0, 0]) cube([neck_width_bridge*2, (fret_scale_length(num_frets)+fret_scale_length(num_frets+1))/2, target_neck_thickness*3]); + translate([-$neck_width_bridge, 0, 0]) cube([$neck_width_bridge*2, (fret_scale_length($num_frets)+fret_scale_length($num_frets+1))/2, $target_neck_thickness*3]); } intersection() { fret_bumps(); @@ -296,14 +297,14 @@ module TaperNeck( difference() { neck_stock(); scallop(25); - translate([-neck_width_bridge, 0, scallop_depth]) cube([neck_width_bridge*2, $guitar_scale_length_mm*3, target_neck_thickness*3]); - translate([-neck_width_bridge, 0, 0]) cube([neck_width_bridge*2, (fret_scale_length(25)+fret_scale_length(24))/2, target_neck_thickness*3]); + translate([-$neck_width_bridge, 0, scallop_depth]) cube([$neck_width_bridge*2, $guitar_scale_length_mm*3, target_neck_thickness*3]); + 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); + has0 = list_has($include_colours, 0); + has1 = list_has($include_colours, 1); + has2 = list_has($include_colours, 2); + has3 = list_has($include_colours, 3); if (has0) { render() difference() { carved_stock() children(); diff --git a/common.scad b/common.scad index e064a5c..5feb91f 100644 --- a/common.scad +++ b/common.scad @@ -83,15 +83,16 @@ module screw_hole_lobe(ID, OD, lobes=3) { } } -module cylinder_outer(d, h) { +module cylinder_outer(d, h, center=false) { // Regular circle inscribes, this circumscribes fudge = 1/cos(180/$fn); - cylinder(d=d*fudge, h=h); + cylinder(d=d*fudge, h=h, center=center); } module cylinder_beak(d, h, beak=0.75) { // A cylinder with a beak to take seams. This helps improve tolerances as seams often expand a little bit and ruin the fit. - cylinder(d=d, h=h); + // Since we only use it for holes, it will be a cylinder_outer as well + cylinder_outer(d=d, h=h); // beak notch for seams translate([0, d/2-beak*0.25, h/2]) rotate([0,0,45]) cube([beak, beak, h], center=true); }