This repository has been archived by the owner on Dec 4, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsvg2obj.py
executable file
·114 lines (80 loc) · 2.39 KB
/
svg2obj.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
#!/usr/bin/env python3
# pylint: disable=logging-too-many-args
import os
import sys
import shutil
import logging
import argparse
from tempfile import NamedTemporaryFile
from common import color_log
from geo import svg2paths
LOG = logging.getLogger("svg2obj")
def svg2obj(out, svg_file):
"""
Write paths in OBJ format.
out: Stream object to write to.
Use millimeters for output unit.
"""
paths = svg2paths(svg_file)
write_obj(out, paths)
def write_obj(out, paths):
"""
Vertex numbers start from 1.
"""
vertex_list = []
face_list = []
for path in paths:
face = []
for vertex in path:
vertex_list.append(vertex)
v = len(vertex_list)
face.append(v)
face_list.append(face)
out.write("g\n")
for vertex in vertex_list:
out.write("v %f %f 0\n" % (vertex[0], vertex[1]))
for face in face_list:
out.write("f %s\n" % " ".join(["%d" % v for v in face]))
LOG.info("Wrote %d vertices and %d faces.",
len(vertex_list), len(face_list))
def main():
log_geo = logging.getLogger("geo")
for log in LOG, log_geo:
log.addHandler(logging.StreamHandler())
color_log(log)
parser = argparse.ArgumentParser(
description="Convert paths in an SVG file to polygons in OBJ format.")
parser.add_argument(
"--verbose", "-v",
action="count", default=0,
help="Print verbose information for debugging.")
parser.add_argument(
"--quiet", "-q",
action="count", default=0,
help="Suppress warnings.")
parser.add_argument(
"svg",
metavar="SVG",
help="Path to SVG file.")
parser.add_argument(
"obj",
metavar="OBJ",
nargs="?",
help="Path to OBJ file.")
args = parser.parse_args()
level = (logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG)[
max(0, min(3, 1 + args.verbose - args.quiet))]
for log in LOG, log_geo:
log.setLevel(level)
if args.obj:
out = NamedTemporaryFile("w", encoding="utf=8", delete=False)
os.fchmod(out.fileno(), os.stat(args.svg).st_mode)
else:
out = sys.stdout
with open(args.svg, "r", encoding="utf-8") as svg:
svg2obj(out, svg)
if args.obj:
out.close()
shutil.move(out.name, args.obj)
if __name__ == "__main__":
main()