Source code for omf_io.surface.importers

import struct
from pathlib import Path

[docs] def import_surface_from_obj(input_file: Path): """Import a triangulated surface from an OBJ file. .. todo:: Implement the import_surface_from_obj function Args: input_file (Path): The input OBJ file path. Returns: dict: A dictionary with 'vertices' and 'faces'. """ vertices = [] faces = [] with open(input_file, 'r') as f: for line in f: parts = line.strip().split() if not parts: continue if parts[0] == 'v': # Vertex vertices.append(tuple(map(float, parts[1:4]))) elif parts[0] == 'f': # Face faces.append(tuple(int(idx) - 1 for idx in parts[1:4])) # Convert to 0-based indexing return {'vertices': vertices, 'faces': faces}
[docs] def import_surface_from_ply_ascii(input_file: Path): """Import a triangulated surface from an ASCII PLY file. .. todo:: Implement the import_surface_from_ply_ascii function Args: input_file (Path): The input PLY file path. Returns: dict: A dictionary with 'vertices' and 'faces'. """ vertices = [] faces = [] with open(input_file, 'r') as f: header = True for line in f: if header: if line.strip() == "end_header": header = False continue parts = line.strip().split() if len(parts) == 3: # Vertex vertices.append(tuple(map(float, parts))) elif len(parts) > 3 and parts[0] == '3': # Face faces.append(tuple(map(int, parts[1:4]))) return {'vertices': vertices, 'faces': faces}
[docs] def import_surface_from_ply_binary(input_file: Path): """Import a triangulated surface from a binary PLY file. .. todo:: Implement the import_surface_from_ply_binary function Args: input_file (Path): The input PLY file path. Returns: dict: A dictionary with 'vertices' and 'faces'. """ vertices = [] faces = [] with open(input_file, 'rb') as f: header = [] while True: line = f.readline().decode().strip() header.append(line) if line == "end_header": break # Parse header to determine vertex and face counts vertex_count = 0 face_count = 0 for line in header: if line.startswith("element vertex"): vertex_count = int(line.split()[-1]) elif line.startswith("element face"): face_count = int(line.split()[-1]) # Read vertices for _ in range(vertex_count): vertex_data = f.read(12) # 3 floats (4 bytes each) vertices.append(struct.unpack('fff', vertex_data)) # Read faces for _ in range(face_count): face_data = f.read(13) # 1 uchar + 3 ints (1 + 4*3 bytes) _, v1, v2, v3 = struct.unpack('Biii', face_data) faces.append((v1, v2, v3)) return {'vertices': vertices, 'faces': faces}