Special Variables refactoring, Pt2

This commit is contained in:
Luke Hubmayer-Werner 2025-02-10 16:15:55 +10:30
parent 24e7ec255c
commit 27f7af976d
4 changed files with 123 additions and 156 deletions

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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();

View File

@ -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);
}