Source code for gdsfactory.components.text

from __future__ import annotations

import kfactory as kf
import numpy as np

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.text_rectangular import text_rectangular
from gdsfactory.constants import _glyph, _indent, _width
from gdsfactory.typings import Coordinate, LayerSpec, LayerSpecs


[docs] @gf.cell def text( text: str = "abcd", size: float = 10.0, position: Coordinate = (0, 0), justify: str = "left", layer: LayerSpec = "WG", ) -> Component: """Text shapes. Args: text: string. size: in um. position: x, y position. justify: left, right, center. layer: for the text. """ scaling = size / 1000 xoffset = position[0] yoffset = position[1] t = gf.Component() for line in text.split("\n"): label = gf.Component() for c in line: ascii_val = ord(c) if c == " ": xoffset += 500 * scaling elif 33 <= ascii_val <= 126: for poly in _glyph[ascii_val]: xpts = np.array(poly)[:, 0] * scaling ypts = np.array(poly)[:, 1] * scaling label.add_polygon( list(zip(xpts + xoffset, ypts + yoffset)), layer=layer ) xoffset += (_width[ascii_val] + _indent[ascii_val]) * scaling else: raise ValueError(f"No character with ascii value {ascii_val!r}") t.add_ref(label) yoffset -= 1500 * scaling xoffset = position[0] justify = justify.lower() for label in t.insts: if justify == "left": pass elif justify == "right": label.dxmax = position[0] elif justify == "center": xmin = position[0] - label.dxsize / 2 label.dxmin = xmin else: raise ValueError( f"justify = {justify!r} not in ('center', 'right', 'left')" ) t.flatten() return t
[docs] @gf.cell def text_lines( text: tuple[str, ...] = ("Chip", "01"), size: float = 0.4, layer: LayerSpec = "WG", ) -> Component: """Returns a Component from a text lines. Args: text: list of strings. size: text size. layer: text layer. """ c = gf.Component() for i, texti in enumerate(text): t = text_rectangular(text=texti, size=size, layer=layer) tref = c.add_ref(t) tref.dmovey(-6 * size * (i + 1)) return c
[docs] @gf.cell def text_klayout( text: str = "a", layer: LayerSpec = "WG", layers: LayerSpecs | None = None, bbox_layers: LayerSpecs | None = None, ) -> Component: """Returns a text component. Args: text: string. layer: text layer. layers: layers for the text. bbox_layers: layers for the text bounding box. """ c = gf.Component() gen = kf.kdb.TextGenerator.default_generator() layers = layers or [layer] for layer in layers: layer = gf.get_layer(layer) reg = gen.text(text, kf.kcl.dbu) c.shapes(layer).insert(reg) for layer in bbox_layers or []: layer = gf.get_layer(layer) c.shapes(layer).insert(reg.bbox()) return c
if __name__ == "__main__": # c1 = gf.components.text("hello", size=10, layer=(1, 0)) # c2 = gf.components.text("10.0") c = text_klayout( text=".[,ABCDEFGHIKKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789:/", # size=4.0, # justify="center", bbox_layers=("M3",), # position=(0, 0), ) # c = text_lines(text=("a", "b"), size=10) # c = logo() # c2.show( ) # c.plot() c.show()