def test_copy_transform(proof_cells): ref_cell1 = gdstk.Cell("Reference 1") ref_cell1.add(*gdstk.text("F.", 10, (0, 0))) ref_cell1.add(gdstk.Label("LaBeL", (2.4, 8.7), "s")) ref_cell1.add( gdstk.FlexPath(8 + 4j, 1, simple_path=True, layer=3).arc(2, 0, numpy.pi / 2)) ref_cell1.add( gdstk.RobustPath(7.5 + 7j, 1, simple_path=True, layer=4).bezier([-2 + 1j, -2 + 3j, 4j, 6j, -3 + 6j], relative=True)) ref_cell2 = gdstk.Cell("Reference 2") ref_cell2.add(*gdstk.text("^", 10, (0, 5), layer=1)) ref_cell2.add(gdstk.Reference(ref_cell1)) cell = gdstk.Cell("Original cell") cell.add(gdstk.rectangle((-1, -0.5), (1, 0.5), layer=2)) cell.add(gdstk.Reference(ref_cell2)) cell.add(gdstk.Reference(ref_cell1, (10, 7), numpy.pi / 4, 0.5, True)) cell.add( gdstk.Reference(ref_cell1, (-7, 15), -numpy.pi / 3, 0.5, True, 3, 2, (5, 4))) cell.add( gdstk.Reference(ref_cell2, (-7, 23), numpy.pi / 3, 0.5, True, 3, 2, (5, 8))) cell_copy = cell.copy("Cell.copy", (-10, -10), numpy.pi / 2, 2, True).flatten() for path in cell_copy.paths: cell_copy.add(*path.to_polygons()) assert_same_shape(proof_cells["Cell.copy"].polygons, cell_copy.polygons)
def test_fracture(): poly = gdstk.racetrack((0, 0), 10, 20, 1, vertical=False) frac = poly.fracture(12, 1e-3) assert_same_shape(poly, frac, 2e-3) poly = gdstk.racetrack((0, 50), 10, 20, 1, vertical=True) frac = poly.fracture(12, 1e-3) assert_same_shape(poly, frac, 2e-3)
def test_fillet(proof_cells): p1 = gdstk.Polygon([(0, 0), (1.2, 0), (1.2, 0.3), (1, 0.3), (1.5, 1), (0, 1.5)]) p2 = p1.copy().translate(2, 0) p1.fillet(0.3, tolerance=1e-3) p2.fillet([0.3, 0, 0.1, 0, 0.5, 10], tolerance=1e-3) assert_same_shape(proof_cells["Polygon.fillet"].polygons, [p1, p2], 2e-3)
def test_transforms(proof_cells): for scale_width in [True, False]: path0 = gdstk.FlexPath( ( 0j, 1j, 0.5 + 1j, ), [0.1, 0.2], 0.3, tolerance=1e-4, scale_width=scale_width, ) path0.turn(0.4, -numpy.pi, [0.2, 0.1]).segment((-0.2, 0), relative=True) paths = [ path0, path0.copy().mirror((1.5, 0)), path0.copy().mirror((1.5, 0), (1.5, 1)), path0.copy().scale(2, (3, 0)), path0.copy().scale(-2, (-1, 0)), path0.copy().rotate(numpy.pi / 2, (2, 1)).translate(0.2, -0.3), ] assert_same_shape( proof_cells[f"FlexPath: scale_width {scale_width}"].polygons, paths)
def test_notempty(): name = "ca_notempty" c = gdstk.Cell(name) ref = gdstk.Reference(c, (1, -1), numpy.pi / 2, 2, True, 2, 3, (3, 2)) ref.origin = (0, 0) c.add(gdstk.rectangle((0, 0), (1, 2), 2, 3)) assert_close(ref.bounding_box(), ((0, 0), (8, 5))) assert_same_shape( [gdstk.rectangle((0, 0), (8, 2)), gdstk.rectangle((0, 3), (8, 5))], gdstk.Cell("TMP").add(ref).flatten().polygons, )
def test_gds_array(tmpdir): lib = gdstk.Library("Library") ref_cell = lib.new_cell("Base") ref_cell.add(*gdstk.text("F", 1, (0, 0))) for rect in (True, False): for cols in (1, 3): for rows in (1, 3): if cols * rows == 1: continue for dx in (-3, 0, 3): for dy in (-4, 0, 4): if rect: rep = gdstk.Repetition(columns=cols, rows=rows, spacing=(dx, dy)) else: rep = gdstk.Repetition(columns=cols, rows=rows, v1=(dx, 0), v2=(0, dy)) for rot in range(-3, 4): for refl in (True, False): cell = lib.new_cell( f"{'RECT' if rect else 'REGL'}" f"_{cols}_{rows}_{dx}_{dy}" f"_{rot}{'_X' if refl else ''}") ref = gdstk.Reference( ref_cell, (-0.5, -1), 0.5 * numpy.pi * rot, x_reflection=refl, ) ref.repetition = rep cell.add(ref) fname = str(tmpdir.join("aref_test.gds")) lib.write_gds(fname) lib2 = gdstk.read_gds(fname) cell_dict = {cell.name: cell for cell in lib.cells} for cell in lib2.cells: if len(cell.references) == 0: continue assert len(cell.references) == 1 assert cell.references[0].repetition.size > 1 assert cell.name in cell_dict polygons1 = cell_dict[cell.name].get_polygons() polygons2 = cell.get_polygons() assert len(polygons1) == len(polygons2) assert_same_shape(polygons1, polygons2)