Add shapes.Polygon.rect() for simpler construction of various axis-aligned rectangles
This commit is contained in:
parent
ef305cbac9
commit
eb6a5d8e8c
@ -130,6 +130,81 @@ class Polygon(Shape):
|
|||||||
poly.rotate(rotation)
|
poly.rotate(rotation)
|
||||||
return poly
|
return poly
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def rect(xmin: float = None,
|
||||||
|
xctr: float = None,
|
||||||
|
xmax: float = None,
|
||||||
|
lx: float = None,
|
||||||
|
ymin: float = None,
|
||||||
|
yctr: float = None,
|
||||||
|
ymax: float = None,
|
||||||
|
ly: float = None,
|
||||||
|
layer: int = 0,
|
||||||
|
dose: float = 1.0
|
||||||
|
) -> 'Polygon':
|
||||||
|
"""
|
||||||
|
Draw a rectangle by specifying side/center positions.
|
||||||
|
|
||||||
|
Must provide 2 of (xmin, xctr, xmax, lx),
|
||||||
|
and 2 of (ymin, yctr, ymax, ly).
|
||||||
|
|
||||||
|
:param xmin: Minimum x coordinate
|
||||||
|
:param xctr: Center x coordinate
|
||||||
|
:param xmax: Maximum x coordinate
|
||||||
|
:param lx: Length along x direction
|
||||||
|
:param ymin: Minimum y coordinate
|
||||||
|
:param yctr: Center y coordinate
|
||||||
|
:param ymax: Maximum y coordinate
|
||||||
|
:param yx: Length along y direction
|
||||||
|
:param layer: Layer, default 0
|
||||||
|
:param dose: Dose, default 1.0
|
||||||
|
:return: A Polygon object containing the requested rectangle
|
||||||
|
"""
|
||||||
|
if lx is None:
|
||||||
|
if xctr is None:
|
||||||
|
xctr = 0.5 * (xmax + xmin)
|
||||||
|
lx = xmax - xmin
|
||||||
|
elif xmax is None:
|
||||||
|
lx = 2 * (xctr - xmin)
|
||||||
|
elif xmin is None:
|
||||||
|
lx = 2 * (xmax - xctr)
|
||||||
|
else:
|
||||||
|
raise PatternError('Two of xmin, xctr, xmax, lx must be None!')
|
||||||
|
else:
|
||||||
|
if xctr is not None:
|
||||||
|
pass
|
||||||
|
elif xmax is None:
|
||||||
|
xctr = xmin + 0.5 * lx
|
||||||
|
elif xmin is None:
|
||||||
|
xctr = xmax - 0.5 * lx
|
||||||
|
else:
|
||||||
|
raise PatternError('Two of xmin, xctr, xmax, lx must be None!')
|
||||||
|
|
||||||
|
if ly is None:
|
||||||
|
if yctr is None:
|
||||||
|
yctr = 0.5 * (ymax + ymin)
|
||||||
|
ly = ymax - ymin
|
||||||
|
elif ymax is None:
|
||||||
|
ly = 2 * (yctr - ymin)
|
||||||
|
elif ymin is None:
|
||||||
|
ly = 2 * (ymax - yctr)
|
||||||
|
else:
|
||||||
|
raise PatternError('Two of ymin, yctr, ymax, ly must be None!')
|
||||||
|
else:
|
||||||
|
if yctr is not None:
|
||||||
|
pass
|
||||||
|
elif ymax is None:
|
||||||
|
yctr = ymin + 0.5 * ly
|
||||||
|
elif ymin is None:
|
||||||
|
yctr = ymax - 0.5 * ly
|
||||||
|
else:
|
||||||
|
raise PatternError('Two of ymin, yctr, ymax, ly must be None!')
|
||||||
|
|
||||||
|
poly = Polygon.rectangle(lx, ly, offset=(xctr, yctr),
|
||||||
|
layer=layer, dose=dose)
|
||||||
|
return poly
|
||||||
|
|
||||||
|
|
||||||
def to_polygons(self,
|
def to_polygons(self,
|
||||||
_poly_num_points: int=None,
|
_poly_num_points: int=None,
|
||||||
_poly_max_arclen: float=None,
|
_poly_max_arclen: float=None,
|
||||||
|
Loading…
Reference in New Issue
Block a user