From c79eee2a8c65f8ee8844d84df27292c5c513eb29 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Mon, 11 May 2020 19:29:00 -0700 Subject: [PATCH] Stricter locking (lock contained ndarrays and turn lists into tuples) --- masque/label.py | 4 +++- masque/pattern.py | 8 +++++++- masque/repetition.py | 13 ++++++++++++- masque/shapes/arc.py | 14 +++++++++++++- masque/shapes/circle.py | 2 +- masque/shapes/ellipse.py | 11 ++++++++++- masque/shapes/path.py | 15 ++++++++++++++- masque/shapes/polygon.py | 12 +++++++++++- masque/shapes/shape.py | 2 ++ masque/shapes/text.py | 12 +++++++++++- masque/subpattern.py | 4 ++++ 11 files changed, 88 insertions(+), 9 deletions(-) diff --git a/masque/label.py b/masque/label.py index 36a8a0b..972370b 100644 --- a/masque/label.py +++ b/masque/label.py @@ -80,7 +80,7 @@ class Label: offset: vector2 = (0.0, 0.0), layer: layer_t = 0, locked: bool = False): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.string = string self.offset = numpy.array(offset, dtype=float, copy=True) @@ -156,6 +156,7 @@ class Label: Return: self """ + self.offset.flags.writeable = False object.__setattr__(self, 'locked', True) return self @@ -167,4 +168,5 @@ class Label: self """ object.__setattr__(self, 'locked', False) + self.offset.flags.writeable = True return self diff --git a/masque/pattern.py b/masque/pattern.py index d4cbb19..a0313a6 100644 --- a/masque/pattern.py +++ b/masque/pattern.py @@ -71,7 +71,7 @@ class Pattern: name: An identifier for the Pattern locked: Whether to lock the pattern after construction """ - self.unlock() + object.__setattr__(self, 'locked', False) if isinstance(shapes, list): self.shapes = shapes else: @@ -715,6 +715,9 @@ class Pattern: Returns: self """ + self.shapes = tuple(self.shapes) + self.labels = tuple(self.labels) + self.subpatterns = tuple(self.subpatterns) object.__setattr__(self, 'locked', True) return self @@ -726,6 +729,9 @@ class Pattern: self """ object.__setattr__(self, 'locked', False) + self.shapes = list(self.shapes) + self.labels = list(self.labels) + self.subpatterns = list(self.subpatterns) return self def deeplock(self) -> 'Pattern': diff --git a/masque/repetition.py b/masque/repetition.py index 37bd350..6c7894b 100644 --- a/masque/repetition.py +++ b/masque/repetition.py @@ -121,7 +121,8 @@ class GridRepetition: if b_count < 1: raise PatternError('Repetition has too-small b_count: ' '{}'.format(b_count)) - self.unlock() + + object.__setattr__(self, 'locked', False) self.a_vector = a_vector self.b_vector = b_vector self.a_count = a_count @@ -481,6 +482,11 @@ class GridRepetition: Returns: self """ + self.offset.flags.writeable = False + self.a_vector.flags.writeable = False + self.mirrored.flags.writeable = False + if self.b_vector is not None: + self.b_vector.flags.writeable = False object.__setattr__(self, 'locked', True) return self @@ -491,6 +497,11 @@ class GridRepetition: Returns: self """ + self.offset.flags.writeable = True + self.a_vector.flags.writeable = True + self.mirrored.flags.writeable = True + if self.b_vector is not None: + self.b_vector.flags.writeable = True object.__setattr__(self, 'locked', False) return self diff --git a/masque/shapes/arc.py b/masque/shapes/arc.py index f082c3b..6b1a5bf 100644 --- a/masque/shapes/arc.py +++ b/masque/shapes/arc.py @@ -158,7 +158,7 @@ class Arc(Shape): layer: layer_t = 0, dose: float = 1.0, locked: bool = False): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.radii = radii self.angles = angles @@ -386,3 +386,15 @@ class Arc(Shape): a.append((a0, a1)) return numpy.array(a) + + def lock(self) -> 'Arc': + self.radii.flags.writeable = False + self.angles.flags.writeable = False + Shape.lock(self) + return self + + def unlock(self) -> 'Arc': + Shape.unlock(self) + self.radii.flags.writeable = True + self.angles.flags.writeable = True + return self diff --git a/masque/shapes/circle.py b/masque/shapes/circle.py index 1f6b5c9..8f008dd 100644 --- a/masque/shapes/circle.py +++ b/masque/shapes/circle.py @@ -46,7 +46,7 @@ class Circle(Shape): layer: layer_t = 0, dose: float = 1.0, locked: bool = False): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.offset = numpy.array(offset, dtype=float) self.layer = layer diff --git a/masque/shapes/ellipse.py b/masque/shapes/ellipse.py index fc8a2d4..12a2baf 100644 --- a/masque/shapes/ellipse.py +++ b/masque/shapes/ellipse.py @@ -93,7 +93,7 @@ class Ellipse(Shape): layer: layer_t = 0, dose: float = 1.0, locked: bool = False): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.radii = radii self.offset = offset @@ -180,3 +180,12 @@ class Ellipse(Shape): (self.offset, scale/norm_value, angle, False, self.dose), \ lambda: Ellipse(radii=radii*norm_value, layer=self.layer) + def lock(self) -> 'Ellipse': + self.radii.flags.writeable = False + Shape.lock(self) + return self + + def unlock(self) -> 'Ellipse': + Shape.unlock(self) + self.radii.flags.writeable = True + return self diff --git a/masque/shapes/path.py b/masque/shapes/path.py index 899e462..57ae873 100644 --- a/masque/shapes/path.py +++ b/masque/shapes/path.py @@ -149,7 +149,7 @@ class Path(Shape): dose: float = 1.0, locked: bool = False, ): - self.unlock() + object.__setattr__(self, 'locked', False) self._cap_extensions = None # Since .cap setter might access it self.identifier = () @@ -394,3 +394,16 @@ class Path(Shape): extensions = numpy.zeros(2) return extensions + def lock(self) -> 'Path': + self.vertices.flags.writeable = False + if self.cap_extensions is not None: + self.cap_extensions.flags.writeable = False + Shape.lock(self) + return self + + def unlock(self) -> 'Path': + Shape.unlock(self) + self.vertices.flags.writeable = True + if self.cap_extensions is not None: + self.cap_extensions.flags.writeable = True + return self diff --git a/masque/shapes/polygon.py b/masque/shapes/polygon.py index da98d4d..6d19714 100644 --- a/masque/shapes/polygon.py +++ b/masque/shapes/polygon.py @@ -76,7 +76,7 @@ class Polygon(Shape): dose: float = 1.0, locked: bool = False, ): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.layer = layer self.dose = dose @@ -329,3 +329,13 @@ class Polygon(Shape): ''' self.vertices = remove_colinear_vertices(self.vertices, closed_path=True) return self + + def lock(self) -> 'Polygon': + self.vertices.flags.writeable = False + Shape.lock(self) + return self + + def unlock(self) -> 'Polygon': + Shape.unlock(self) + self.vertices.flags.writeable = True + return self diff --git a/masque/shapes/shape.py b/masque/shapes/shape.py index 7db14c3..6a664a5 100644 --- a/masque/shapes/shape.py +++ b/masque/shapes/shape.py @@ -443,6 +443,7 @@ class Shape(metaclass=ABCMeta): Returns: self """ + self.offset.flags.writeable = False object.__setattr__(self, 'locked', True) return self @@ -454,4 +455,5 @@ class Shape(metaclass=ABCMeta): self """ object.__setattr__(self, 'locked', False) + self.offset.flags.writeable = True return self diff --git a/masque/shapes/text.py b/masque/shapes/text.py index af7beae..355600e 100644 --- a/masque/shapes/text.py +++ b/masque/shapes/text.py @@ -77,7 +77,7 @@ class Text(Shape): dose: float = 1.0, locked: bool = False, ): - self.unlock() + object.__setattr__(self, 'locked', False) self.identifier = () self.offset = offset self.layer = layer @@ -243,3 +243,13 @@ def get_char_as_polygons(font_path: str, polygons = path.to_polygons() return polygons, advance + + def lock(self) -> 'Text': + self.mirrored.flags.writeable = False + Shape.lock(self) + return self + + def unlock(self) -> 'Text': + Shape.unlock(self) + self.mirrored.flags.writeable = True + return self diff --git a/masque/subpattern.py b/masque/subpattern.py index 7115ed6..a6cc123 100644 --- a/masque/subpattern.py +++ b/masque/subpattern.py @@ -296,6 +296,8 @@ class SubPattern: Returns: self """ + self.offset.flags.writeable = False + self.mirrored.flags.writeable = False object.__setattr__(self, 'locked', True) return self @@ -306,6 +308,8 @@ class SubPattern: Returns: self """ + self.offset.flags.writeable = True + self.mirrored.flags.writeable = True object.__setattr__(self, 'locked', False) return self