Source code for gdsfactory.geometry.invert

"""Based on phidl.geometry."""

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.geometry.boolean import boolean
from gdsfactory.typings import LayerSpec


[docs] @gf.cell def invert( elements, border: float = 10.0, precision: float = 1e-4, layer: LayerSpec = (1, 0), ) -> Component: """Returns inverted version of input shapes with additional border around the edges. Args: elements : Component(/Reference), list of Component(/Reference), or Polygon \ A Component containing the polygons to invert. border: Size of the border around the inverted shape (border value is the \ distance from the edges of the boundary box defining the inverted \ shape to the border, and is applied to all 4 sides of the shape). precision: Desired precision for rounding vertex coordinates. layer: Specific layer(s) to put polygon geometry on. Returns Component with inverted version of the input shape(s) and the border(s). .. plot:: :include-source: import gdsfactory as gf e1 = gf.components.ellipse(radii=(6, 6)) c = gf.geometry.invert(e1) c.plot_matplotlib() """ Temp = Component() if not isinstance(elements, list | tuple): elements = [elements] for e in elements: if isinstance(e, Component): Temp.add_ref(e) else: Temp.add(e) gds_layer, gds_datatype = gf.get_layer(layer) # Build the rectangle around the Component D R = gf.components.rectangle( size=(Temp.xsize + 2 * border, Temp.ysize + 2 * border), centered=True ).ref() R.center = Temp.center return boolean( A=R, B=Temp, operation="A-B", precision=precision, layer=layer, )
def test_invert() -> None: e1 = gf.components.ellipse(radii=(6, 6)) c = invert(e1) assert int(c.area()) == 910 if __name__ == "__main__": # test_invert() e1 = gf.components.ellipse(radii=(6, 6)) c = invert(e1) c.show(show_ports=True)