Update formats
This commit is contained in:
parent
525ec741d9
commit
913583aeba
|
@ -2,9 +2,16 @@ from ..basemodel import TextModelParser, Exporter, Vertex, TexCoord, Normal, Fac
|
|||
from ..mesh import Material, MeshPart
|
||||
|
||||
def is_off(filename):
|
||||
"""Checks that the file is a .off file
|
||||
|
||||
Only checks the extension of the file
|
||||
:param filename: path to the file
|
||||
"""
|
||||
return filename[-4:] == '.off'
|
||||
|
||||
class OFFParser(TextModelParser):
|
||||
"""Parser that parses a .off file
|
||||
"""
|
||||
def __init__(self, up_conversion = None):
|
||||
super().__init__(up_conversion)
|
||||
self.vertex_number = None
|
||||
|
@ -12,10 +19,13 @@ class OFFParser(TextModelParser):
|
|||
self.edge_number = None
|
||||
|
||||
def parse_line(self, string):
|
||||
"""Parses a line of .off file
|
||||
|
||||
:param string: the line to parse
|
||||
"""
|
||||
split = string.split()
|
||||
|
||||
if string == 'OFF':
|
||||
if string == '' or string == 'OFF':
|
||||
pass
|
||||
elif self.vertex_number is None:
|
||||
# The first will be the header
|
||||
|
@ -30,11 +40,18 @@ class OFFParser(TextModelParser):
|
|||
|
||||
|
||||
class OFFExporter(Exporter):
|
||||
"""Exporter to .off format
|
||||
"""
|
||||
def __init__(self, model):
|
||||
"""Creates an exporter from the model
|
||||
|
||||
:param model: Model to export
|
||||
"""
|
||||
super().__init__(model)
|
||||
|
||||
def __str__(self):
|
||||
|
||||
"""Exports the model
|
||||
"""
|
||||
faces = sum(map(lambda x: x.faces, self.model.parts), [])
|
||||
string = "OFF\n{} {} {}".format(len(self.model.vertices), len(faces), 0) + '\n'
|
||||
|
||||
|
|
|
@ -9,10 +9,19 @@ class UnkownTypeError(Exception):
|
|||
self.message = message
|
||||
|
||||
def is_ply(filename):
|
||||
"""Checks that the file is a .ply file
|
||||
|
||||
Only checks the extension of the file
|
||||
:param filename: path to the file
|
||||
"""
|
||||
return filename[-4:] == '.ply'
|
||||
|
||||
# List won't work with this function
|
||||
def _ply_type_size(type):
|
||||
"""Returns the size of a ply property
|
||||
|
||||
:param type: a string that is in a ply element
|
||||
""""
|
||||
if type == 'char' or type == 'uchar':
|
||||
return 1
|
||||
elif type == 'short' or type == 'ushort':
|
||||
|
@ -27,6 +36,10 @@ def _ply_type_size(type):
|
|||
raise UnkownTypeError('Type ' + type + ' is unknown')
|
||||
|
||||
def ply_type_size(type):
|
||||
"""Returns the list containing the sizes of the elements
|
||||
|
||||
:param type: a string that is in a ply element
|
||||
"""
|
||||
split = type.split()
|
||||
|
||||
if len(split) == 1:
|
||||
|
@ -40,6 +53,12 @@ def ply_type_size(type):
|
|||
|
||||
|
||||
def bytes_to_element(type, bytes, byteorder = 'little'):
|
||||
"""Returns a python object parsed from bytes
|
||||
|
||||
:param type: the type of the object to parse
|
||||
:param bytes: the bytes to read
|
||||
:param byteorder: little or big endian
|
||||
"""
|
||||
if type == 'char':
|
||||
return ord(struct.unpack('<b', bytes)[0])
|
||||
if type == 'uchar':
|
||||
|
@ -60,6 +79,8 @@ def bytes_to_element(type, bytes, byteorder = 'little'):
|
|||
raise UnkownTypeError('Type ' + type + ' is unknown')
|
||||
|
||||
class PLYParser(ModelParser):
|
||||
"""Parser that parses a .ply file
|
||||
"""
|
||||
|
||||
def __init__(self, up_conversion = None):
|
||||
super().__init__(up_conversion)
|
||||
|
@ -71,6 +92,8 @@ class PLYParser(ModelParser):
|
|||
self.header_finished = False
|
||||
|
||||
def parse_bytes(self, bytes, byte_counter):
|
||||
"""Parses bytes of a .ply file
|
||||
"""
|
||||
if self.header_finished:
|
||||
self.inner_parser.parse_bytes(self.beginning_of_line + bytes, byte_counter - len(self.beginning_of_line))
|
||||
self.beginning_of_line = b''
|
||||
|
@ -92,6 +115,8 @@ class PLYParser(ModelParser):
|
|||
self.beginning_of_line = current_line
|
||||
|
||||
class PLYHeaderParser:
|
||||
"""Parser that parses the header of a .ply file
|
||||
"""
|
||||
def __init__(self, parent):
|
||||
self.current_element = None
|
||||
self.parent = parent
|
||||
|
|
|
@ -4,9 +4,16 @@ from ..mesh import MeshPart
|
|||
import os.path
|
||||
|
||||
def is_stl(filename):
|
||||
"""Checks that the file is a .stl file
|
||||
|
||||
Only checks the extension of the file
|
||||
:param filename: path to the file
|
||||
"""
|
||||
return filename[-4:] == '.stl'
|
||||
|
||||
class STLParser(TextModelParser):
|
||||
"""Parser that parses a .stl file
|
||||
"""
|
||||
|
||||
def __init__(self, up_conversion = None):
|
||||
super().__init__(up_conversion)
|
||||
|
@ -17,7 +24,10 @@ class STLParser(TextModelParser):
|
|||
self.face_vertices = None
|
||||
|
||||
def parse_line(self, string):
|
||||
"""Parses a line of .stl file
|
||||
|
||||
:param string: the line to parse
|
||||
"""
|
||||
if string == '':
|
||||
return
|
||||
|
||||
|
@ -66,10 +76,19 @@ class STLParser(TextModelParser):
|
|||
|
||||
|
||||
class STLExporter(Exporter):
|
||||
"""Exporter to .stl format
|
||||
"""
|
||||
def __init__(self, model):
|
||||
"""Creates an exporter from the model
|
||||
|
||||
:param model: Model to export
|
||||
"""
|
||||
super().__init__(model)
|
||||
super().__init__(model)
|
||||
|
||||
def __str__(self):
|
||||
"""Exports the model
|
||||
"""
|
||||
string = 'solid {}\n'.format(os.path.basename(self.model.path[:-4]))
|
||||
|
||||
self.model.generate_face_normals()
|
||||
|
|
Loading…
Reference in New Issue