Source code for gdsfactory.geometry.xor_diff

from __future__ import annotations

import gdstk

import gdsfactory as gf
from gdsfactory.component import Component


[docs] @gf.cell def xor_diff(A, B, precision: float = 1e-4) -> Component: """Given two Components A and B, performs the layer-by-layer XOR difference \ between A and B and returns polygons representing the differences between A \ and B. gdsfactory wrapper for phidl.geometry.xor_diff Args: A: Component(/Reference) or list of Component(/References). B: Component(/Reference) or list of Component(/References). precision: Desired precision for rounding vertex coordinates. Returns Component: containing a polygon(s) defined by the XOR difference result between A and B. """ D = Component() A_polys = A.get_polygons(by_spec=True) B_polys = B.get_polygons(by_spec=True) A_layers = A_polys.keys() B_layers = B_polys.keys() all_layers = set() all_layers.update(A_layers) all_layers.update(B_layers) for layer in all_layers: if (layer in A_layers) and (layer in B_layers): p = gdstk.boolean( operand1=A_polys[layer], operand2=B_polys[layer], operation="xor", precision=precision, layer=layer[0], datatype=layer[1], ) elif layer in A_layers: p = A_polys[layer] elif layer in B_layers: p = B_polys[layer] if p is not None: for polygon in p: D.add_polygon(polygon, layer=layer) return D
if __name__ == "__main__": e1 = gf.components.ellipse(radii=(6, 6)) e2 = gf.components.ellipse(radii=(10, 4)) c = xor_diff(A=e1, B=e2) c.show(show_ports=True)