Source code for pymodaq_gui.plotting.utils.axes_viewer

# -*- coding: utf-8 -*-
"""
Created the 26/01/2023

@author: Sebastien Weber
"""
from typing import List

from qtpy import QtWidgets, QtCore

from pymodaq_gui.plotting.data_viewers.viewer1Dbasic import Viewer1DBasic
from pymodaq_data.data import Axis
from pymodaq_utils.math_utils import find_index


[docs] class AxesViewer(QtCore.QObject): navigation_changed = QtCore.Signal() def __init__(self, parent_widget: QtWidgets.QWidget): super().__init__() self._axes: List[Axis] self.parent = parent_widget self.parent.setLayout(QtWidgets.QVBoxLayout()) self.nav_axes_viewers: List[Viewer1DBasic] = []
[docs] def clear_viewers(self): while len(self.nav_axes_viewers) != 0: viewer = self.nav_axes_viewers.pop(0) self.parent.layout().removeWidget(viewer.parent) viewer.parent.close()
[docs] def add_viewers(self, nviewers: int): widgets = [] for ind in range(nviewers): widgets.append(QtWidgets.QWidget()) self.parent.layout().addWidget(widgets[-1]) self.nav_axes_viewers.append(Viewer1DBasic(widgets[-1], show_line=True))
[docs] def set_nav_viewers(self, axes: List[Axis]): self._axes = axes if len(self.nav_axes_viewers) != len(axes): self.clear_viewers() self.add_viewers(len(axes)) for ind in range(len(axes)): self.nav_axes_viewers[ind].roi_line_signal.connect(self._emit_nav_signal) self.nav_axes_viewers[ind].show_data([axes[ind].get_data()]) self.nav_axes_viewers[ind].set_axis_label(dict(orientation='bottom', label='Scan index', units='')) self.nav_axes_viewers[ind].set_axis_label(dict(orientation='left', label=axes[ind].label, units=axes[ind].units))
def _emit_nav_signal(self): self.navigation_changed.emit()
[docs] def get_crosshairs(self): return tuple([viewer.get_line_position() for viewer in self.nav_axes_viewers])
[docs] def get_indexes(self): return [int(cross) for cross in self.get_crosshairs()]
[docs] def setVisible(self, show=True): """convenience method to show or hide the paretn widget""" self.parent.setVisible(show)
if __name__ == '__main__': import sys import numpy as np app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QWidget() prog = AxesViewer(widget) widget.show() labels = [''] N = 2 axes = [Axis(label=f'Axis{ind:02d}', units='s', data=np.random.rand(50)) for ind in range(N)] prog.set_nav_viewers(axes) def print_positions(): print(prog.get_crosshairs()) prog.navigation_changed.connect(print_positions) sys.exit(app.exec_())