Source code for pymodaq_gui.examples.data_picker

from qtpy.QtCore import Qt
from qtpy import QtWidgets

from typing import Optional

from pymodaq_data.data import DataRaw, Axis

from pymodaq_gui.utils.widgets.table import SpinBoxDelegate
from pymodaq_gui.parameter.utils import get_widget_from_tree
from pymodaq_gui.plotting.data_viewers.viewer2D import Viewer2D
from pymodaq_gui.utils.custom_app import CustomApp, Dock, DockArea

from pymodaq_gui.parameter.pymodaq_ptypes.tableview import TableViewCustom
from pymodaq.utils.scanner.scanners.tabular import TableModelTabular


[docs] class DataPicker(CustomApp): params = [ {'title': 'picker status', 'name': 'picker_status', 'type': 'led', 'value': False}, {'title': 'Positions', 'name': 'tabular_table', 'type': 'table_view', 'delegate': SpinBoxDelegate, 'menu': True}, ] def __init__(self, area: DockArea): super().__init__(area) self.viewer: Optional[Viewer2D] = None self.table_model: Optional[TableModelTabular] = None self.table_view: Optional[TableViewCustom] = None self.setup_ui()
[docs] def setup_docks(self): self.docks['viewer'] = Dock('Viewer2D') self.dockarea.addDock(self.docks['viewer'], 'right') widget = QtWidgets.QWidget() self.viewer = Viewer2D(widget) self.docks['viewer'].addWidget(widget) self.docks['list'] = Dock('List of points') self.dockarea.addDock(self.docks['list'], 'right', self.docks['viewer']) self.docks['list'].addWidget(self.settings_tree) self.setup_table()
[docs] def setup_actions(self): self.add_action('save_points', 'Save Points', 'move_contour', tip='If checked, double clicking will put points in the table', checkable=True)
[docs] def setup_menu(self): action_menu = self._menubar.addMenu('Actions') self.affect_to('save_points', action_menu)
[docs] def connect_things(self): self.connect_action('save_points', lambda status: self.settings.child('picker_status').setValue(status)) self.viewer.sig_double_clicked.connect(self.double_click_action)
[docs] def double_click_action(self, posx: float, posy: float): if self.is_action_checked('save_points'): xs, ys = self.viewer.view.unscale_axis(posx, posy) data_at = self.viewer.view.get_data_at('red', (xs, ys)) if data_at is not None: self.table_model.add_data(self.table_view.currentIndex().row() + 1, [posx, posy, data_at])
[docs] def show_data(self, data: DataRaw): self.viewer.show_data(data)
[docs] def setup_table(self): init_data = [[0., 0., 0.]] self.table_model = TableModelTabular(init_data, ['x', 'y', 'data']) self.table_view = get_widget_from_tree(self.settings_tree, TableViewCustom)[0] self.settings.child('tabular_table').setValue(self.table_model) self.table_view.horizontalHeader().ResizeMode(QtWidgets.QHeaderView.ResizeToContents) self.table_view.horizontalHeader().setStretchLastSection(True) self.table_view.setSelectionBehavior(QtWidgets.QTableView.SelectRows) self.table_view.setSelectionMode(QtWidgets.QTableView.SingleSelection) self.table_view.setItemDelegate(SpinBoxDelegate()) self.table_view.setDragEnabled(True) self.table_view.setDropIndicatorShown(True) self.table_view.setAcceptDrops(True) self.table_view.viewport().setAcceptDrops(True) self.table_view.setDefaultDropAction(Qt.MoveAction) self.table_view.setDragDropMode(QtWidgets.QTableView.InternalMove) self.table_view.setDragDropOverwriteMode(False) self.table_view.add_data_signal[int].connect(self.table_model.add_data) self.table_view.remove_row_signal[int].connect(self.table_model.remove_data) self.table_view.load_data_signal.connect(self.table_model.load_txt) self.table_view.save_data_signal.connect(self.table_model.save_txt)
[docs] def main(): from pymodaq_gui.utils.utils import mkQApp import numpy as np app = mkQApp('DataPicker') area = DockArea() win = QtWidgets.QMainWindow() win.setCentralWidget(area) data_picker = DataPicker(area) Nx = 100 Ny = 200 x = (np.linspace(0, Nx - 1, Nx) + 100) / 2 y = (np.linspace(0, Ny - 1, Ny) - 10) * 2 from pymodaq.utils.math_utils import gauss2D data_red = 3 * gauss2D(x, np.mean(x), (np.max(x)-np.min(x)) / 5, y, np.mean(y), (np.max(y)-np.min(y)) / 5, 1) data_red += np.random.random(data_red.shape) data_to_plot = DataRaw(name='mydata', distribution='uniform', data=[data_red], axes=[Axis('xaxis', units='m', data=x, index=1), Axis('yaxis', units='mm', data=y, index=0), ]) data_picker.show_data(data_to_plot) win.show() app.exec()
if __name__ == '__main__': main()