// -*- C -*- token_dia = 21; spot_dia = 4.5; spot_gap = spot_dia / 3.0; thick = 1.5; multicolour_gap = 0.15; // each side initial_layer_thick = 0.400; initial_layer_width = 0.750; final_layer_thick = 0.250; multicolour_post = 4; $nspots = 3; $spots_absent = false; $spots_plusgap = false; $fs=0.1; $fa=1; module Spots_Extrude_Lower(){ d = $spots_plusgap ? 1 : 0; translate([0,0,-d]) linear_extrude(height= initial_layer_thick + d) children(0); } module Spots_Extrude_Upper(){ d = $spots_plusgap ? 1 : 0; translate([0,0, thick + d]) mirror([0,0, 1]) linear_extrude(height= final_layer_thick + d) children(0); } module SpotAt(condition, xy) { if (condition == !$spots_absent) { translate(xy * (spot_gap + spot_dia) * sqrt(0.5)) circle(r= spot_dia/2 + ($spots_plusgap ? multicolour_gap : 0)); } } module Token_Spots(){ SpotAt(($nspots % 2) > 0, [0,0]); SpotAt($nspots >= 2, [ 1, 1]); SpotAt($nspots >= 2, [-1,-1]); SpotAt($nspots >= 4, [ 1,-1]); SpotAt($nspots >= 4, [-1, 1]); } module Token_Spots_All(){ $nspots = 5; Token_Spots(); } module Token_L1(){ Spots_Extrude_Lower() Token_Spots(); } module Token_L2(){ $spots_absent = true; Spots_Extrude_Lower() Token_Spots(); } module Token_L3(){ $spots_plusgap = true; difference(){ linear_extrude(height=thick) circle(r=token_dia/2); Spots_Extrude_Lower() Token_Spots_All(); Spots_Extrude_Upper() Token_Spots_All(); } } module Token_L4(){ $spots_absent = true; Spots_Extrude_Upper() Token_Spots(); } module Token_L5(){ Spots_Extrude_Upper() Token_Spots(); } module Demo(){ ////toplevel color("red") { Token_L3(); } color("white") { Token_L1(); Token_L5(); } color("black") { Token_L2(); Token_L4(); } } module Frame(phase) { zs = [ initial_layer_thick, initial_layer_thick, thick, thick, thick ]; base_sz = token_dia * [ 6, 1.5 ]; sz = base_sz + phase * initial_layer_width * 2 * [1,1]; linear_extrude(height= initial_layer_thick) { difference(){ square(center=true, sz + initial_layer_width * 2 * [1,1]); square(center=true, sz); } } // Priming tower translate([-base_sz[0]/2, (3-phase)*(multicolour_post + multicolour_gap)]) linear_extrude(height= zs[phase-1]) square(multicolour_post); } module Tests(){ for ($nspots = [1,2,3,4]) { translate(($nspots - 2) * (token_dia + 3) * [1,0]) children(); } } module Test_L1(){ ////toplevel Frame(1); Tests() Token_L1(); } module Test_L2(){ ////toplevel Frame(2); Tests() Token_L2(); } module Test_L3(){ ////toplevel Frame(3); Tests() Token_L3(); } module Test_L4(){ ////toplevel Frame(4); Tests() Token_L4(); } module Test_L5(){ ////toplevel Frame(5); Tests() Token_L5(); } //Demo();