Add mirroring functions to patterns/subpatterns
This commit is contained in:
		
							parent
							
								
									d5a255a9d7
								
							
						
					
					
						commit
						f580e784f7
					
				| @ -351,6 +351,40 @@ class Pattern: | ||||
|             entry.rotate(rotation) | ||||
|         return self | ||||
| 
 | ||||
|     def mirror_element_centers(self, axis: int) -> 'Pattern': | ||||
|         """ | ||||
|         Mirror the offsets of all shapes and subpatterns across an axis | ||||
| 
 | ||||
|         :param axis: Axis to mirror across | ||||
|         :return: self | ||||
|         """ | ||||
|         for entry in self.shapes + self.subpatterns: | ||||
|             entry.offset[axis] *= -1 | ||||
|         return self | ||||
| 
 | ||||
|     def mirror_elements(self, axis: int) -> 'Pattern': | ||||
|         """ | ||||
|         Mirror each shape and subpattern across an axis, relative to its | ||||
|           center (offset) | ||||
| 
 | ||||
|         :param axis: Axis to mirror across | ||||
|         :return: self | ||||
|         """ | ||||
|         for entry in self.shapes + self.subpatterns: | ||||
|             entry.mirror(axis) | ||||
|         return self | ||||
| 
 | ||||
|     def mirror(self, axis: int) -> 'Pattern': | ||||
|         """ | ||||
|         Mirror the Pattern across an axis | ||||
| 
 | ||||
|         :param axis: Axis to mirror across | ||||
|         :return: self | ||||
|         """ | ||||
|         self.mirror_elements(axis) | ||||
|         self.mirror_element_centers(axis) | ||||
|         return self | ||||
| 
 | ||||
|     def scale_element_doses(self, factor: float) -> 'Pattern': | ||||
|         """ | ||||
|         Multiply all shape and subpattern doses by a factor | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
|   offset, rotation, scaling, and other such properties to the reference. | ||||
| """ | ||||
| 
 | ||||
| from typing import Union | ||||
| from typing import Union, List | ||||
| 
 | ||||
| import numpy | ||||
| from numpy import pi | ||||
| @ -26,11 +26,13 @@ class SubPattern: | ||||
|     _rotation = 0.0         # type: float | ||||
|     _dose = 1.0             # type: float | ||||
|     _scale = 1.0            # type: float | ||||
|     _mirrored = None        # type: List[bool] | ||||
| 
 | ||||
|     def __init__(self, | ||||
|                  pattern: 'Pattern', | ||||
|                  offset: vector2=(0.0, 0.0), | ||||
|                  rotation: float=0.0, | ||||
|                  mirrored: List[bool]=None, | ||||
|                  dose: float=1.0, | ||||
|                  scale: float=1.0): | ||||
|         self.pattern = pattern | ||||
| @ -38,6 +40,9 @@ class SubPattern: | ||||
|         self.rotation = rotation | ||||
|         self.dose = dose | ||||
|         self.scale = scale | ||||
|         if mirrored is None: | ||||
|             mirrored = [False, False] | ||||
|         self.mirrored = mirrored | ||||
| 
 | ||||
|     # offset property | ||||
|     @property | ||||
| @ -90,6 +95,17 @@ class SubPattern: | ||||
|             raise PatternError('Rotation must be a scalar') | ||||
|         self._rotation = val % (2 * pi) | ||||
| 
 | ||||
|     # Mirrored property | ||||
|     @property | ||||
|     def mirrored(self) -> List[bool]: | ||||
|         return self._mirrored | ||||
| 
 | ||||
|     @mirrored.setter | ||||
|     def mirrored(self, val: List[bool]): | ||||
|         if is_scalar(val): | ||||
|             raise PatternError('Mirrored must be a 2-element list of booleans') | ||||
|         self._mirrored = val | ||||
| 
 | ||||
|     def as_pattern(self) -> 'Pattern': | ||||
|         """ | ||||
|         Returns a copy of self.pattern which has been scaled, rotated, etc. according to this | ||||
| @ -98,6 +114,7 @@ class SubPattern: | ||||
|         """ | ||||
|         pattern = self.pattern.copy() | ||||
|         pattern.scale_by(self.scale) | ||||
|         [pattern.mirror(ax) for ax, do in enumerate(self.mirrored) if do] | ||||
|         pattern.rotate_around((0.0, 0.0), self.rotation) | ||||
|         pattern.translate_elements(self.offset) | ||||
|         pattern.scale_element_doses(self.dose) | ||||
| @ -138,6 +155,16 @@ class SubPattern: | ||||
|         self.rotation += rotation | ||||
|         return self | ||||
| 
 | ||||
|     def mirror(self, axis: int) -> 'SubPattern': | ||||
|         """ | ||||
|         Mirror the subpattern across an axis. | ||||
| 
 | ||||
|         :param axis: Axis to mirror across. | ||||
|         :return: self | ||||
|         """ | ||||
|         self.mirrored[axis] = not self.mirrored[axis] | ||||
|         return self | ||||
| 
 | ||||
|     def get_bounds(self) -> numpy.ndarray or None: | ||||
|         """ | ||||
|         Return a numpy.ndarray containing [[x_min, y_min], [x_max, y_max]], corresponding to the | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user