-
Notifications
You must be signed in to change notification settings - Fork 0
/
labyrinth_map.py
75 lines (65 loc) · 2.45 KB
/
labyrinth_map.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import numpy as np
from solid import *
from subprocess import run
from labyrinth_cube import LabyrinthCube
class LabyrinthMap:
def __init__(self, lcube: LabyrinthCube):
self.lcube: LabyrinthCube = lcube
self.spacing = 10
@property
def dim_2d_size(self):
gridSize = self.lcube.levels[0].gridSize
dim_2d_size = int(np.ceil(np.sqrt(gridSize)))
return dim_2d_size
@property
def step_2d(self):
levelSizeXY = self.lcube.levels[0].levelSizeXY
step_2d = levelSizeXY + self.spacing
return step_2d
@property
def overall_width(self):
overall_width = self.dim_2d_size*self.step_2d-self.spacing
return overall_width
def get_solid_layout(self) -> OpenSCADObject:
solid_levels = list(reversed([level.getSolidLevel() for level in self.lcube.levels]))
layout = union()
for i in range(self.dim_2d_size):
for j in range(self.dim_2d_size):
index = i + j * self.dim_2d_size
layout.add(
translate(i * np.array([self.step_2d, 0]) - j * np.array([0, self.step_2d]) + [0,(self.dim_2d_size-1)*self.step_2d])(
solid_levels[index] if index<len(solid_levels) else union()
)
)
return layout
def render_png(self, path):
layout = self.get_solid_layout()
map_png_path = os.path.join(path, "map.png")
map_scad_path = os.path.join(path, "map.scad")
scad_render_to_file(layout, map_scad_path)
width = 2000
height = 2000
xy_center = np.ones(2)*(self.overall_width/2)
cam_z = self.overall_width*2.6
ex, ey, ez = np.array([*xy_center, cam_z], dtype=np.int)
cx, cy, cz = np.array([*xy_center, 0], dtype=np.int)
print(f"--camera=eye_{ex},{ey},{ez},center_{cx},{cy},{cz}",)
run(
[
"openscad",
"-o",
map_png_path,
"--render",
#"--autocenter",
#"--viewall",
f"--imgsize={width},{height}",
f"--camera={ex},{ey},{ez},{cx},{cy},{cz}",
"--projection=orthogonal",
#"--colorscheme=BeforeDawn",
"--colorscheme=Nature",
#"--colorscheme=DeepOcean",
#"--colorscheme=Tomorrow",
map_scad_path,
]
)