1 | // Mario Box template for OpenSCAD |
---|
2 | // (C) Copyright 2011, Brian Enigma <brian@netninja.com> |
---|
3 | // [http://netninja.com/fun/mariobox] |
---|
4 | // |
---|
5 | // Licensed under a Creative Commons Attribution, Non-Commercial, Share-Alike license. |
---|
6 | // For the detailed license, see [http://creativecommons.org/licenses/by-nc-sa/3.0/] |
---|
7 | // |
---|
8 | // This file is for feeding into OpenSCAD to produce an STL file |
---|
9 | // for 3D printing. For more information about OpenSCAD, see [http://www.openscad.org/] |
---|
10 | // |
---|
11 | |
---|
12 | pixels = [ |
---|
13 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
---|
14 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, |
---|
15 | 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, |
---|
16 | 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, |
---|
17 | 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, |
---|
18 | 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, |
---|
19 | 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, |
---|
20 | 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, |
---|
21 | 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, |
---|
22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
---|
23 | 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, |
---|
24 | 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, |
---|
25 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, |
---|
26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
---|
27 | ]; |
---|
28 | |
---|
29 | |
---|
30 | pixelCountX = 14; |
---|
31 | pixelCountY = 14; |
---|
32 | |
---|
33 | EDGE_LENGTH = 50; // 5cm cube |
---|
34 | BOTTOM_THICKNESS = (0.4 * 3); // about 3 layers on the bottom |
---|
35 | WALL_THICKNESS = 2; // 2mm wall |
---|
36 | COLUMN_LENGTH = 4; // corner support column |
---|
37 | PIXEL_SPACING_ADJUSTMENT = 2; // Make this bigger to make the pixels smaller, but the space between pixels larger |
---|
38 | |
---|
39 | PIXEL_WIDTH = (EDGE_LENGTH - COLUMN_LENGTH * 2) / (pixelCountX + PIXEL_SPACING_ADJUSTMENT); |
---|
40 | PIXEL_HEIGHT = PIXEL_WIDTH; // (EDGE_LENGTH - BOTTOM_THICKNESS * 2) / (pixelCountY + PIXEL_SPACING_ADJUSTMENT); |
---|
41 | PIXEL_GRID_WIDTH = (EDGE_LENGTH - COLUMN_LENGTH * 2) / pixelCountX; |
---|
42 | PIXEL_GRID_HEIGHT = PIXEL_GRID_WIDTH; // (EDGE_LENGTH - BOTTOM_THICKNESS * 2) / pixelCountY; |
---|
43 | |
---|
44 | difference() |
---|
45 | { |
---|
46 | union() // Box body (sides, bottom, support columns) |
---|
47 | { |
---|
48 | // Bottom |
---|
49 | translate(v = [EDGE_LENGTH / -2, EDGE_LENGTH / -2, 0]) |
---|
50 | cube(size = [EDGE_LENGTH, EDGE_LENGTH, BOTTOM_THICKNESS]); |
---|
51 | // Corner support columns |
---|
52 | for (i = [0 : 90 : 270]) |
---|
53 | rotate(a = i, v = [0, 0, 1]) |
---|
54 | translate(v = [EDGE_LENGTH / 2 - COLUMN_LENGTH, EDGE_LENGTH / 2 - COLUMN_LENGTH, 0]) // center it |
---|
55 | cube(size = [COLUMN_LENGTH, COLUMN_LENGTH, EDGE_LENGTH]); |
---|
56 | // Walls |
---|
57 | for (i = [0 : 90 : 270]) |
---|
58 | rotate(a = i, v = [0, 0, 1]) |
---|
59 | translate(v = [EDGE_LENGTH / 2 - WALL_THICKNESS, EDGE_LENGTH / -2, 0]) |
---|
60 | cube(size = [WALL_THICKNESS, EDGE_LENGTH, EDGE_LENGTH]); |
---|
61 | } |
---|
62 | for (i = [0 : 90 : 270]) // Apply pixel grid to all four sides |
---|
63 | { |
---|
64 | rotate(a = i, v = [0, 0, 1]) // Rotate to side |
---|
65 | { |
---|
66 | translate(v = [PIXEL_GRID_WIDTH * pixelCountX / -2, EDGE_LENGTH / -2 + WALL_THICKNESS + 2, (EDGE_LENGTH - (PIXEL_GRID_HEIGHT * pixelCountY)) / 2]) // Move over, centered on wall |
---|
67 | { |
---|
68 | rotate(a = 90, v = [1, 0, 0]) // Stand it upright |
---|
69 | { |
---|
70 | union() // These are the pixels |
---|
71 | { |
---|
72 | for (posX = [0 : pixelCountX - 1]) |
---|
73 | { |
---|
74 | for (posY = [0 : pixelCountY - 1]) |
---|
75 | { |
---|
76 | if (pixels[((pixelCountY - 1) - posY) * pixelCountX + posX] == 1) |
---|
77 | { |
---|
78 | translate(v = [PIXEL_GRID_WIDTH * posX, PIXEL_GRID_HEIGHT * posY, 2.8]) |
---|
79 | cube(size = [PIXEL_WIDTH, PIXEL_HEIGHT, WALL_THICKNESS * 4]); |
---|
80 | } |
---|
81 | } |
---|
82 | } |
---|
83 | } |
---|
84 | } |
---|
85 | } |
---|
86 | } |
---|
87 | } |
---|
88 | } |
---|