diff --git a/laserchicken/read_ply.py b/laserchicken/read_ply.py index 2f4bd53..8d2af01 100644 --- a/laserchicken/read_ply.py +++ b/laserchicken/read_ply.py @@ -1,9 +1,11 @@ import os +import json +import ast import numpy as np -def read(path): +def read(path, verbose=False): if not os.path.exists(path): raise IOError('File not found: {}'.format(path)) @@ -18,34 +20,67 @@ def read(path): index = read_header(ply) result = {block['type']: read_block(block, ply) for block in index} + if verbose: + print('Header:') + print('-'*10) + for i, header_field in enumerate(index): + print(header_field) + print(index[i]) + print + print('\nData:') + print('-'*10) + for data_field in result: + print(data_field) + print(result['%s' % data_field]) + + print('***************************') + print(result) + return result def read_header(ply): index = [] + comments = [] line = ply.readline() while line.strip() != 'end_header': - if line[:8] == 'element ': + if line.startswith('element'): element_type = line.split()[1] number_of_elements = int(line.split()[2]) current_properties = [] index.append( {'type': element_type, 'number_of_elements': number_of_elements, 'properties': current_properties}) - if line[:9] == 'property ': + if line.startswith('property'): property_type, property_name = line[9:].strip('\n').split(' ') current_properties.append({'type': property_type, 'name': property_name}) + + if line.startswith('comment'): + comment_line = line.strip('\n').split(' ', 1)[1] + comments.append(comment_line) + line = ply.readline() + + if len(comments) > 0: + for i, comment_line in enumerate(comments): + comments[i] = ast.literal_eval(comment_line) + + index.append({'type': 'log', 'log': comments}) + return index def read_block(block, ply_body): - properties, property_names = get_properties(block) - block_type = block['type'] - number_of_elements = block['number_of_elements'] + if block['type'] == 'log': + return block['log'] + else: + properties, property_names = get_properties(block) + block_type = block['type'] + number_of_elements = block['number_of_elements'] + + read_elements(ply_body, properties, property_names, block_type, number_of_elements) - read_elements(ply_body, properties, property_names, block_type, number_of_elements) - return properties + return properties def cast(value, value_type): diff --git a/laserchicken/testdata/example.ply b/laserchicken/testdata/example.ply index 3c8ac90..5033a0a 100644 --- a/laserchicken/testdata/example.ply +++ b/laserchicken/testdata/example.ply @@ -1,7 +1,7 @@ ply format ascii 1.0 -comment log0000 Processed by module load -comment log0001 Processed by module filter using parameters(x,y,z) +comment {'time': '2018-01-18 16:01', 'module': 'load', 'parameters': [], 'version': '0.9.2'} +comment {'time': '2018-01-18 16:01', 'module': 'filter', 'parameters': [('z', 'gt', '1.5')], 'version': '0.9.2'} element vertex 3 property float x property float y