Files
common/packages/pyscan/positioner/serial.py
2025-01-07 12:38:15 +01:00

41 lines
1.5 KiB
Python

from copy import copy
from pyscan.utils import convert_to_list
class SerialPositioner(object):
"""
Scan over all provided points, one by one, returning the previous to the initial state.
Each axis is treated as a separate line.
"""
def __init__(self, positions, initial_positions, passes=1, offsets=None):
self.positions = positions
self.passes = passes
self.offsets = offsets
if passes < 1:
raise ValueError("Number of passes cannot be less than 1, but %d was provided." % passes)
self.initial_positions = initial_positions
self.n_axis = len(self.initial_positions)
# In case only 1 axis is provided, still wrap it in a list, because it makes the generator code easier.
if self.n_axis == 1:
self.positions = [positions]
# Fix the offset if provided.
if self.offsets:
for axis_positions, offset in zip(self.positions, self.offsets):
axis_positions[:] = [original_position + offset for original_position in axis_positions]
def get_generator(self):
for _ in range(self.passes):
# For each axis.
for axis_index in range(self.n_axis):
current_state = copy(self.initial_positions)
n_steps_in_axis = len(self.positions[axis_index])
for axis_position_index in range(n_steps_in_axis):
current_state[axis_index] = convert_to_list(self.positions[axis_index])[axis_position_index]
yield copy(current_state)