/ examples / maze / maze3d.scad
maze3d.scad
 1  use <maze/mz_cube.scad>
 2  use <maze/mz_cube_get.scad>
 3  use <util/contains.scad>
 4  use <crystal_ball.scad>
 5  
 6  layers = 4;
 7  rows = 4;
 8  columns = 4;
 9  cell_width = 15;
10  road_width = 9;
11  $fn = 4;  // [4, 8, 12]
12  
13  maze3d();
14  
15  module maze3d() {
16      cells = mz_cube(layers, rows, columns);
17      draw_3dmaze(cells, cell_width, road_width);
18  }
19  
20  module draw_3dmaze(cells, cell_width, road_width) {
21      layers = len(cells);
22      rows = len(cells[0]);
23      columns = len(cells[0][0]);
24  
25      for(z = [0:layers - 1], y = [0:rows - 1], x = [0:columns - 1]) {
26          cell = cells[z][y][x];
27          type = mz_cube_get(cell, "t");
28          
29          if(type != "MASK") {
30              channels = [
31                  z_road(type) ,
32                  z != 0 && z_road(mz_cube_get(cells[z - 1][y][x], "t")),
33                  y_road(type),
34                  x_road(type),
35                  y != 0 && y_road(mz_cube_get(cells[z][y - 1][x], "t")),
36                  x != 0 && x_road(mz_cube_get(cells[z][y][x - 1], "t"))
37              ];
38              
39              translate([x, y, z] * cell_width)
40                  drawCell(cell_width, road_width, channels);
41          }
42      }
43  
44      function z_road(type) = !contains(["Z_WALL", "Z_Y_WALL", "Z_X_WALL", "Z_Y_X_WALL", "MASK"], type);
45  
46      function y_road(type) = !contains(["Y_WALL", "Y_X_WALL", "Z_Y_WALL", "Z_Y_X_WALL", "MASK"], type);
47  
48      function x_road(type) = !contains(["X_WALL", "Y_X_WALL", "Z_X_WALL", "Z_Y_X_WALL", "MASK"], type);
49  
50      module drawCell(cell_width, road_width, channels) {
51          half_cw = cell_width / 2;
52          half_rw = road_width / 2;
53  
54          crystal_ball(half_rw);
55  
56          rots = [
57              [0, 0, 0],
58              [180, 0, 0],
59              [-90, 0, 0],
60              [0, 90, 0],
61              [90, 0, 0],
62              [0, -90, 0]
63          ];
64          
65         for(i = [0:5]) {
66              if(channels[i]) {
67                  rotate(rots[i])
68                  linear_extrude(half_cw)
69                      circle(half_rw);
70              }
71          }
72      }
73  }