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 }