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

This commit is contained in:
jan 2022-07-07 16:06:06 -07:00
parent 599723e470
commit 9c20960e62
2 changed files with 25 additions and 16 deletions

View File

@ -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,

View File

@ -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,