Source code for mesoSPIM.src.mesoSPIM_TileViewWindow

'''
mesoSPIM TileViewWindows
'''
import sys
import numpy as np
import logging
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsRectItem
from PyQt5.QtCore import QRectF
from PyQt5.QtGui import QBrush, QPen
from PyQt5.QtCore import Qt
from PyQt5.uic import loadUi
#import pyqtgraph as pg

logger = logging.getLogger(__name__)

[docs] class mesoSPIM_TileViewWindow(QtWidgets.QWidget): sig_scale_changed = QtCore.pyqtSignal(float) def __init__(self, parent=None): super().__init__() self.parent = parent # the mesoSPIM_MainWindow() instance self.acquisition_manager_window = parent.acquisition_manager_window self.cfg = parent.cfg self.state = self.parent.state # the mesoSPIM_StateSingleton() instance '''Set up the UI''' if __name__ == '__main__': loadUi('../gui/mesoSPIM_Tile_Overview.ui', self) else: loadUi(self.parent.package_directory + '/gui/mesoSPIM_Tile_Overview.ui', self) self.setWindowTitle('mesoSPIM-Control: Tile Overview Window') ''' This is flipped to account for image rotation ''' self.y_image_width = self.cfg.camera_parameters['x_pixels'] self.x_image_width = self.cfg.camera_parameters['y_pixels'] self.subsampling = self.cfg.startup['camera_display_live_subsampling'] self.scale_factor = 0.01 if 'flip_XYZFT_button_polarity' in self.cfg.ui_options.keys(): self.x_sign = -1 if self.cfg.ui_options['flip_XYZFT_button_polarity'][0] else 1 self.y_sign = -1 if self.cfg.ui_options['flip_XYZFT_button_polarity'][1] else 1 else: self.x_sign = self.y_sign = 1 msg = "'flip_XYZFT_button_polarity' key not found in config file. Assuming all buttons are positive."; logger.warning(msg); print(msg) self.scene = QGraphicsScene() self.scene.setSceneRect(-300, -400, 600, 800) self.tile_overview.setScene(self.scene) self.show_tiles() # update the tiles every second self.timer = QtCore.QTimer() self.timer.timeout.connect(self.show_tiles) self.timer.start(500) # milliseconds self.doubleSpinBox_scale.valueChanged.connect(lambda: self.on_scale_changed(self.doubleSpinBox_scale.value()))
[docs] def on_scale_changed(self, value=0.01): self.scale_factor = value self.show_tiles()
[docs] def show_tiles(self): self.scene.clear() self.pixel_size = self.cfg.pixelsize[self.state['zoom']] self.tile_size_x, self.tile_size_y = self.x_image_width * self.pixel_size, self.y_image_width * self.pixel_size self.fov_scene_offset_x = self.tile_size_x / 2 * self.scale_factor # offset of the FOV in the scene coordinates self.fov_scene_offset_y = self.tile_size_y / 2 * self.scale_factor self.show_current_FOV() global_offset_x, global_offset_y = self.state['position']['x_pos'], self.state['position']['y_pos'] # offset of the FOV in global (stage) coordinates # Optional: Set brush and pen to color the rectangle #brush = QBrush(Qt.green) pen_default = QPen(Qt.white); pen_default.setWidth(2) pen_selected = QPen(Qt.yellow); pen_selected.setWidth(3) #tile.setBrush(brush) acq_list = self.state['acq_list'] selected_row = self.acquisition_manager_window.get_first_selected_row() start_points_xy_list = [] for ind, acq in enumerate(acq_list): start_point_x, start_point_y = acq.get_startpoint()['x_abs'] - global_offset_x, acq.get_startpoint()['y_abs'] - global_offset_y if (start_point_x, start_point_y) not in start_points_xy_list: # remove duplicates start_points_xy_list.append((start_point_x, start_point_y)) rect = QRectF(self.x_sign*start_point_x*self.scale_factor - self.fov_scene_offset_x, self.y_sign*start_point_y*self.scale_factor - self.fov_scene_offset_y, self.tile_size_x*self.scale_factor, self.tile_size_y*self.scale_factor) tile = QGraphicsRectItem(rect) tile.setPen(pen_default) label = QtWidgets.QGraphicsTextItem("tile") label.setDefaultTextColor(Qt.white) label.setPos(rect.topLeft()) self.scene.addItem(tile) self.scene.addItem(label) # plot selected tile on top in yellow if selected_row is not None and selected_row < len(acq_list): acq = acq_list[selected_row] start_point_x, start_point_y = acq.get_startpoint()['x_abs'] - global_offset_x, acq.get_startpoint()['y_abs'] - global_offset_y rect = QRectF(self.x_sign*start_point_x*self.scale_factor - self.fov_scene_offset_x, self.y_sign*start_point_y*self.scale_factor - self.fov_scene_offset_y, self.tile_size_x*self.scale_factor, self.tile_size_y*self.scale_factor) tile = QGraphicsRectItem(rect) tile.setPen(pen_selected) label = QtWidgets.QGraphicsTextItem("Selected") label.setDefaultTextColor(Qt.yellow) label.setPos(rect.center().x() - label.boundingRect().width() / 2, rect.center().y() - label.boundingRect().height() / 2 - rect.height() / 4) self.scene.addItem(label) self.scene.addItem(tile)
[docs] def show_current_FOV(self): """Show the current FOV in the center of the scene""" start_point_x, start_point_y = -self.fov_scene_offset_x, -self.fov_scene_offset_y rect = QRectF(start_point_x, start_point_y, self.tile_size_x*self.scale_factor, self.tile_size_y*self.scale_factor) label = QtWidgets.QGraphicsTextItem("FOV") label.setDefaultTextColor(Qt.white) label.setPos(rect.center().x() - label.boundingRect().width() / 2, rect.center().y() - label.boundingRect().height() / 2) pen_current_FOV = QPen(Qt.white); pen_current_FOV.setWidth(2); pen_current_FOV.setStyle(Qt.DotLine) brush = QBrush(Qt.gray) tile = QGraphicsRectItem(rect) tile.setBrush(brush) tile.setPen(pen_current_FOV) self.scene.addItem(tile) self.scene.addItem(label)