diff --git a/io_mesh_ply/__init__.py b/io_mesh_ply/__init__.py index 1a69c346451b46c6cd2e59f6c808a09c5110fa61..a3f08ebd61db3fa94a26d773777e826a811e39df 100644 --- a/io_mesh_ply/__init__.py +++ b/io_mesh_ply/__init__.py @@ -20,8 +20,8 @@ bl_info = { "name": "Stanford PLY format", - "author": "Bruce Merry, Campbell Barton", - "version": (2, 0, 0), + "author": "Bruce Merry, Campbell Barton", "Bastien Montagne" + "version": (2, 1, 0), "blender": (2, 90, 0), "location": "File > Import/Export", "description": "Import-Export PLY mesh data with UVs and vertex colors", diff --git a/io_mesh_ply/import_ply.py b/io_mesh_ply/import_ply.py index c118aa3c2c2729254d244a8370993b08b3abac71..d9d12d675d23a7226a51877074c4f3177e518be5 100644 --- a/io_mesh_ply/import_ply.py +++ b/io_mesh_ply/import_ply.py @@ -152,14 +152,45 @@ def read(filepath): invalid_ply = (None, None, None) with open(filepath, 'rb') as plyf: - signature = plyf.readline() + signature = plyf.peek(5) - if not signature.startswith(b'ply'): + if not signature.startswith(b'ply') or not len(signature) >= 5: print("Signature line was invalid") return invalid_ply + custom_line_sep = None + if signature[3] != ord(b'\n'): + if signature[3] != ord(b'\r'): + print("Unknown line separator") + return invalid_ply + if signature[4] == ord(b'\n'): + custom_line_sep = b"\r\n" + else: + custom_line_sep = b"\r" + + # Work around binary file reading only accepting "\n" as line separator. + plyf_header_line_iterator = lambda plyf: plyf + if custom_line_sep is not None: + def _plyf_header_line_iterator(plyf): + buff = plyf.peek(2**16) + while len(buff) != 0: + read_bytes = 0 + buff = buff.split(custom_line_sep) + for line in buff[:-1]: + read_bytes += len(line) + len(custom_line_sep) + if line.startswith(b'end_header'): + # Since reader code might (will) break iteration at this point, + # we have to ensure file is read up to here, yield, amd return... + plyf.read(read_bytes) + yield line + return + yield line + plyf.read(read_bytes) + buff = buff[-1] + plyf.peek(2**16) + plyf_header_line_iterator = _plyf_header_line_iterator + valid_header = False - for line in plyf: + for line in plyf_header_line_iterator(plyf): tokens = re.split(br'[ \r\n]+', line) if len(tokens) == 0: