# HG changeset patch # User Santeri Piippo # Date 1512913550 -7200 # Node ID 5411a25cfca72935eceee3635ce38bd0507b1edb # Parent 55b4c97d44c54eb523683055c3fdaa55e5b940b9 Parsing function complete diff -r 55b4c97d44c5 -r 5411a25cfca7 geometry.py --- a/geometry.py Sun Dec 10 15:37:26 2017 +0200 +++ b/geometry.py Sun Dec 10 15:45:50 2017 +0200 @@ -18,6 +18,12 @@ def __repr__(self): return str.format('LineSegment({!r}, {!r})', self.v1, self.v2) +class Polygon: + def __init__(self, vertices): + self.vertices = vertices + def __repr__(self): + return str.format('Polygon({!r})', self.vertices) + def is_real(number): return isinstance(number, int) or isinstance(number, float) diff -r 55b4c97d44c5 -r 5411a25cfca7 ldraw.py --- a/ldraw.py Sun Dec 10 15:37:26 2017 +0200 +++ b/ldraw.py Sun Dec 10 15:45:50 2017 +0200 @@ -10,15 +10,22 @@ line = line.strip() if not line: return linetypes.EmptyLine() - if line == '0': + elif line == '0': return linetypes.Comment('') - if line.startswith('0 '): + elif line.startswith('0 '): return linetypes.Comment(line[2:].strip()) - if line.startswith('1 '): + elif line.startswith('1 '): return parse_ldraw_subfile_reference(line) - if line.startswith('2 '): + elif line.startswith('2 '): return parse_ldraw_line(line) - ... + elif line.startswith('3 '): + return parse_ldraw_triangle(line) + elif line.startswith('4 '): + return parse_ldraw_quadrilateral(line) + elif line.startswith('5 '): + return parse_ldraw_contour(line) + else: + raise BadLdrawLine('unknown line type') def parse_ldraw_subfile_reference(line): pattern = r'^1\s+(\d+)' + r'\s+([^ ]+)' * (3 + 9 + 1) + r'\s*$' @@ -72,10 +79,32 @@ def parse_ldraw_line(line): parse_result = generic_parse_polygon(line, type_code = 2, vertex_count = 2) - line_segment = LineSegment(*parse_result['vertices']) return linetypes.LineSegment( color = parse_result['color'], - geometry = line_segment) + geometry = LineSegment(*parse_result['vertices']), + ) + +def parse_ldraw_triangle(line): + parse_result = generic_parse_polygon(line, type_code = 3, vertex_count = 3) + return linetypes.Triangle( + color = parse_result['color'], + geometry = Polygon(parse_result['vertices']), + ) + +def parse_ldraw_quadrilateral(line): + parse_result = generic_parse_polygon(line, type_code = 4, vertex_count = 4) + return linetypes.Quadrilateral( + color = parse_result['color'], + geometry = Polygon(parse_result['vertices']), + ) + +def parse_ldraw_contour(line): + parse_result = generic_parse_polygon(line, type_code = 5, vertex_count = 4) + return linetypes.Contour( + color = parse_result['color'], + geometry = LineSegment(*parse_result['vertices'][0:2]), + control_points = parse_result['vertices'][2:], + ) def read_ldraw(file, *, libraries): result = list() diff -r 55b4c97d44c5 -r 5411a25cfca7 linetypes.py --- a/linetypes.py Sun Dec 10 15:37:26 2017 +0200 +++ b/linetypes.py Sun Dec 10 15:45:50 2017 +0200 @@ -44,3 +44,14 @@ class Quadrilateral(LineSegment): pass + +class Contour(LineSegment): + def __init__(self, *, color, geometry, control_points): + super().__init__(color = color, geometry = geometry) + self.control_points = control_points + assert(len(self.control_points) == 2) + def __repr__(self): + return str.format('linetypes.Contour(' \ + 'color = {color!r}, ' \ + 'geometry = {geometry!r}, ' \ + 'control_points = {control_points!r})', **self.__dict__)