Source code for gdsfactory.components.text
from __future__ import annotations
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",
layers: LayerSpecs | None = None,
) -> Component:
"""Text shapes.
Args:
text: string.
size: in um.
position: x, y position.
justify: left, right, center.
layer: for the text.
layers: optional for duplicating the text.
"""
scaling = size / 1000
xoffset = position[0]
yoffset = position[1]
t = gf.Component()
layers = layers or [layer]
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
for layer in layers:
label.add_polygon([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.references:
if justify == "left":
label.xmin = position[0]
elif justify == "right":
label.xmax = position[0]
elif justify == "center":
label.move(origin=label.center, destination=position, axis="x")
else:
raise ValueError(
f"justify = {justify!r} not in ('center', 'right', 'left')"
)
return t.flatten()
[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.movey(-6 * size * (i + 1))
return c
if __name__ == "__main__":
# c1 = gf.components.text("hello", size=10, layer=(1, 0))
# c2 = gf.components.text("10.0")
c = text(
text=".[,ABCDEFGHIKKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789:/",
size=4.0,
justify="right",
position=(0, 0),
layers=[(1, 0), (2, 0)],
)
# c = text_lines(text=["a", "b"], size=10)
# c = text_lines()
# c2.show(show_ports=True)
# c.plot()
c.show()