diff --git a/masque/label.py b/masque/label.py index 2a2b56d..2dcf6f2 100644 --- a/masque/label.py +++ b/masque/label.py @@ -14,15 +14,15 @@ class Label: """ A circle, which has a position and radius. """ - + __slots__ = ('_offset', '_layer', '_string', 'identifier') # [x_offset, y_offset] - _offset = numpy.array([0.0, 0.0]) # type: numpy.ndarray + _offset: numpy.ndarray - # Layer (integer >= 0) - _layer = 0 # type: int or Tuple + # Layer (integer >= 0) or 2-Tuple of integers + _layer: int or Tuple # Label string - _string = None # type: str + _string: str # Arbitrary identifier tuple identifier: Tuple diff --git a/masque/pattern.py b/masque/pattern.py index fb89f26..aa6c459 100644 --- a/masque/pattern.py +++ b/masque/pattern.py @@ -33,10 +33,11 @@ class Pattern: may reference the same Pattern object. :var name: An identifier for this object. Not necessarily unique. """ - shapes = None # type: List[Shape] - labels = None # type: List[Labels] - subpatterns = None # type: List[SubPattern or GridRepetition] - name = None # type: str + __slots__ = ('shapes', 'labels', 'subpatterns', 'name') + shapes: List[Shape] + labels: List[Label] + subpatterns: List[SubPattern or GridRepetition] + name: str def __init__(self, shapes: List[Shape]=(), diff --git a/masque/repetition.py b/masque/repetition.py index 8618ba6..ccdf529 100644 --- a/masque/repetition.py +++ b/masque/repetition.py @@ -23,19 +23,30 @@ class GridRepetition: GridRepetition provides support for efficiently embedding multiple copies of a Pattern into another Pattern at regularly-spaced offsets. """ + __slots__ = ('pattern', + '_offset', + '_rotation', + '_dose', + '_scale', + '_mirrored', + '_a_vector', + '_b_vector', + 'a_count', + 'b_count', + 'identifier') - pattern = None # type: Pattern + pattern: 'Pattern' - _offset = (0.0, 0.0) # type: numpy.ndarray - _rotation = 0.0 # type: float - _dose = 1.0 # type: float - _scale = 1.0 # type: float - _mirrored = None # type: List[bool] + _offset: numpy.ndarray + _rotation: float + _dose: float + _scale: float + _mirrored: List[bool] - _a_vector = None # type: numpy.ndarray - _b_vector = None # type: numpy.ndarray or None - a_count = None # type: int - b_count = 1 # type: int + _a_vector: numpy.ndarray + _b_vector: numpy.ndarray or None + a_count: int + b_count: int identifier: Tuple diff --git a/masque/shapes/arc.py b/masque/shapes/arc.py index ee6bf15..b8e8547 100644 --- a/masque/shapes/arc.py +++ b/masque/shapes/arc.py @@ -20,15 +20,14 @@ class Arc(Shape): The rotation gives the angle from x-axis, counterclockwise, to the first (x) radius. The start and stop angle are measured counterclockwise from the first (x) radius. """ - - _radii = None # type: numpy.ndarray - _angles = None # type: numpy.ndarray - _width = 1.0 # type: float - _rotation = 0.0 # type: float - - # Defaults for to_polygons - poly_num_points = DEFAULT_POLY_NUM_POINTS # type: int - poly_max_arclen = None # type: float + __slots__ = ('_radii', '_angles', '_width', '_rotation', + 'poly_num_points', 'poly_max_arclen') + _radii: numpy.ndarray + _angles: numpy.ndarray + _width: float + _rotation: float + poly_num_points: int + poly_max_arclen: float # radius properties @property @@ -148,6 +147,7 @@ class Arc(Shape): mirrored: Tuple[bool] = (False, False), layer: int=0, dose: float=1.0): + self.identifier = () self.radii = radii self.angles = angles self.width = width diff --git a/masque/shapes/circle.py b/masque/shapes/circle.py index 785a382..97df5c0 100644 --- a/masque/shapes/circle.py +++ b/masque/shapes/circle.py @@ -14,12 +14,10 @@ class Circle(Shape): """ A circle, which has a position and radius. """ - - _radius = None # type: float - - # Defaults for to_polygons - poly_num_points = DEFAULT_POLY_NUM_POINTS # type: int - poly_max_arclen = None # type: float + __slots__ = ('_radius', 'poly_num_points', 'poly_max_arclen') + _radius: float + poly_num_points: int + poly_max_arclen: float # radius property @property @@ -46,6 +44,7 @@ class Circle(Shape): offset: vector2=(0.0, 0.0), layer: int=0, dose: float=1.0): + self.identifier = () self.offset = numpy.array(offset, dtype=float) self.layer = layer self.dose = dose diff --git a/masque/shapes/ellipse.py b/masque/shapes/ellipse.py index 7064bd5..7915007 100644 --- a/masque/shapes/ellipse.py +++ b/masque/shapes/ellipse.py @@ -16,13 +16,12 @@ class Ellipse(Shape): An ellipse, which has a position, two radii, and a rotation. The rotation gives the angle from x-axis, counterclockwise, to the first (x) radius. """ - - _radii = None # type: numpy.ndarray - _rotation = 0.0 # type: float - - # Defaults for to_polygons - poly_num_points = DEFAULT_POLY_NUM_POINTS # type: int - poly_max_arclen = None # type: float + __slots__ = ('_radii', '_rotation', + 'poly_num_points', 'poly_max_arclen') + _radii: numpy.ndarray + _rotation: float + poly_num_points: int + poly_max_arclen: float # radius properties @property @@ -89,6 +88,7 @@ class Ellipse(Shape): mirrored: Tuple[bool] = (False, False), layer: int=0, dose: float=1.0): + self.identifier = () self.radii = radii self.offset = offset self.rotation = rotation diff --git a/masque/shapes/path.py b/masque/shapes/path.py index a09bae1..8e3b385 100644 --- a/masque/shapes/path.py +++ b/masque/shapes/path.py @@ -19,10 +19,11 @@ class Path(Shape): A normalized_form(...) is available, but can be quite slow with lots of vertices. """ - _vertices = None # type: numpy.ndarray - _width = None # type: float - _cap = None # type: Path.Cap - _cap_extensions = None # type: numpy.ndarray or None + __slots__ = ('_vertices', '_width', '_cap', '_cap_extensions') + _vertices: numpy.ndarray + _width: float + _cap: 'Path.Cap' + _cap_extensions: numpy.ndarray or None class Cap(Enum): Flush = 0 # Path ends at final vertices @@ -151,6 +152,9 @@ class Path(Shape): layer: int=0, dose: float=1.0, ) -> 'Path': + self._cap_extensions = None # Since .cap setter might access it + + self.identifier = () self.offset = offset self.layer = layer self.dose = dose diff --git a/masque/shapes/polygon.py b/masque/shapes/polygon.py index 403689c..fda6cd7 100644 --- a/masque/shapes/polygon.py +++ b/masque/shapes/polygon.py @@ -18,7 +18,8 @@ class Polygon(Shape): A normalized_form(...) is available, but can be quite slow with lots of vertices. """ - _vertices = None # type: numpy.ndarray + __slots__ = ('_vertices',) + _vertices: numpy.ndarray # vertices property @property @@ -77,6 +78,7 @@ class Polygon(Shape): layer: int=0, dose: float=1.0, ): + self.identifier = () self.layer = layer self.dose = dose self.vertices = vertices diff --git a/masque/shapes/shape.py b/masque/shapes/shape.py index 46123a1..4dca5ae 100644 --- a/masque/shapes/shape.py +++ b/masque/shapes/shape.py @@ -24,18 +24,13 @@ class Shape(metaclass=ABCMeta): """ Abstract class specifying functions common to all shapes. """ + __slots__ = ('_offset', '_layer', '_dose', 'identifier') - # [x_offset, y_offset] - _offset = numpy.array([0.0, 0.0]) # type: numpy.ndarray - - # Layer (integer >= 0 or tuple) - _layer = 0 # type: int or Tuple - - # Dose - _dose = 1.0 # type: float - - # An arbitrary identifier for the shape, usually not set but used by Pattern.flatten() - identifier = () # type: Tuple + _offset: numpy.ndarray # [x_offset, y_offset] + _layer: int or Tuple # Layer (integer >= 0 or tuple) + _dose: float # Dose + identifier: Tuple # An arbitrary identifier for the shape, + # usually empty but used by Pattern.flatten() # --- Abstract methods @abstractmethod diff --git a/masque/shapes/text.py b/masque/shapes/text.py index d265d64..5824a62 100644 --- a/masque/shapes/text.py +++ b/masque/shapes/text.py @@ -16,11 +16,16 @@ __author__ = 'Jan Petykiewicz' class Text(Shape): - _string = '' # type: str - _height = 1.0 # type: float - _rotation = 0.0 # type: float - _mirrored = None # type: List[str] - font_path = '' # type: str + """ + Text (to be printed e.g. as a set of polygons). + This is distinct from non-printed Label objects. + """ + __slots__ = ('_string', '_height', '_rotation', '_mirrored', 'font_path') + _string: str + _height: float + _rotation: float + _mirrored: List[str] + font_path: str # vertices property @property diff --git a/masque/subpattern.py b/masque/subpattern.py index c84305c..745184b 100644 --- a/masque/subpattern.py +++ b/masque/subpattern.py @@ -21,13 +21,13 @@ class SubPattern: SubPattern provides basic support for nesting Pattern objects within each other, by adding offset, rotation, scaling, and associated methods. """ - - pattern = None # type: Pattern - _offset = (0.0, 0.0) # type: numpy.ndarray - _rotation = 0.0 # type: float - _dose = 1.0 # type: float - _scale = 1.0 # type: float - _mirrored = None # type: List[bool] + __slots__ = ('pattern', '_offset', '_rotation', '_dose', '_scale', '_mirrored', 'identifier') + pattern: 'Pattern' + _offset: numpy.ndarray + _rotation: float + _dose: float + _scale: float + _mirrored: List[bool] identifier: Tuple def __init__(self,