Source code for gdsfactory.geometry.trim
"""Trim component.
Adapted from PHIDL https://github.com/amccaugh/phidl/ by Adam McCaughan
"""
from __future__ import annotations
import gdstk
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.component_layout import _parse_layer
[docs]
@gf.cell
def trim(
component: Component,
domain: list[tuple[float, float]],
precision: float = 1e-4,
return_ports: bool | None = False,
) -> Component:
"""Trim a component by another geometry, preserving the component's layers and ports.
Useful to get a smaller component from a larger one for simulation.
Args:
component: Component(/Reference).
domain: list of array-like[N][2] representing the boundary of the component to keep.
precision: float Desired precision for rounding vertex coordinates.
return_ports: whether to return the included ports or not. Ports are always renamed to avoid inheritance conflicts.
Returns: New component with layers (and possibly ports) of the component restricted to the domain.
.. plot::
:include-source:
import gdsfactory as gf
c = gf.components.straight_pin(length=10, taper=None)
trimmed_c = gf.geometry.trim(component=c, domain=[[0, -5], [0, 5], [5, 5], [5, -5]])
trimmed_c.plot_matplotlib()
"""
domain_shape = gdstk.Polygon(domain)
c = Component()
for layer, layer_polygons in component.get_polygons(by_spec=True).items():
gds_layer, gds_datatype = _parse_layer(layer)
for layer_polygon in layer_polygons:
p = gdstk.boolean(
operand1=gdstk.Polygon(layer_polygon),
operand2=domain_shape,
operation="and",
precision=precision,
layer=gds_layer,
datatype=gds_datatype,
)
if p:
c.add_polygon(p, layer=layer)
if return_ports:
ports = []
i = 0
for port in component.get_ports():
if gdstk.inside([port.center], domain_shape):
new_name = f"{port.name[:1]}{i}"
ports.append(port.copy(new_name))
i += 1
c.add_ports(ports)
c.auto_rename_ports_layer_orientation()
return c
if __name__ == "__main__":
c = gf.components.straight_pin(length=10, taper=None)
trimmed_c = trim(component=c, domain=[[0, -5], [0, 5], [5, 5], [5, -5]])
trimmed_c.show(show_ports=True)