320 lines
9.4 KiB
OpenSCAD
320 lines
9.4 KiB
OpenSCAD
|
use <fighter-japan-mitsubishi-zero.scad>;
|
||
|
use <soldier.scad>;
|
||
|
use <sub.scad>;
|
||
|
use <b17-bomber.scad>;
|
||
|
|
||
|
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();
|