1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 22:28:16 +01:00
dotSCAD/examples/tiles/magic_apartment.scad
2021-02-05 12:04:07 +08:00

180 lines
4.7 KiB
OpenSCAD

use <rounded_square.scad>;
use <util/choose.scad>;
use <util/rand.scad>;
width = 25;
rows = 1;
columns = 3;
floors = 2;
up_down_rand = true;
people = true;
magic_apartment(width, rows, columns, floors, up_down_rand, people);
module magic_apartment(width, rows, columns, floors, up_down_rand, people) {
// based on wang tiles, 3D version
edges = [
for(z = [0:floors])
[
for(y = [0:rows])
[
for(x = [0:columns])
let(rs = rands(0, 1, 3))
[round(rs[0]), round(rs[1]), round(rs[2])]
]
]
];
translate([0, 0, width / 4 + width / 30])
scale([1, 1, 0.5])
for(z = [0:floors - 1]) {
for(y = [0:rows - 1]) {
for(x = [0:columns - 1]) {
translate([x * width, y * width, z * width])
tile(width, [
edges[z][y][x][0], edges[z][y][x + 1][1], edges[z][y + 1][x][0], edges[z][y][x][1],
edges[z + 1][y][x][0], edges[z + 1][y][x + 1][1], edges[z + 1][y + 1][x][0], edges[z + 1][y][x][1],
], up_down_rand);
}
}
}
// base
linear_extrude(width / 30)
square([width * columns, width * rows]);
// walls
translate([0, width * rows])
difference() {
linear_extrude(width * floors / 2 + width / 15)
square([width * columns, width / 30]);
for(f = [1:2:floors * 4 - 1]) {
for(c = [1:2:columns * 4 - 1]) {
if(choose([true, false])) {
translate([width / 4 * c, 0, width / 8 * f])
cube([rand(width / 15, width / 15 * 2) , width / 15, rand(width / 15, width / 15 * 3)], center = true);
}
}
}
}
translate([-width / 30, 0])
difference() {
linear_extrude(width * floors / 2 + width / 15)
square([width / 30, width * rows + width / 30]);
for(f = [1:2:floors * 4 - 1]) {
for(r = [1:2:rows * 4 - 1]) {
if(choose([true, false])) {
translate([0, width / 4 * r, width / 8 * f])
cube([width / 15, rand(width / 15, width / 15 * 2), rand(width / 15, width / 15 * 3)], center = true);
}
}
}
}
// tiles, just quick and dirty
module tile(width, edges, up_down_rand) {
// Webdings
symbols = ["", "", "", "", "", "", ""];
half_w = width / 2;
one_third_w = width / 3;
one_sixth_w = width / 6;
t = one_third_w / 5;
double_t = t * 2;
half_t = t / 2;
module stairs() {
w = one_third_w / 2;
// down stairs
for(i = [0:3]) {
if(edges[i] == 1) {
rotate(90 * i) {
translate([-w / 2, 0, 0]) {
hull() {
translate([0, -one_sixth_w - half_t, 0])
cube([w * 0.75, t, t], center = true);
translate([0, -half_w + t, -half_w])
cube([w * 0.75, t, t], center = true);
}
if(up_down_rand && choose([true, false])) {
for(j = [0:6]) {
translate([0, -one_sixth_w - half_t * j, -t * (j + 1)])
cube([w * 0.75, t, t], center = true);
}
} else {
for(j = [0:6]) {
translate([0, -one_sixth_w - t - half_t * j, -t * j])
cube([w * 0.75, t, t], center = true);
}
}
}
translate([0, -half_w + t, -half_w])
cube([w * 1.5 + one_sixth_w / 4, t * 2, double_t], center = true);
}
}
else if(edges[i + 4] == 0) {
rotate(90 * i)
hull() {
translate([0, -one_sixth_w, 0])
cube([w, t, double_t], center = true);
translate([0, -half_w + half_t , 0])
cube([w, t, double_t], center = true);
}
}
}
// up stairs
for(i = [4:7]) {
if(edges[i] == 1) {
rotate(90 * i) {
translate([w / 2, 0, 0]) {
hull() {
translate([0, -one_sixth_w - half_t, 0])
cube([w * 0.75, t, t], center = true);
translate([0, -half_w + t, half_w])
cube([w * 0.75, t, t], center = true);
}
if(up_down_rand && choose([true, false])) {
for(j = [0:6]) {
translate([0, -one_sixth_w - half_t * (j + 2), t * (j + 1) - t])
cube([w * 0.75, t, t], center = true);
}
}
else {
for(j = [0:6]) {
translate([0, -one_sixth_w - half_t * (j + 1), t * (j + 1) + t])
cube([w * 0.75, t, t], center = true);
}
}
}
translate([0, -half_w + t, half_w])
cube([w * 1.5 + one_sixth_w / 4, t * 2, double_t], center = true);
}
}
}
}
translate([half_w, half_w]) {
stairs();
linear_extrude(t * 3, center = true)
rounded_square(size = [one_third_w + double_t, one_third_w + double_t, t], corner_r = 2, center = true, $fn = 24);
if(people) {
// people
mirror([0, 0, up_down_rand && choose([true, false]) ? 1 : 0])
translate([0, 0, t * 1.5])
rotate([90, 0, rand(0, 359)])
linear_extrude(half_t)
scale([1, 2])
text(font = "Webdings", choose(symbols), size = width / 5.5, halign = "center");
}
}
}
}