Refactoring

This commit is contained in:
Alcouffe Rémy 2022-09-29 13:52:22 +02:00
parent a009b661d1
commit 449aaf7790
2 changed files with 48 additions and 29 deletions

58
obja.py
View File

@ -8,11 +8,13 @@ import random
obja model for python. obja model for python.
""" """
class Face: class Face:
""" """
The class that holds a, b, and c, the indices of the vertices of the face. The class that holds a, b, and c, the indices of the vertices of the face.
""" """
def __init__(self, a, b, c, visible = True):
def __init__(self, a, b, c, visible=True):
self.a = a self.a = a
self.b = b self.b = b
self.c = c self.c = c
@ -52,7 +54,7 @@ class Face:
self.visible = other.visible self.visible = other.visible
return self return self
def test(self, vertices, line = "unknown"): def test(self, vertices, line="unknown"):
""" """
Tests if a face references only vertices that exist when the face is declared. Tests if a face references only vertices that exist when the face is declared.
""" """
@ -69,10 +71,12 @@ class Face:
def __repr__(self): def __repr__(self):
return str(self) return str(self)
class VertexError(Exception): class VertexError(Exception):
""" """
An operation references a vertex that does not exist. An operation references a vertex that does not exist.
""" """
def __init__(self, index, line): def __init__(self, index, line):
""" """
Creates the error from index of the referenced vertex and the line where the error occured. Creates the error from index of the referenced vertex and the line where the error occured.
@ -87,10 +91,12 @@ class VertexError(Exception):
""" """
return f'There is no vector {self.index} (line {self.line})' return f'There is no vector {self.index} (line {self.line})'
class FaceError(Exception): class FaceError(Exception):
""" """
An operation references a face that does not exist. An operation references a face that does not exist.
""" """
def __init__(self, index, line): def __init__(self, index, line):
""" """
Creates the error from index of the referenced face and the line where the error occured. Creates the error from index of the referenced face and the line where the error occured.
@ -105,10 +111,12 @@ class FaceError(Exception):
""" """
return f'There is no face {self.index} (line {self.line})' return f'There is no face {self.index} (line {self.line})'
class FaceVertexError(Exception): class FaceVertexError(Exception):
""" """
An operation references a face vector that does not exist. An operation references a face vector that does not exist.
""" """
def __init__(self, index, line): def __init__(self, index, line):
""" """
Creates the error from index of the referenced face vector and the line where the error occured. Creates the error from index of the referenced face vector and the line where the error occured.
@ -123,10 +131,12 @@ class FaceVertexError(Exception):
""" """
return f'Face has no vector {self.index} (line {self.line})' return f'Face has no vector {self.index} (line {self.line})'
class UnknownInstruction(Exception): class UnknownInstruction(Exception):
""" """
An instruction is unknown. An instruction is unknown.
""" """
def __init__(self, instruction, line): def __init__(self, instruction, line):
""" """
Creates the error from instruction and the line where the error occured. Creates the error from instruction and the line where the error occured.
@ -141,13 +151,15 @@ class UnknownInstruction(Exception):
""" """
return f'Instruction {self.instruction} unknown (line {self.line})' return f'Instruction {self.instruction} unknown (line {self.line})'
class Model: class Model:
""" """
The OBJA model. The OBJA model.
""" """
def __init__(self): def __init__(self):
""" """
Intializes an empty model. Initializes an empty model.
""" """
self.vertices = [] self.vertices = []
self.faces = [] self.faces = []
@ -244,6 +256,7 @@ class Model:
return return
# raise UnknownInstruction(split[0], self.line) # raise UnknownInstruction(split[0], self.line)
def parse_file(path): def parse_file(path):
""" """
Parses a file and returns the model. Parses a file and returns the model.
@ -252,13 +265,15 @@ def parse_file(path):
model.parse_file(path) model.parse_file(path)
return model return model
class Output: class Output:
""" """
The type for a model that outputs as obja. The type for a model that outputs as obja.
""" """
def __init__(self, output, random_color = False):
def __init__(self, output, random_color=False):
""" """
Initializes the index mapping dictionnaries. Initializes the index mapping dictionaries.
""" """
self.vertex_mapping = dict() self.vertex_mapping = dict()
self.face_mapping = dict() self.face_mapping = dict()
@ -270,16 +285,17 @@ class Output:
Adds a new vertex to the model with the specified index. Adds a new vertex to the model with the specified index.
""" """
self.vertex_mapping[index] = len(self.vertex_mapping) self.vertex_mapping[index] = len(self.vertex_mapping)
print('v {} {} {}'.format(vertex[0], vertex[1], vertex[2]), file = self.output) print('v {} {} {}'.format(vertex[0], vertex[1], vertex[2]), file=self.output)
def edit_vertex(self, index, vertex): def edit_vertex(self, index, vertex):
""" """
Changes the coordinates of a vertex. Changes the coordinates of a vertex.
""" """
if len(self.vertex_mapping) == 0: if len(self.vertex_mapping) == 0:
print('ev {} {} {} {}'.format(index, vertex[0], vertex[1],vertex[2]), file = self.output) print('ev {} {} {} {}'.format(index, vertex[0], vertex[1], vertex[2]), file=self.output)
else: else:
print('ev {} {} {} {}'.format(self.vertex_mapping[index] + 1, vertex[0], vertex[1],vertex[2]), file = self.output) print('ev {} {} {} {}'.format(self.vertex_mapping[index] + 1, vertex[0], vertex[1], vertex[2]),
file=self.output)
def add_face(self, index, face): def add_face(self, index, face):
""" """
@ -287,11 +303,11 @@ class Output:
""" """
self.face_mapping[index] = len(self.face_mapping) self.face_mapping[index] = len(self.face_mapping)
print('f {} {} {}'.format( print('f {} {} {}'.format(
self.vertex_mapping[face.a] + 1, self.vertex_mapping[face.a] + 1,
self.vertex_mapping[face.b] + 1, self.vertex_mapping[face.b] + 1,
self.vertex_mapping[face.c] + 1, self.vertex_mapping[face.c] + 1,
), ),
file = self.output file=self.output
) )
if self.random_color: if self.random_color:
@ -300,7 +316,7 @@ class Output:
random.uniform(0, 1), random.uniform(0, 1),
random.uniform(0, 1), random.uniform(0, 1),
random.uniform(0, 1)), random.uniform(0, 1)),
file = self.output file=self.output
) )
def edit_face(self, index, face): def edit_face(self, index, face):
@ -308,14 +324,15 @@ class Output:
Changes the indices of the vertices of the specified face. Changes the indices of the vertices of the specified face.
""" """
print('ef {} {} {} {}'.format( print('ef {} {} {} {}'.format(
self.face_mapping[index] + 1, self.face_mapping[index] + 1,
self.vertex_mapping[face.a] + 1, self.vertex_mapping[face.a] + 1,
self.vertex_mapping[face.b] + 1, self.vertex_mapping[face.b] + 1,
self.vertex_mapping[face.c] + 1 self.vertex_mapping[face.c] + 1
), ),
file = self.output file=self.output
) )
def main(): def main():
if len(sys.argv) == 1: if len(sys.argv) == 1:
print("obja needs a path to an obja file") print("obja needs a path to an obja file")
@ -325,5 +342,6 @@ def main():
print(model.vertices) print(model.vertices)
print(model.faces) print(model.faces)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -6,7 +6,6 @@
# Standard library imports. # Standard library imports.
import sys import sys
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
from SocketServer import ThreadingMixIn from SocketServer import ThreadingMixIn
import BaseHTTPServer import BaseHTTPServer
@ -17,7 +16,7 @@ else:
import http.server as BaseHTTPServer import http.server as BaseHTTPServer
from http.server import SimpleHTTPRequestHandler from http.server import SimpleHTTPRequestHandler
from socketserver import ThreadingMixIn from socketserver import ThreadingMixIn
from urllib.parse import quote, unquote from urllib.parse import quote, unquote
from io import BytesIO as cStringIO from io import BytesIO as cStringIO
import os import os
@ -35,6 +34,7 @@ import errno
DATA_DIR = getcwd() DATA_DIR = getcwd()
class ThreadingHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer): class ThreadingHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass pass
@ -61,7 +61,7 @@ class RequestHandler(SimpleHTTPRequestHandler):
in_file.seek(self.range_from) in_file.seek(self.range_from)
# Add 1 because the range is inclusive # Add 1 because the range is inclusive
left_to_copy = 1 + self.range_to - self.range_from left_to_copy = 1 + self.range_to - self.range_from
buf_length = 64*1024 buf_length = 64 * 1024
bytes_copied = 0 bytes_copied = 0
while bytes_copied < left_to_copy: while bytes_copied < left_to_copy:
read_buf = in_file.read(min(buf_length, left_to_copy - bytes_copied)) read_buf = in_file.read(min(buf_length, left_to_copy - bytes_copied))
@ -125,7 +125,7 @@ class RequestHandler(SimpleHTTPRequestHandler):
file_size = fs.st_size file_size = fs.st_size
if self.range_from is not None: if self.range_from is not None:
if self.range_to is None or self.range_to >= file_size: if self.range_to is None or self.range_to >= file_size:
self.range_to = file_size-1 self.range_to = file_size - 1
self.send_header("Content-Range", self.send_header("Content-Range",
"bytes %d-%d/%d" % (self.range_from, "bytes %d-%d/%d" % (self.range_from,
self.range_to, self.range_to,
@ -184,8 +184,8 @@ class RequestHandler(SimpleHTTPRequestHandler):
def translate_path(self, path): def translate_path(self, path):
""" Override to handle redirects. """ Override to handle redirects.
""" """
path = path.split('?',1)[0] path = path.split('?', 1)[0]
path = path.split('#',1)[0] path = path.split('#', 1)[0]
path = normpath(unquote(path)) path = normpath(unquote(path))
words = path.split('/') words = path.split('/')
words = filter(None, words) words = filter(None, words)
@ -240,12 +240,13 @@ def get_server(port=8000, next_attempts=0, serve_path=None):
else: else:
raise raise
def main(args=None): def main(args=None):
if args is None: if args is None:
args = sys.argv[1:] args = sys.argv[1:]
PORT = 8000 PORT = 8000
if len(args)>0: if len(args) > 0:
PORT = int(args[-1]) PORT = int(args[-1])
serve_path = DATA_DIR serve_path = DATA_DIR
if len(args) > 1: if len(args) > 1:
@ -256,6 +257,6 @@ def main(args=None):
print("serving at port " + str(PORT)) print("serving at port " + str(PORT))
httpd.serve_forever() httpd.serve_forever()
if __name__ == "__main__" :
main()
if __name__ == "__main__":
main()