-
Notifications
You must be signed in to change notification settings - Fork 0
/
netlib_solid.py
78 lines (66 loc) · 2.33 KB
/
netlib_solid.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
import sys
import json
def section(file, section_name):
section_found = False
last_line = ''
for line in file:
line = line.strip()
if not section_found:
if line == ':' + section_name:
section_found = True
else:
if line[0] == ':':
return
yield line
if not section_found:
raise IOError("Section " + section_name + " not found")
def read_netlib_solid(netlib_file):
name = next(section(netlib_file, 'name'))
number = next(section(netlib_file, 'number'))
solid_section = section(netlib_file, 'solid')
face_count, largest_face = list(map(int, next(solid_section).split(' ')))
faces = [0]*face_count
for i, line in enumerate(solid_section):
faces[i] = list(map(int, line.split(' ')[1:]))
vertices_section = section(netlib_file, 'vertices')
total_vertices, net_vertices = list(map(int, next(vertices_section).split(' ')))
solid_vertices = total_vertices - net_vertices
vertices = [0] * solid_vertices
for i, line in enumerate(vertices_section):
if i < net_vertices:
continue
vertices[i - net_vertices] = list(map(float, line.split(' ')))
for face in faces:
for i, val in enumerate(face):
face[i] -= net_vertices
return {'name': name, 'number': number, 'faces': faces, 'vertices': vertices}
def write_netlib_solid(solid, filename):
name = solid['name']
number = solid['number']
f = open(filename, 'w')
f.write(':name\n')
f.write(name + '\n')
f.write(':number\n')
f.write(str(number) + '\n')
f.write(':solid\n')
num_faces = len(solid['faces'])
max_face = max(list(map(len, solid['faces'])))
f.write(str(num_faces) + ' ' + str(max_face) + '\n')
for face in solid['faces']:
f.write(str(len(face)) + ' ')
f.write(' '.join(map(str, face)))
f.write('\n')
f.write(':dummy\n')
f.write(':vertices\n')
f.write(str(len(solid['vertices'])) + ' 0\n')
for vertex in solid['vertices']:
f.write(' '.join(map(str, vertex)))
f.write('\n')
f.write(':EOF\n')
f.close()
if __name__ == "__main__":
solid = read_netlib_solid(sys.stdin)
je = json.JSONEncoder()
for chunk in je.iterencode(solid):
sys.stdout.write(chunk)
sys.stdout.write('\n')