From ab175641fe8ef452fae4e37ee7d040e78252314d Mon Sep 17 00:00:00 2001 From: Henk van der Laak Date: Sun, 8 Sep 2019 11:25:04 +0200 Subject: [PATCH 1/2] Turn <3 points polygon exception into warning --- fatamorgana/records.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fatamorgana/records.py b/fatamorgana/records.py index aabc3b4..f76682e 100644 --- a/fatamorgana/records.py +++ b/fatamorgana/records.py @@ -18,7 +18,7 @@ import zlib import io import logging import pprint - +from warnings import warn from .basic import AString, NString, repetition_t, property_value_t, real_t, \ ReuseRepetition, OffsetTable, Validation, read_point_list, read_property_value, \ read_bstring, read_uint, read_sint, read_real, read_repetition, read_interval, \ @@ -1630,7 +1630,7 @@ class Polygon(Record): if point_list is not None: if len(point_list) < 3: - raise InvalidDataError('Polygon with < 3 points') + warn('Polygon with < 3 points') def merge_with_modals(self, modals: Modals): adjust_coordinates(self, modals, 'geometry_x', 'geometry_y') From 203a52077012fb096f9e3d18f473c0296ecbdcd4 Mon Sep 17 00:00:00 2001 From: Henk van der Laak Date: Sun, 8 Sep 2019 11:25:42 +0200 Subject: [PATCH 2/2] Read type0,1 pointlist correctly --- fatamorgana/basic.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/fatamorgana/basic.py b/fatamorgana/basic.py index 7619b27..4db5ba0 100644 --- a/fatamorgana/basic.py +++ b/fatamorgana/basic.py @@ -1302,25 +1302,38 @@ def read_point_list(stream: io.BufferedIOBase) -> List[List[int]]: """ list_type = read_uint(stream) list_len = read_uint(stream) - #TODO: Implicit close point for 1del if list_type == 0: points = [] + dx, dy = 0, 0 for i in range(list_len): point = [0, 0] - n = read_uint(stream) + n = read_sint(stream) if n == 0: raise InvalidDataError('Zero-sized 1-delta') point[i % 2] = n points.append(point) + if i % 2: + dy += n + else: + dx += n + points.append([-dx, 0]) + points.append([0, -dy]) elif list_type == 1: points = [] + dx, dy = 0, 0 for i in range(list_len): point = [0, 0] - n = read_uint(stream) + n = read_sint(stream) if n == 0: raise Exception('Zero-sized 1-delta') point[(i + 1) % 2] = n points.append(point) + if i % 2: + dx += n + else: + dy += n + points.append([0, -dy]) + points.append([-dx, 0]) elif list_type == 2: points = [ManhattanDelta.read(stream).as_list() for _ in range(list_len)] elif list_type == 3: