def test_move(): # Test polygon move D = Device() p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)]) p.move([1.7, 0.8]) h = D.hash_geometry(precision=1e-4) assert (h == '57a86bce5f60f7bc78c7c30473a544b736d2afb3') p.movex(13.9) h = D.hash_geometry(precision=1e-4) assert (h == '8fe6706e05ebe1512ee2efe2582546b949fbc48f') p.movey(19.2) h = D.hash_geometry(precision=1e-4) assert (h == '7df43241eca2dd11f267c25876e650eadaca7d9f') # Test Device move D = Device() D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)]) D.add_polygon([(8, 6, 7, 9, 7, 0), (6, 8, 9, 5, 7, 0)]) D.move([1.7, 0.8]) h = D.hash_geometry(precision=1e-4) assert (h == 'c863156dd00a590dc02823e1791554d4142b1ea9') # Test label move D = Device() D.add_polygon([(8, 8, 8, 8), (6, 6, 6, 6)]) l = D.add_label('testing', position=D.center) print(all(l.center == D.center)) D.rotate(45) print(np.allclose(l.center, D.center)) D.move([70000.5, 30000.5]) print(np.allclose(l.center, D.center)) D.rotate(75) print(np.allclose(l.center, D.center)) D.mirror([7, 5]) print(np.allclose(l.center, D.center))
def test_group(): # Test all types D = Device() E1 = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=0) E2 = pg.rectangle(size=(4, 2), layer=0).movex(15) e1 = D << E1 e2 = D << E2 e3 = D << E2 e4 = D.add_label('hello', position=(1.5, -1.5)) e5 = pg.snspd() e6 = D.add_polygon([(8, 6, 7, 9, 7, 0), (6, 8, 9, 5, 7, 0)]) e7 = D.add_array(pg.cross()) e2verify = D << E2 # Test creation and addition G = Group() G.add(e1) G.add(e2) G.add([e3, e4, e5]) G += (e6, e7) assert np.allclose(G.bbox.flatten(), np.array([-10., -8.5, 105., 105.])) # Test movement G.move((2, 7)) e2verify.move((2, 7)) assert np.allclose(G.bbox.flatten(), np.array([-8., -1.5, 107., 112.])) assert all(e2.center == e2verify.center) assert e2.rotation == e2verify.rotation # Test rotation G.rotate(90, center=(5, 5)) e2verify.rotate(90, center=(5, 5)) assert np.allclose(G.bbox.flatten(), np.array([-102., -8., 11.5, 107.])) assert all(e2.center == e2verify.center) assert e2.rotation == e2verify.rotation # Test mirroring G.mirror(p1=(1, 1), p2=(-1, 1)) e2verify.mirror(p1=(1, 1), p2=(-1, 1)) assert np.allclose(G.bbox.flatten(), np.array([-102., -105., 11.5, 10.])) assert all(e2.center == e2verify.center) assert e2.rotation == e2verify.rotation h = D.hash_geometry(precision=1e-4) assert (h == '3964acb3971771c6e70ceb587c2ae8b37f2ed112')
# The function text() creates a Device, just like waveguide. Use it and # manipulate it like any other Device t = D2.add_ref(pg.text('Hello\nworld!', size=10, justify='center')) t.move([0, 40]).rotate(45) qp(D2) #============================================================================== # Labeling #============================================================================== # We can also label (annotate) our devices, in order to record information # directly into the final GDS file without putting any extra geometry onto any # layer # This label will display in a GDS viewer, but will not be rendered # or printed like the polygons created by the text() D2.add_label(text='First label', position=mwg1.center) D2.add_label('Second label', mwg2.center) # It's very useful for recording information about the devices or layout D2.add_label(text='The x size of this\nlayout is %s' % D2.xsize, position=(D2.xmax, D2.ymax), layer=255) # Again, note we have to write the GDS for it to be visible (view in KLayout) D2.write_gds('MultiMultiWaveguideWithLabels.gds') #============================================================================== # Saving the file as a .gds #============================================================================== D2.write_gds('MultiMultiWaveguideTutorial.gds')