-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmakesdf.py
131 lines (101 loc) · 3.5 KB
/
makesdf.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python3
import argparse
import atexit
import os
import pathlib
import random
import signal
import shutil
import subprocess
parser = argparse.ArgumentParser(add_help=False,
description='Generate mesh models from SDF using marching cubes.')
parser.add_argument(
"file", help="Python filename (with .py-extension) OR folder (containing main.py file).")
parser.add_argument("-w", "--watch", action="store_true",
help="Generate new mesh when file is changed.")
parser.add_argument("-p", "--preview", action="store_true",
help="Preview mesh in browser.")
parser.add_argument('--help', action='help', default=argparse.SUPPRESS,
help='Show this help message and exit.')
args = parser.parse_args()
def pj(*paths):
return os.path.join(*paths)
def ps(path):
return os.path.normpath(path).split(os.sep)
def mkdir(dir):
pathlib.Path(dir).mkdir(parents=True, exist_ok=True)
CURRENT_FILE = os.path.realpath(__file__)
CURRENT_FOLDER = os.path.dirname(CURRENT_FILE)
ENV = {}
ENV["PYTHON_COMMAND"] = "python"
ENV["USE_DOCKER"] = "false"
try:
for line in open(".env").read().strip().split("\n"):
key, value = line.split("=")
ENV[key.strip()] = value.strip()
except:
pass
# Env vars should override .env-file
env = os.environ.copy()
for key in ENV.keys():
if key in env:
ENV[key] = env[key]
else:
env[key] = ENV[key]
USE_DOCKER = ENV["USE_DOCKER"] == "true"
PYTHON_COMMAND = ENV["PYTHON_COMMAND"]
IS_PYTHON_FILE = args.file[-3:] == ".py"
if IS_PYTHON_FILE:
PATH = args.file[:-3]
FILENAME = ps(PATH)[-1]
PROJECT_NAME = FILENAME
FOLDER = pj(*ps(PATH)[:-1])
MESH_FILE = pj(CURRENT_FOLDER, FOLDER, FILENAME + ".stl")
else:
PATH = args.file
FILENAME = "main"
PROJECT_NAME = ps(PATH)[-1]
FOLDER = PATH
MESH_FILE = pj(CURRENT_FOLDER, FOLDER, PROJECT_NAME + ".stl")
WATCH = args.watch
PREVIEW = args.preview
if PREVIEW and WATCH:
command = "npm run dev"
folder = "mesh-viewer"
preview_process = subprocess.Popen(
command, cwd=folder, env=env, shell=True)
def exit_handler():
if os.name != 'nt':
os.killpg(os.getpgid(preview_process.pid), signal.SIGTERM)
atexit.register(exit_handler)
if WATCH:
folder = FOLDER or None
param = FOLDER if FILENAME == "main" else pj(FOLDER, FILENAME) + ".py"
command = f"nodemon --exec {PYTHON_COMMAND} --watch {FILENAME}.py {CURRENT_FILE} {param}"
subprocess.run(command, cwd=folder, env=env, shell=True)
exit(0)
# Run the mesh generator
if USE_DOCKER:
folder = pj(CURRENT_FOLDER, "sdf")
command = "docker-compose run sdf"
env["FILE"] = FILENAME + ".py"
env["FOLDER"] = FOLDER
subprocess.run(command, cwd=folder, env=env, shell=True)
else:
folder = pj(CURRENT_FOLDER, FOLDER)
command = PYTHON_COMMAND + " " + FILENAME + ".py"
subprocess.run(command, cwd=folder, env=env, shell=True)
# Output files to the previewer
PREVIEW_FOLDER = pj(CURRENT_FOLDER, "mesh-viewer/src/assets")
PREVIEW_INFO_FILE = pj(PREVIEW_FOLDER, "info.txt")
PREVIEW_MESH_FILE = pj(PREVIEW_FOLDER, "mesh.stl")
mkdir(PREVIEW_FOLDER)
shutil.copyfile(MESH_FILE, PREVIEW_MESH_FILE)
with open(PREVIEW_INFO_FILE, "w") as f:
id = random.randint(1000, 9999)
f.write(f"stl {id} {PROJECT_NAME}")
if PREVIEW and not WATCH:
command = "npm run dev"
folder = "mesh-viewer"
output = subprocess.Popen(command, cwd=folder, env=env, shell=True)
output.communicate()