Source code for fibomat.raster_styles.two_d.linebyline

"""Provide LineByLine raster style."""

import numpy as np

from fibomat.rasterizedpattern import RasterizedPattern
from fibomat.raster_styles.rasterstyle import RasterStyle
from fibomat.units import LengthUnit, TimeUnit, LengthQuantity, has_length_dim, scale_to, scale_factor
from fibomat.mill import Mill
from fibomat.shapes import Shape, RasterizedPoints, DimShape
from fibomat.raster_styles.scansequence import ScanSequence, _make_scan_index_sequence, _apply_scan_sequence
from fibomat.raster_styles.one_d import Curve
from fibomat.curve_tools import fill_with_lines, rasterize
from fibomat.shapes._line_non_continuous import LineNonContinuous


[docs]class LineByLine(RasterStyle):
[docs] def __init__( self, line_pitch: LengthQuantity, scan_sequence: ScanSequence, alpha: float, invert: bool, line_style: RasterStyle ): if not has_length_dim(line_pitch): raise ValueError('line_pitch must have dimension [length].') self._line_pitch = line_pitch self._alpha = alpha self._invert = invert self._scan_sequence = scan_sequence if line_style.dimension != 1: raise ValueError('line_style must have dimension == 1') # if not line_style.scan_sequence == ScanSequence.CONSECUTIVE: # raise NotImplementedError self._line_style = line_style
def __repr__(self): return '{}(line_pitch={!r}, alpha={!r}, invert={!r}, scan_sequence={!r}, line_style={!r})'.format(self.__class__.__name__, self._line_pitch, self._alpha, self._invert, self._scan_sequence, self._line_style) @property def dimension(self) -> int: return 2 @property def line_pitch(self): return self._line_pitch @property def scan_sequence(self): return self._scan_sequence @property def alpha(self): return self._alpha @property def invert(self): return self._invert @property def line_style(self): return self._line_style
[docs] def rasterize( self, dim_shape: DimShape, mill: Mill, out_length_unit: LengthUnit, out_time_unit: TimeUnit ) -> RasterizedPattern: # dim_shape = DimObj.create(dim_shape) filling_rows = fill_with_lines( dim_shape.shape.to_arc_spline(), scale_to(dim_shape.unit, self._line_pitch), self._alpha, self._invert ) return _apply_scan_sequence( filling_rows=[LineNonContinuous(row) for row in filling_rows], filling_rows_length_unit=dim_shape.unit, scan_sequence=self._scan_sequence, line_style=self._line_style, mill=mill, out_length_unit=out_length_unit, out_time_unit=out_time_unit )
# rasterized_lines = [] # # if self._scan_sequence == ScanSequence.CROSSECTION: # line_mill = mill # else: # line_mill = Mill(mill.dwell_time, repeats=1) # # # line_mill = mill # # else: # # line_mill = Mill(mill.dwell_time, repeats=1) # # for row in filling_rows: # # rasterized_row = [] # # row = LineNonContinuous(row) # # #for line in row: # rasterized_lines.append( # self._line_style.rasterize( # (row, dim_shape.unit), # mill=line_mill, # out_length_unit=out_length_unit, # out_time_unit=out_time_unit # ).dwell_points # ) # # # rasterized_lines.append(rasterized_row)) # # scan_lines = [] # # for index, direction in zip(*_make_scan_index_sequence(len(rasterized_lines), mill.repeats, self._scan_sequence)): # if not direction: # scan_lines.append(rasterized_lines[index][::-1]) # else: # scan_lines.append(rasterized_lines[index]) # # # points = np.concatenate(scan_lines) # # # points._dwell_points[:, :2] *= scale_factor(out_length_unit, dim_shape.unit) # # points._dwell_points[:, 2] = scale_to(out_time_unit, mill.dwell_time) # # # scan_sequence_indices # # return RasterizedPattern(np.concatenate(scan_lines), out_length_unit, out_time_unit)