Package meshpy :: Module ply
[hide private]
[frames] | no frames]

Source Code for Module meshpy.ply

1 -def parse_int(it):
2 return int(it.next())
3 -def parse_float(it):
4 return float(it.next())
5 -class ListParser:
6 - def __init__(self, len_parser, item_parser):
7 self.len_parser = len_parser 8 self.item_parser = item_parser
9
10 - def __call__(self, it):
11 return [self.item_parser(it) for i in range(self.len_parser(it))]
12
13 -def make_parser(it):
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
26 -def parse_ply(name):
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 # parse header 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 # skip end_header 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