round().astype() -> rint(...)

libzoo
jan 2 years ago
parent 599723e470
commit 9c20960e62

@ -53,6 +53,10 @@ path_cap_map = {
} }
def rint_cast(val: ArrayLike) -> NDArray[numpy.int32]:
return numpy.rint(val, dtype=numpy.int32, casting='unsafe')
def write( def write(
patterns: Union[Pattern, Sequence[Pattern]], patterns: Union[Pattern, Sequence[Pattern]],
stream: BinaryIO, stream: BinaryIO,
@ -392,8 +396,8 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library.
] ]
aref = klamath.library.Reference( aref = klamath.library.Reference(
struct_name=encoded_name, struct_name=encoded_name,
xy=numpy.round(xy).astype(int), xy=rint_cast(xy),
colrow=(numpy.round(rep.a_count), numpy.round(rep.b_count)), colrow=(numpy.rint(rep.a_count), numpy.rint(rep.b_count)),
angle_deg=angle_deg, angle_deg=angle_deg,
invert_y=mirror_across_x, invert_y=mirror_across_x,
mag=subpat.scale, mag=subpat.scale,
@ -403,7 +407,7 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library.
elif rep is None: elif rep is None:
ref = klamath.library.Reference( ref = klamath.library.Reference(
struct_name=encoded_name, struct_name=encoded_name,
xy=numpy.round([subpat.offset]).astype(int), xy=rint_cast([subpat.offset]),
colrow=None, colrow=None,
angle_deg=angle_deg, angle_deg=angle_deg,
invert_y=mirror_across_x, invert_y=mirror_across_x,
@ -414,7 +418,7 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library.
else: else:
new_srefs = [klamath.library.Reference( new_srefs = [klamath.library.Reference(
struct_name=encoded_name, struct_name=encoded_name,
xy=numpy.round([subpat.offset + dd]).astype(int), xy=rint_cast([subpat.offset + dd]),
colrow=None, colrow=None,
angle_deg=angle_deg, angle_deg=angle_deg,
invert_y=mirror_across_x, invert_y=mirror_across_x,
@ -462,8 +466,8 @@ def _shapes_to_elements(
layer, data_type = _mlayer2gds(shape.layer) layer, data_type = _mlayer2gds(shape.layer)
properties = _annotations_to_properties(shape.annotations, 128) properties = _annotations_to_properties(shape.annotations, 128)
if isinstance(shape, Path) and not polygonize_paths: if isinstance(shape, Path) and not polygonize_paths:
xy = numpy.round(shape.vertices + shape.offset).astype(int) xy = rint_cast(shape.vertices + shape.offset)
width = numpy.round(shape.width).astype(int) width = rint_cast(shape.width)
path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup
extension: Tuple[int, int] extension: Tuple[int, int]
@ -511,7 +515,7 @@ def _labels_to_texts(labels: List[Label]) -> List[klamath.elements.Text]:
for label in labels: for label in labels:
properties = _annotations_to_properties(label.annotations, 128) properties = _annotations_to_properties(label.annotations, 128)
layer, text_type = _mlayer2gds(label.layer) layer, text_type = _mlayer2gds(label.layer)
xy = numpy.round([label.offset]).astype(int) xy = rint_cast([label.offset])
text = klamath.elements.Text( text = klamath.elements.Text(
layer=(layer, text_type), layer=(layer, text_type),
xy=xy, xy=xy,

@ -22,6 +22,7 @@ import pathlib
import gzip import gzip
import numpy import numpy
from numpy.typing import ArrayLike, NDArray
import fatamorgana import fatamorgana
import fatamorgana.records as fatrec import fatamorgana.records as fatrec
from fatamorgana.basic import PathExtensionScheme, AString, NString, PropStringReference from fatamorgana.basic import PathExtensionScheme, AString, NString, PropStringReference
@ -47,6 +48,10 @@ path_cap_map = {
#TODO implement more shape types? #TODO implement more shape types?
def rint_cast(val: ArrayLike) -> NDArray[numpy.int64]:
return numpy.rint(val, dtype=numpy.int64, casting='unsafe')
def build( def build(
patterns: Union[Pattern, Sequence[Pattern]], patterns: Union[Pattern, Sequence[Pattern]],
units_per_micron: int, units_per_micron: int,
@ -535,7 +540,7 @@ def _subpatterns_to_placements(
mirror_across_x, extra_angle = normalize_mirror(subpat.mirrored) mirror_across_x, extra_angle = normalize_mirror(subpat.mirrored)
frep, rep_offset = repetition_masq2fata(subpat.repetition) frep, rep_offset = repetition_masq2fata(subpat.repetition)
offset = numpy.round(subpat.offset + rep_offset).astype(int) offset = rint_cast(subpat.offset + rep_offset)
angle = numpy.rad2deg(subpat.rotation + extra_angle) % 360 angle = numpy.rad2deg(subpat.rotation + extra_angle) % 360
ref = fatrec.Placement( ref = fatrec.Placement(
name=subpat.pattern.name, name=subpat.pattern.name,
@ -563,8 +568,8 @@ def _shapes_to_elements(
repetition, rep_offset = repetition_masq2fata(shape.repetition) repetition, rep_offset = repetition_masq2fata(shape.repetition)
properties = annotations_to_properties(shape.annotations) properties = annotations_to_properties(shape.annotations)
if isinstance(shape, Circle): if isinstance(shape, Circle):
offset = numpy.round(shape.offset + rep_offset).astype(int) offset = rint_cast(shape.offset + rep_offset)
radius = numpy.round(shape.radius).astype(int) radius = rint_cast(shape.radius)
circle = fatrec.Circle( circle = fatrec.Circle(
layer=layer, layer=layer,
datatype=datatype, datatype=datatype,
@ -576,9 +581,9 @@ def _shapes_to_elements(
) )
elements.append(circle) elements.append(circle)
elif isinstance(shape, Path): elif isinstance(shape, Path):
xy = numpy.round(shape.offset + shape.vertices[0] + rep_offset).astype(int) xy = rint_cast(shape.offset + shape.vertices[0] + rep_offset)
deltas = numpy.round(numpy.diff(shape.vertices, axis=0)).astype(int) deltas = rint_cast(numpy.diff(shape.vertices, axis=0))
half_width = numpy.round(shape.width / 2).astype(int) half_width = rint_cast(shape.width / 2)
path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup
extension_start = (path_type, shape.cap_extensions[0] if shape.cap_extensions is not None else None) extension_start = (path_type, shape.cap_extensions[0] if shape.cap_extensions is not None else None)
extension_end = (path_type, shape.cap_extensions[1] if shape.cap_extensions is not None else None) extension_end = (path_type, shape.cap_extensions[1] if shape.cap_extensions is not None else None)
@ -597,8 +602,8 @@ def _shapes_to_elements(
elements.append(path) elements.append(path)
else: else:
for polygon in shape.to_polygons(): for polygon in shape.to_polygons():
xy = numpy.round(polygon.offset + polygon.vertices[0] + rep_offset).astype(int) xy = rint_cast(polygon.offset + polygon.vertices[0] + rep_offset)
points = numpy.round(numpy.diff(polygon.vertices, axis=0)).astype(int) points = rint_cast(numpy.diff(polygon.vertices, axis=0))
elements.append(fatrec.Polygon( elements.append(fatrec.Polygon(
layer=layer, layer=layer,
datatype=datatype, datatype=datatype,
@ -619,7 +624,7 @@ def _labels_to_texts(
for label in labels: for label in labels:
layer, datatype = layer2oas(label.layer) layer, datatype = layer2oas(label.layer)
repetition, rep_offset = repetition_masq2fata(label.repetition) repetition, rep_offset = repetition_masq2fata(label.repetition)
xy = numpy.round(label.offset + rep_offset).astype(int) xy = rint_cast(label.offset + rep_offset)
properties = annotations_to_properties(label.annotations) properties = annotations_to_properties(label.annotations)
texts.append(fatrec.Text( texts.append(fatrec.Text(
layer=layer, layer=layer,

Loading…
Cancel
Save