use ; use ; use ; use ; module tank() { translate([31.25, -48.5, 0]) import("AA_Stuart.stl"); } module transport() { translate([-35.5, -17.5, -0.4]) import("AA_Hunt.stl"); } module carrier() { scale([0.7971014492753623, 0.7971014492753623, 0.7971014492753623]) translate([-8, -7, 0]) import("AA_Midway.stl"); } module battleship() { scale([1.153846153846154, 1, 1]) translate([-43.5, -116, 0]) import("AA_Des_Moines.stl"); } $fn=50; // general global values ep = 0.01; wall = 2; side = 145; innerSide = side - 2*wall; //font = "Source Code Pro"; font = "Impact"; // Toggles inclTray = true; inclBase = true; inclSoldier = true; inclTank = true; inclFighter = true; inclSub = true; inclBomber = true; inclCarrier = true; inclBttlship = true; inclToken = true; inclLid = false; inclLidBase = false; inclPieces = false; // tray section dimensions [x, y, z] soldierDims = [88, 43, 10]; tankDims = [innerSide - soldierDims[0], 60, 10]; fighterDims = [innerSide - soldierDims[0], 66, 10]; subTprtDims = [innerSide, 19, 10]; bomberDims = [44 + 2 * wall, 36, 10]; carrierDims = [innerSide - fighterDims[0], 14 + 2*wall, 10]; bttlshipDims = [ innerSide - fighterDims[0], // x innerSide - soldierDims[1] - bomberDims[1] - carrierDims[1] - subTprtDims[1] + (wall / 2), // y 10]; // z tokenDims = [innerSide - fighterDims[0] - bomberDims[0], bomberDims[1], 10]; module base() { cube([side, side, wall + ep]); } module soldiers() { difference() { color("SlateGrey") cube([soldierDims[0] + ep, soldierDims[1] + ep, soldierDims[2]]); for (i = [0:4]) { translate([9 + 15.5*i, 9, -ep]) color("Teal") cylinder(d=14.5, h=12 + ep); translate([16.5 + 15.5*i, 9 + 13, -ep]) color("Teal") cylinder(d=14.5, h=12 + ep); translate([9 + 15.5*i, 9 + 2 * 13, -ep]) color("Teal") cylinder(d=14.5, h=12 + ep); } } if (inclPieces) { for (i = [0:4]) { color("DarkGreen") translate([9 + 15.5 * i, 9, 0]) soldier(); color("DarkGreen") translate([16.5 + 15.5*i, 9 + 14, 0]) soldier(); color("DarkGreen") translate([9 + 15.5*i, 9 + 2 * 14, 0]) soldier(); } } } module tanks() { rotate([0, 0, 180]) union() { translate([wall + 32, 57.5, 10 - ep]) rotate([0, 0, 180]) linear_extrude(2 + ep) text(text = "ARMOR", font = font, size = 8); difference() { color("MediumSeaGreen") cube([tankDims[0] + ep, tankDims[1] + ep, tankDims[2]]); for (i = [0:8]) { translate([7 + 17 * floor(i/3), wall + 14.5 * (i % 3), -0.25]) rotate([0, -45, 0]) cube([22, 12, 10]); } translate([41, wall + 14.5 * 3, -0.25]) rotate([0, -45, 0]) cube([22, 12, 10]); } if (inclPieces) { for (i = [0:8]) { translate( [7 + wall + 17 * floor(i / 3), 10.5 + wall + 14.5 * (i % 3), 1]) rotate([45, 0, -90]) translate([0, -2, 0]) tank(); } translate([41 + wall, 10.5 + wall + 14.5 * 3, 1]) rotate([45, 0, -90]) translate([0, -2, 0]) tank(); } } } module fighters() { union() { translate([wall + 49, wall + 12, 10 - ep]) rotate([0, 0, 90]) linear_extrude(2 + ep) text(text = "FIGHTERS", font = font, size = 8); difference() { color("Khaki") cube([fighterDims[0] + ep, fighterDims[1] + ep, fighterDims[2]]); for (i = [0:9]) { translate([wall + (i%5) * 8, 32 * floor(i/5) + wall, -ep]) cube([6, 30, 10 + 2*ep]); } } if (inclPieces) { for (i = [0:9]) { translate([wall + 5 + (i%5) * 8, 32 * floor(i/5) + 17, 7]) rotate([-90, 0, 90]) fighterZero(); } } } } module subsAndTransports() { union() { if (inclFighter) { translate([139, -wall - 4, 10 - ep]) rotate([0, 0, 90]) linear_extrude(2 + ep) text(text = "SUBS", font = font, size = 8); } if (inclCarrier) { translate([wall, 18, 10 - ep]) rotate([0, 0, -90]) linear_extrude(2 + ep) text(text = "TPRT", font = font, size = 8); } difference() { color("RoyalBlue") cube([subTprtDims[0], subTprtDims[1], subTprtDims[2]]); for (i = [0:5]) { translate([wall + 44 + 18 * i, wall + 4, 0]) rotate([0, -60, 0]) cylinder(r=4, h=30); translate([wall + 36 + 18 * i, wall + 12, 0]) rotate([0, -60, 0]) cylinder(r=4, h=30); } } if (inclPieces) { for (i = [0:2]) { translate([wall + 18 + 18 * i, wall + 3.5, 12.5]) rotate([0, 30, 0]) translate([-14, 0, 0]) transport(); translate([wall + 10 + 18 * i, wall + 10.5, 12.5]) rotate([0, 30, 0]) translate([-14, 0, 0]) transport(); } for (i = [3:5]) { translate([wall + 20 + 18 * i, wall + 2.5, 12.5]) rotate([90, 60, 180]) sub(); translate([wall + 16 + 18 * i, wall + 10.5, 12.5]) rotate([90, 60, 180]) sub(); } } } } module bombers() { union() { translate([wall, wall, 10 - ep]) linear_extrude(2 + ep) text(text = "BOMBERS", font = font, size = 8); difference() { color("DarkSlateBlue") cube([bomberDims[0] + ep, bomberDims[1] + ep, bomberDims[2]]); for (i = [0:2]) { translate([wall, 10 + wall + i * 8, -ep]) cube([44, 6, 10 + 2*ep]); } } if (inclPieces) { for (i = [0:2]) { translate([24, 13 + i * 8, 8.5]) rotate([-90, 0, 0]) b17Bomber(); } } } } module carriers() { union() { translate([wall, 17, 10 - ep]) rotate([0,0,-90]) linear_extrude(2 + ep) text(text = "A.C." ,font = font, size = 8); difference() { color("LightCoral") union() { cube([carrierDims[0] + ep, carrierDims[1] + ep, carrierDims[2]]); translate([40, 0, -18]) rotate([0, -30, 0]) cube([55, 15 + 2*wall + ep, 20]); translate([10, 0, -18]) rotate([0, -30, 0]) cube([55, 15 + 2*wall + ep, 20]); } translate([40, wall, -1]) rotate([0, -30, 0]) cube([55, 14, 6]); translate([10, wall, -1]) rotate([0, -30, 0]) cube([55, 14, 6]); translate([0, -ep, 20]) cube([carrierDims[0], carrierDims[1] + wall, carrierDims[2]]); } if (inclPieces) { translate([51, 3, 25]) rotate([-30, 0, 90]) translate([0, 0, 0]) carrier(); translate([82, 3, 25]) rotate([-30, 0, 90]) translate([0, 0, 0]) carrier(); } } } module battleships() { union() { translate([bttlshipDims[0] - 8 - wall, 26, 10 - ep]) rotate([0,0,-90]) linear_extrude(2 + ep) text(text = "BSHP" ,font = font, size = 8); difference() { color("BurlyWood") union() { cube([bttlshipDims[0] + ep, bttlshipDims[1] + ep, bttlshipDims[2]]); for (i = [0:2]) { translate([37 - 29 * (i%2), 6 * i + 1, -18]) rotate([0, -30, 0]) cube([55, 8 + 2*wall, 20]); } translate([8, wall/2, -18]) rotate([0, -30, 0]) cube([55, 16 + 4*wall, 20]); } for (i = [0:2]) { translate([37 - 29 * (i%2), 6 * i + wall + 1, -1]) rotate([0, -30, 0]) cube([55, 8, 12]); } translate([0, 0, 20]) cube([bttlshipDims[0], bttlshipDims[1], 10]); translate([-10 + ep, 0, -5]) cube([10, bttlshipDims[1], 10]); translate([bttlshipDims[0] - 12, 0, 10]) cube([16, bttlshipDims[1], 20]); } if (inclPieces) { for (i = [0:2]) { translate([9 + (1 - (i%2))*30, 10.5 + i * 6.15, 0]) rotate([30, 0, -90]) battleship(); } } } } module tokens() { difference() { color("DarkSeaGreen") cube([tokenDims[0] + ep, tokenDims[1] + ep, tokenDims[2]]); translate([wall, wall, 10]) rotate([0, 30, 0]) cube([tokenDims[0] / 1.5, tokenDims[1] - 2 * wall, 20]); translate([tokenDims[0] - 16 - wall, wall, -ep]) cube([16, tokenDims[1] - 2 * wall, 20]); } } module allPieceTrays() { difference() { union() { if (inclSoldier) soldiers(); if (inclTank) translate([soldierDims[0] + tankDims[0], tankDims[1] + ep, 0]) tanks(); if (inclFighter) translate([soldierDims[0] - ep, tankDims[1] - wall, 0]) fighters(); if (inclSub) translate([0, innerSide - subTprtDims[1], 0]) subsAndTransports(); if (inclBomber) translate([soldierDims[0] - bomberDims[0], soldierDims[1], 0]) bombers(); if (inclCarrier) translate([0, soldierDims[1] + bomberDims[1], 0]) carriers(); if (inclBttlship) translate([0, soldierDims[1] + bomberDims[1] + carrierDims[1], 0]) battleships(); if (inclToken) translate([0, soldierDims[1], 0]) tokens(); } // cut away anything below the tray bottoms translate([0, 0, -30]) cube([side, side, 30]); } } module tray() { difference() { union() { if (inclBase) base(); translate([wall, wall, wall]) allPieceTrays(); } // index cut for the lid translate([0, side - 7.07, -10]) rotate([0, 0, 45]) cube([10, 10, 50]); } } module lidBase() { cube([side + 2, side + 2, wall + ep]); //cube([side + 2*wall + 2, wall } module lid() { color("LightSteelBlue") translate([-1, -1, 36]) union() { lidBase(); } } if (inclTray) tray(); if (inclLid) lid();