4 return float(it.next())
6 - def __init__(self, len_parser, item_parser):
7 self.len_parser = len_parser
8 self.item_parser = item_parser
9
11 return [self.item_parser(it) for i in range(self.len_parser(it))]
12
14 tp = it.next()
15 if tp == "list":
16 len_parser = make_parser(it)
17 item_parser = make_parser(it)
18 return ListParser(len_parser, item_parser)
19 elif tp in "float double float32 float64".split():
20 return parse_float
21 elif tp in "char uchar short ushort int uint int8 uint8 int16 uint16 int32".split():
22 return parse_int
23 else:
24 raise ValueError("unknown type '%s'" % tp)
25
27 lines = [l.strip().lower() for l in open(name).readlines()]
28
29 assert lines[0] == "ply"
30 assert lines[1].split() == ["format", "ascii", "1.0"]
31
32 i = 2
33
34 data_queue = []
35
36
37 while lines[i] != "end_header":
38 words = lines[i].split()
39 if words[0] == "element":
40 i += 1
41 props = []
42 lsplit = lines[i].split()
43 while lsplit[0] == "property":
44 props.append((lsplit[-1], make_parser(iter(lsplit[1:-1]))))
45 i += 1
46 lsplit = lines[i].split()
47
48 data_queue.append((words[1], int(words[2]), props))
49 elif words[0] in ["comment", "created"]:
50 i += 1
51 else:
52 raise ValueError, "invalid header field"
53 i += 1
54
55 result = {}
56
57 def parse_line(parsers, line):
58 it = iter(line.split())
59 result = []
60 for p in parsers:
61 result.append(p(it))
62 return result
63
64 from pytools import Record
65 class DataBlock(Record):
66 pass
67
68 for name, line_count, props in data_queue:
69 prop_names, parsers = zip(*props)
70 result[name] = DataBlock(
71 properties=prop_names,
72 data=[parse_line(parsers, l) for l in lines[i:i+line_count]])
73
74 i += line_count
75
76 return result
77