Source code for pyccapt.control.gui.gui_cameras

import sys
from pathlib import Path

import numpy as np
import pyqtgraph as pg
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import pyqtSignal, QObject, QThread
from PyQt6.QtGui import QPixmap

# Local module and scripts
from pyccapt.control.core import runtime
from pyccapt.control.devices import camera
from pyccapt.control.usb_switch import usb_switch


[docs] class Ui_Cameras_Alignment(object): def __init__(self, variables, conf, SignalEmitter): """ Initialize the UiCamerasAlignment class. Args: variables: Global experiment variables. conf: Configuration data. SignalEmitter: Signal emitter for communication. """ self.auto_exposure_time_flag = False self.conf = conf self.emitter = SignalEmitter self.variables = variables
[docs] def setupUi(self, Cameras_Alignment): """ Set up the GUI for the Cameras Alignment window. Args: Cameras_Alignment: Returns: None """ Cameras_Alignment.setObjectName("Cameras_Alignment") Cameras_Alignment.resize(1210, 938) self.gridLayout_5 = QtWidgets.QGridLayout(Cameras_Alignment) self.gridLayout_5.setObjectName("gridLayout_5") self.gridLayout_4 = QtWidgets.QGridLayout() self.gridLayout_4.setObjectName("gridLayout_4") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.label_208 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_208.setFont(font) self.label_208.setObjectName("label_208") self.gridLayout.addWidget(self.label_208, 5, 0, 1, 1) ### # self.cam_s_d = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_s_d = pg.ImageView(parent=Cameras_Alignment) self.cam_s_d.adjustSize() self.cam_s_d.ui.histogram.hide() self.cam_s_d.ui.roiBtn.hide() self.cam_s_d.ui.menuBtn.hide() self.cam_s_d.setObjectName("cam_s_o") ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(2) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_s_d.sizePolicy().hasHeightForWidth()) self.cam_s_d.setSizePolicy(sizePolicy) self.cam_s_d.setMinimumSize(QtCore.QSize(600, 250)) self.cam_s_d.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.cam_s_d.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_s_d.setText("") self.cam_s_d.setObjectName("cam_s_d") self.gridLayout.addWidget(self.cam_s_d, 3, 4, 1, 1) self.label_209 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_209.setFont(font) self.label_209.setObjectName("label_209") self.gridLayout.addWidget(self.label_209, 5, 4, 1, 1) ### # self.cam_b_d = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_b_d = pg.ImageView(parent=Cameras_Alignment) self.cam_b_d.adjustSize() self.cam_b_d.ui.histogram.hide() self.cam_b_d.ui.roiBtn.hide() self.cam_b_d.ui.menuBtn.hide() ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(2) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_b_d.sizePolicy().hasHeightForWidth()) self.cam_b_d.setSizePolicy(sizePolicy) self.cam_b_d.setMinimumSize(QtCore.QSize(600, 250)) self.cam_b_d.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.cam_b_d.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_b_d.setText("") self.cam_b_d.setObjectName("cam_b_d") self.gridLayout.addWidget(self.cam_b_d, 6, 4, 1, 1) self.label_204 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_204.setFont(font) self.label_204.setObjectName("label_204") self.gridLayout.addWidget(self.label_204, 2, 4, 1, 1) ### # self.cam_s_o = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_s_o = pg.ImageView(parent=Cameras_Alignment) self.cam_s_o.adjustSize() self.cam_s_o.ui.histogram.hide() self.cam_s_o.ui.roiBtn.hide() self.cam_s_o.ui.menuBtn.hide() self.cam_s_o.setObjectName("cam_s_o") ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_s_o.sizePolicy().hasHeightForWidth()) self.cam_s_o.setSizePolicy(sizePolicy) self.cam_s_o.setMinimumSize(QtCore.QSize(250, 250)) self.cam_s_o.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_s_o.setText("") self.cam_s_o.setObjectName("cam_s_o") self.gridLayout.addWidget(self.cam_s_o, 3, 0, 1, 4) self.label_203 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_203.setFont(font) self.label_203.setObjectName("label_203") self.gridLayout.addWidget(self.label_203, 2, 0, 1, 1) ### # self.cam_b_o = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_b_o = pg.ImageView(parent=Cameras_Alignment) self.cam_b_o.adjustSize() self.cam_b_o.ui.histogram.hide() self.cam_b_o.ui.roiBtn.hide() self.cam_b_o.ui.menuBtn.hide() self.cam_b_o.setObjectName("cam_s_o") ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_b_o.sizePolicy().hasHeightForWidth()) self.cam_b_o.setSizePolicy(sizePolicy) self.cam_b_o.setMinimumSize(QtCore.QSize(250, 250)) self.cam_b_o.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.cam_b_o.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_b_o.setText("") self.cam_b_o.setObjectName("cam_b_o") self.gridLayout.addWidget(self.cam_b_o, 6, 0, 1, 4) self.label_205 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) self.label_205.setFont(font) self.label_205.setObjectName("label_205") self.gridLayout.addWidget(self.label_205, 4, 0, 1, 1) self.label_202 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) self.label_202.setFont(font) self.label_202.setObjectName("label_202") self.gridLayout.addWidget(self.label_202, 1, 0, 1, 1) self.verticalLayout.addLayout(self.gridLayout) self.gridLayout_3 = QtWidgets.QGridLayout() self.gridLayout_3.setObjectName("gridLayout_3") self.label_211 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_211.setFont(font) self.label_211.setObjectName("label_211") self.gridLayout_3.addWidget(self.label_211, 2, 0, 1, 1) ### # self.cam_angle_o = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_angle_o = pg.ImageView(parent=Cameras_Alignment) self.cam_angle_o.adjustSize() self.cam_angle_o.ui.histogram.hide() self.cam_angle_o.ui.roiBtn.hide() self.cam_angle_o.ui.menuBtn.hide() self.cam_angle_o.setObjectName("cam_s_o") ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_angle_o.sizePolicy().hasHeightForWidth()) self.cam_angle_o.setSizePolicy(sizePolicy) self.cam_angle_o.setMinimumSize(QtCore.QSize(250, 250)) self.cam_angle_o.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.cam_angle_o.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_angle_o.setText("") self.cam_angle_o.setObjectName("cam_angle_o") self.gridLayout_3.addWidget(self.cam_angle_o, 3, 0, 1, 1) ### # self.cam_angle_d = QtWidgets.QLabel(parent=Cameras_alignment) self.cam_angle_d = pg.ImageView(parent=Cameras_Alignment) self.cam_angle_d.adjustSize() self.cam_angle_d.ui.histogram.hide() self.cam_angle_d.ui.roiBtn.hide() self.cam_angle_d.ui.menuBtn.hide() self.cam_angle_d.setObjectName("cam_s_o") ### sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(2) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth(self.cam_angle_d.sizePolicy().hasHeightForWidth()) self.cam_angle_d.setSizePolicy(sizePolicy) self.cam_angle_d.setMinimumSize(QtCore.QSize(600, 250)) self.cam_angle_d.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.cam_angle_d.setStyleSheet("QWidget{\n" " border: 2px solid gray;\n" " }\n" " ") # self.cam_angle_d.setText("") self.cam_angle_d.setObjectName("cam_angle_d") self.gridLayout_3.addWidget(self.cam_angle_d, 3, 1, 1, 1) self.label_210 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setBold(True) self.label_210.setFont(font) self.label_210.setObjectName("label_210") self.gridLayout_3.addWidget(self.label_210, 2, 1, 1, 1) self.label_206 = QtWidgets.QLabel(parent=Cameras_Alignment) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) self.label_206.setFont(font) self.label_206.setObjectName("label_206") self.gridLayout_3.addWidget(self.label_206, 1, 0, 1, 1) self.verticalLayout.addLayout(self.gridLayout_3) self.gridLayout_4.addLayout(self.verticalLayout, 0, 0, 1, 1) self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.auto_exposure_time = QtWidgets.QPushButton(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.auto_exposure_time.sizePolicy().hasHeightForWidth()) self.auto_exposure_time.setSizePolicy(sizePolicy) self.auto_exposure_time.setMinimumSize(QtCore.QSize(0, 25)) self.auto_exposure_time.setStyleSheet("QPushButton{\n" " background: rgb(193, 193, 193)\n" " }\n" " ") self.auto_exposure_time.setObjectName("auto_exposure_time") self.horizontalLayout.addWidget(self.auto_exposure_time) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout.addItem(spacerItem) self.led_light = QtWidgets.QLabel(parent=Cameras_Alignment) self.led_light.setMaximumSize(QtCore.QSize(50, 50)) self.led_light.setObjectName("led_light") self.horizontalLayout.addWidget(self.led_light) self.light = QtWidgets.QPushButton(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.light.sizePolicy().hasHeightForWidth()) self.light.setSizePolicy(sizePolicy) self.light.setMinimumSize(QtCore.QSize(0, 25)) self.light.setStyleSheet("QPushButton{\n" " background: rgb(193, 193, 193)\n" " }\n" " ") self.light.setObjectName("light") self.horizontalLayout.addWidget(self.light) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.verticalLayout_2.addLayout(self.horizontalLayout) self.gridLayout_2 = QtWidgets.QGridLayout() self.gridLayout_2.setObjectName("gridLayout_2") self.led_light_2 = QtWidgets.QLabel(parent=Cameras_Alignment) self.led_light_2.setMinimumSize(QtCore.QSize(130, 0)) self.led_light_2.setMaximumSize(QtCore.QSize(500, 50)) self.led_light_2.setObjectName("led_light_2") self.gridLayout_2.addWidget(self.led_light_2, 1, 0, 1, 1) self.exposure_time_cam_1 = QtWidgets.QLineEdit(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.exposure_time_cam_1.sizePolicy().hasHeightForWidth()) self.exposure_time_cam_1.setSizePolicy(sizePolicy) self.exposure_time_cam_1.setMinimumSize(QtCore.QSize(0, 20)) self.exposure_time_cam_1.setStyleSheet("QLineEdit{\n" " background: rgb(223,223,233)\n" " }\n" " ") self.exposure_time_cam_1.setObjectName("exposure_time_cam_1") self.gridLayout_2.addWidget(self.exposure_time_cam_1, 1, 1, 1, 1) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) self.gridLayout_2.addItem(spacerItem2, 4, 1, 1, 1) self.exposure_time_cam_2 = QtWidgets.QLineEdit(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.exposure_time_cam_2.sizePolicy().hasHeightForWidth()) self.exposure_time_cam_2.setSizePolicy(sizePolicy) self.exposure_time_cam_2.setMinimumSize(QtCore.QSize(0, 20)) self.exposure_time_cam_2.setStyleSheet("QLineEdit{\n" " background: rgb(223,223,233)\n" " }\n" " ") self.exposure_time_cam_2.setObjectName("exposure_time_cam_2") self.gridLayout_2.addWidget(self.exposure_time_cam_2, 2, 1, 1, 1) self.exposure_time_cam_3 = QtWidgets.QLineEdit(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.exposure_time_cam_3.sizePolicy().hasHeightForWidth()) self.exposure_time_cam_3.setSizePolicy(sizePolicy) self.exposure_time_cam_3.setMinimumSize(QtCore.QSize(0, 20)) self.exposure_time_cam_3.setStyleSheet("QLineEdit{\n" " background: rgb(223,223,233)\n" " }\n" " ") self.exposure_time_cam_3.setObjectName("exposure_time_cam_3") self.gridLayout_2.addWidget(self.exposure_time_cam_3, 3, 1, 1, 1) self.led_light_3 = QtWidgets.QLabel(parent=Cameras_Alignment) self.led_light_3.setMinimumSize(QtCore.QSize(130, 0)) self.led_light_3.setMaximumSize(QtCore.QSize(500, 50)) self.led_light_3.setObjectName("led_light_3") self.gridLayout_2.addWidget(self.led_light_3, 2, 0, 1, 1) self.default_exposure_time = QtWidgets.QPushButton(parent=Cameras_Alignment) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.default_exposure_time.sizePolicy().hasHeightForWidth()) self.default_exposure_time.setSizePolicy(sizePolicy) self.default_exposure_time.setMinimumSize(QtCore.QSize(0, 25)) self.default_exposure_time.setStyleSheet("QPushButton{\n" " background: rgb(193, 193, 193)\n" " }\n" " ") self.default_exposure_time.setObjectName("default_exposure_time") self.gridLayout_2.addWidget(self.default_exposure_time, 0, 0, 1, 1, QtCore.Qt.AlignmentFlag.AlignHCenter) self.led_light_4 = QtWidgets.QLabel(parent=Cameras_Alignment) self.led_light_4.setMinimumSize(QtCore.QSize(130, 0)) self.led_light_4.setMaximumSize(QtCore.QSize(500, 50)) self.led_light_4.setObjectName("led_light_4") self.gridLayout_2.addWidget(self.led_light_4, 3, 0, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout_2) self.gridLayout_4.addLayout(self.verticalLayout_2, 0, 1, 1, 1) self.gridLayout_5.addLayout(self.gridLayout_4, 0, 0, 1, 1) self.retranslateUi(Cameras_Alignment) QtCore.QMetaObject.connectSlotsByName(Cameras_Alignment) Cameras_Alignment.setTabOrder(self.auto_exposure_time, self.light) Cameras_Alignment.setTabOrder(self.light, self.default_exposure_time) Cameras_Alignment.setTabOrder(self.default_exposure_time, self.exposure_time_cam_1) Cameras_Alignment.setTabOrder(self.exposure_time_cam_1, self.exposure_time_cam_2) Cameras_Alignment.setTabOrder(self.exposure_time_cam_2, self.exposure_time_cam_3) ### # Create a ROI (Region of Interest) item self.roi_s = pg.ROI([1000, 1000], [500, 200], movable=True, resizable=True) self.roi_s.addScaleHandle([1, 1], [0, 0]) # Adding a scaling handle to the ROI self.roi_s.addScaleHandle([0, 0], [1, 1]) self.roi_s.addScaleHandle([1, 0], [0, 1]) self.roi_s.addScaleHandle([0, 1], [1, 0]) self.roi_s.setZValue(10) # Make sure ROI is drawn on top self.cam_s_o.addItem(self.roi_s) self.roi_b = pg.ROI([1000, 1000], [1000, 400], movable=True, resizable=True) self.roi_b.addScaleHandle([1, 1], [0, 0]) # Adding a scaling handle to the ROI self.roi_b.addScaleHandle([0, 0], [1, 1]) self.roi_b.addScaleHandle([1, 0], [0, 1]) self.roi_b.addScaleHandle([0, 1], [1, 0]) self.roi_b.setZValue(10) # Make sure ROI is drawn on top self.cam_b_o.addItem(self.roi_b) self.roi_angle = pg.ROI([1000, 1000], [1000, 400], movable=True, resizable=True) self.roi_angle.addScaleHandle([1, 1], [0, 0]) # Adding a scaling handle to the ROI self.roi_angle.addScaleHandle([0, 0], [1, 1]) self.roi_angle.addScaleHandle([1, 0], [0, 1]) self.roi_angle.addScaleHandle([0, 1], [1, 0]) self.roi_angle.setZValue(10) # Make sure ROI is drawn on top self.cam_angle_o.addItem(self.roi_angle) # Diagram and LEDs ############## self.led_red = QPixmap('./files/led-red-on.png') self.led_green = QPixmap('./files/green-led-on.png') self.led_light.setPixmap(self.led_red) # bottom camera (x, y) # arrow1 = pg.ArrowItem(pos=(925, 770), angle=0) # self.cam_b_o.addItem(arrow1) # Side camera (x, y) main arrow for puck exchange (Blue arrow) arrow1 = pg.ArrowItem(pos=(920, 830), angle=-90, brush='r') arrow3 = pg.ArrowItem(pos=(940, 600), angle=0, brush='g') arrow2 = pg.ArrowItem(pos=(795, 850), angle=-90, brush='b') self.cam_s_o.addItem(arrow1) self.cam_s_o.addItem(arrow2) self.cam_s_o.addItem(arrow3) # side camera zoom (x, y) zoom arrow # arrow1 = pg.ArrowItem(pos=(380, 115), angle=90, brush='r') # self.cam_s_d.addItem(arrow1) # bottom camera zoom (x, y) zoom arrow # arrow1 = pg.ArrowItem(pos=(620, 265), angle=90, brush='r') # self.cam_b_d.addItem(arrow1) ### self.light.clicked.connect(self.light_switch) self.auto_exposure_time.clicked.connect(self.auto_exposure_time_switch) self.default_exposure_time.clicked.connect(self.default_exposure_time_switch) self.emitter.img0_orig.connect(self.update_cam_s_o) self.emitter.img1_orig.connect(self.update_cam_b_o) self.emitter.img2_orig.connect(self.update_cam_angle_o) self.initialize_camera_thread() if self.conf['usb_lamp_switch'] == 'on': self.usb_lamp_switch = usb_switch.USBSwitch("./control/usb_switch/USBaccessX64.dll") # 32 bit w/o X64 self.exposure_time_cam_1.editingFinished.connect(self.update_exposure_time) self.exposure_time_cam_2.editingFinished.connect(self.update_exposure_time) self.exposure_time_cam_3.editingFinished.connect(self.update_exposure_time) self.original_button_style = self.auto_exposure_time.styleSheet() self.emitter.cams_exposure_time_default.connect(self.set_default_exposure_time) # switch off the light if it is one before opening the window self.usb_lamp_switch.switch_off(16)
[docs] def retranslateUi(self, Cameras_Alignment): """ Args: Cameras_alignment: Returns: None """ _translate = QtCore.QCoreApplication.translate ### # Cameras_alignment.setWindowTitle(_translate("Cameras_alignment", "Form")) Cameras_Alignment.setWindowTitle(_translate("Cameras_alignment", "PyCCAPT Cameras")) Cameras_Alignment.setWindowIcon(QtGui.QIcon('./files/logo.png')) self.Cameras_Alignment = Cameras_Alignment ### self.label_208.setText(_translate("Cameras_Alignment", "Overview")) self.label_209.setText(_translate("Cameras_Alignment", "Detail")) self.label_204.setText(_translate("Cameras_Alignment", "Detail")) self.label_203.setText(_translate("Cameras_Alignment", "Overview")) self.label_205.setText(_translate("Cameras_Alignment", "Camera Top")) self.label_202.setText(_translate("Cameras_Alignment", "Camera Side")) self.label_211.setText(_translate("Cameras_Alignment", "Overview")) self.label_210.setText(_translate("Cameras_Alignment", "Detail")) self.label_206.setText(_translate("Cameras_Alignment", "Camera Angle")) self.auto_exposure_time.setText(_translate("Cameras_Alignment", "Auto Exposure Time")) self.led_light.setText(_translate("Cameras_Alignment", "Light")) self.light.setText(_translate("Cameras_Alignment", "Light")) self.led_light_2.setText(_translate("Cameras_Alignment", "Exposure Time Side (us)")) self.exposure_time_cam_1.setText(_translate("Cameras_Alignment", "400000")) self.exposure_time_cam_2.setText(_translate("Cameras_Alignment", "1000000")) self.exposure_time_cam_3.setText(_translate("Cameras_Alignment", "400000")) self.led_light_3.setText(_translate("Cameras_Alignment", "Exposure Time Top (us)")) self.default_exposure_time.setText(_translate("Cameras_Alignment", "Default Exposure Time")) self.led_light_4.setText(_translate("Cameras_Alignment", "Exposure Time Angle (us)")) ### self.timer = QtCore.QTimer() self.timer.timeout.connect(self.cameras_screenshot) self.timer.start(2000) # Check every 2000 milliseconds (1 second)
[docs] def set_default_exposure_time(self, exposure_time_default): """ Set the default exposure time Args: exposure_time_default: Default exposure time Return: None """ self.exposure_time_cam_1.setText(str(exposure_time_default[0])) self.exposure_time_cam_2.setText(str(exposure_time_default[1])) self.exposure_time_cam_3.setText(str(exposure_time_default[2]))
[docs] def update_exposure_time(self): """ Update the exposure time of the cameras Args: None Return: None """ try: if self.exposure_time_cam_1.text() != '': self.emitter.cam_1_exposure_time.emit(int(self.exposure_time_cam_1.text())) if self.exposure_time_cam_2.text() != '': self.emitter.cam_2_exposure_time.emit(int(self.exposure_time_cam_2.text())) if self.exposure_time_cam_3.text() != '': self.emitter.cam_3_exposure_time.emit(int(self.exposure_time_cam_3.text())) except Exception as e: print(e) print('type the exposure time in microseconds')
[docs] def update_cam_s_o(self, img): self.cam_s_o.setImage(img, autoRange=False) roi_coords = self.roi_s.getArraySlice(img, self.cam_s_o.imageItem, axes=(0, 1)) # Extract the region and update the second image view if roi_coords is not None: region = img[roi_coords[0][0], roi_coords[0][1]] self.cam_s_d.setImage(region, autoRange=False)
[docs] def update_cam_b_o(self, img): self.cam_b_o.setImage(img, autoRange=False) roi_coords = self.roi_b.getArraySlice(img, self.cam_b_o.imageItem, axes=(0, 1)) # Extract the region and update the second image view if roi_coords is not None: region = img[roi_coords[0][0], roi_coords[0][1]] self.cam_b_d.setImage(region, autoRange=False)
[docs] def update_cam_angle_o(self, img): self.cam_angle_o.setImage(img, autoRange=False) roi_coords = self.roi_angle.getArraySlice(img, self.cam_angle_o.imageItem, axes=(0, 1)) # Extract the region and update the second image view if roi_coords is not None: region = img[roi_coords[0][0], roi_coords[0][1]] self.cam_angle_d.setImage(region, autoRange=False)
[docs] def light_switch(self): """ light switch function Args: None Return: None """ if not self.variables.light: self.led_light.setPixmap(self.led_green) if self.conf['usb_lamp_switch'] == 'on': self.usb_lamp_switch.switch_on(16) self.variables.light = True self.variables.light_switch = True elif self.variables.light: self.led_light.setPixmap(self.led_red) if self.conf['usb_lamp_switch'] == 'on': self.usb_lamp_switch.switch_off(16) self.variables.light = False self.variables.light_switch = True
[docs] def auto_exposure_time_switch(self): """ Auto exposure time switch function Args: None Return: None """ self.auto_exposure_time_flag = not self.auto_exposure_time_flag if self.auto_exposure_time_flag: self.auto_exposure_time.setStyleSheet("QPushButton{\n" "background: rgb(0, 255, 26)\n" "}") else: self.auto_exposure_time.setStyleSheet(self.original_button_style) self.emitter.auto_exposure_time.emit(True)
[docs] def default_exposure_time_switch(self): """ Default exposure time switch function Args: None Return: None """ self.emitter.default_exposure_time.emit(True)
[docs] def initialize_camera_thread(self): """ Initialize camera thread Args: None Return: None """ if self.conf['camera'] == "off": print('The cameras is off') else: # Create cameras thread # Thread for reading cameras # Create a camera instance and move it to a new thread self.camera_worker = camera.CameraWorker(variables=self.variables, emitter=self.emitter) if not self.camera_worker.camera_available: print(self.camera_worker.camera_status_message) self.variables.flag_camera_grab = False return self.camera_thread = QThread() self.camera_worker.moveToThread(self.camera_thread) self.camera_thread.started.connect(self.camera_worker.start_capturing) self.camera_worker.finished.connect(self.camera_thread.quit) self.camera_worker.finished.connect(self.camera_worker.deleteLater) self.camera_thread.finished.connect(self.camera_thread.deleteLater) self.camera_thread.start() self.variables.flag_camera_grab = True
[docs] def stop(self): """ Stop the timer and any other background processes, timers, or threads here Args: None Return: None """ # Add any additional cleanup code here # with self.variables.lock_setup_parameters: self.variables.flag_camera_grab = False if hasattr(self, 'camera_thread'): self.camera_thread.wait()
[docs] def cameras_screenshot(self): if self.variables.flag_cameras_take_screenshot: screenshot = QtWidgets.QApplication.primaryScreen().grabWindow(self.Cameras_Alignment.winId()) screenshot.save(str(Path(self.variables.path_meta) / "cameras_screenshot.png"), 'png')
[docs] class SignalEmitter(QObject): img0_orig = pyqtSignal(np.ndarray) img1_orig = pyqtSignal(np.ndarray) img2_orig = pyqtSignal(np.ndarray) cam_1_exposure_time = pyqtSignal(int) cam_2_exposure_time = pyqtSignal(int) cam_3_exposure_time = pyqtSignal(int) cams_exposure_time_default = pyqtSignal(list) default_exposure_time = pyqtSignal(bool) auto_exposure_time = pyqtSignal(bool)
[docs] class CamerasAlignmentWindow(QtWidgets.QWidget): closed = QtCore.pyqtSignal() # Define a custom closed signal def __init__(self, variables, gui_cameras_alignment, close_event, camera_win_front, *args, **kwargs): """ Initialize the CamerasAlignmentWindow class. Args: gui_cameras_alignment: An instance of the GUI cameras alignment class. *args: Variable length argument list. **kwargs: Arbitrary keyword arguments. """ super().__init__(*args, **kwargs) self.variables = variables self.gui_cameras_alignment = gui_cameras_alignment self.camera_win_front = camera_win_front self.close_event = close_event self.show() self.showMinimized() self.timer = QtCore.QTimer(self) self.timer.timeout.connect(self.check_if_should) self.timer.start(500) # Check every 1000 milliseconds (1 second)
[docs] def closeEvent(self, event): """ Not close only hide the window Args: event: The close event. """ event.ignore() self.showMinimized() self.close_event.set()
[docs] def check_if_should(self): if self.camera_win_front.is_set(): self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowType.WindowStaysOnTopHint) self.show() self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowType.WindowStaysOnTopHint) self.camera_win_front.clear() # Reset the flag if self.variables.flag_camera_win_show: self.show() self.variables.flag_camera_win_show = False
[docs] def setWindowStyleFusion(self): # Set the Fusion style QtWidgets.QApplication.setStyle("Fusion")
[docs] def run_camera_window(variables, conf, camera_closed_event, camera_win_front): """ Run the Cameras window in a separate process. """ app = QtWidgets.QApplication(sys.argv) # <-- Create a new QApplication instance app.setStyle('Fusion') SignalEmitter_Cameras = SignalEmitter() gui_cameras_alignment = Ui_Cameras_Alignment(variables, conf, SignalEmitter_Cameras) Cameras_alignment = CamerasAlignmentWindow(variables, gui_cameras_alignment, camera_closed_event, camera_win_front, flags=QtCore.Qt.WindowType.Tool) gui_cameras_alignment.setupUi(Cameras_alignment) # Cameras_alignment.show() sys.exit(app.exec()) # <-- Start the event loop for this QApplication instance
if __name__ == "__main__": try: conf, _ = runtime.load_project_config() except Exception as exc: print('Can not load the configuration file') print(exc) sys.exit() shared = runtime.create_shared_context(conf) app = QtWidgets.QApplication(sys.argv) app.setStyle('Fusion') Cameras_Alignment = QtWidgets.QWidget() signal_emitter = SignalEmitter() ui = Ui_Cameras_Alignment(shared.variables, conf, signal_emitter) ui.setupUi(Cameras_Alignment) Cameras_Alignment.show() sys.exit(app.exec())