class GUPPY(QWidget): '''GUPPY class for allied vision Camera ''' def __init__(self, cam='camDefault', confVisu=None): super(GUPPY, self).__init__() p = pathlib.Path(__file__) #print (p) self.conf = QtCore.QSettings(str(p.parent / 'confCCD.ini'), QtCore.QSettings.IniFormat) sepa = os.sep self.icon = str(p.parent) + sepa + 'icons' + sepa self.setWindowIcon(QIcon(self.icon + 'LOA.png')) self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) self.iconPlay = self.icon + 'Play.svg' self.iconStop = self.icon + 'Stop.svg' self.iconPlay = pathlib.Path(self.iconPlay) self.iconPlay = pathlib.PurePosixPath(self.iconPlay) self.iconStop = pathlib.Path(self.iconStop) self.iconStop = pathlib.PurePosixPath(self.iconStop) self.confVisu = confVisu self.nbcam = cam self.initCam() self.setup() self.itrig = 0 self.actionButton() self.camIsRunnig = False def initCam(self): '''initialisation of cam parameter ''' if self.nbcam == 'camDefault': try: self.cam0 = Vimba().camera(cameraIds[0]) self.ccdName = 'CAM0' self.camID = cameraIds[0] self.isConnected = True except: self.isConnected = False self.ccdName = 'no camera' else: self.camID = self.conf.value(self.nbcam + "/camID") ## read cam serial number try: self.cam0 = Vimba().camera(self.camID) self.ccdName = self.conf.value(self.nbcam + "/nameCDD") self.isConnected = True except: # if it doesn't work we take the first one try: self.nbcam = 'camDefault' self.cam0 = Vimba().camera(cameraIds[0]) self.ccdName = 'CAM0' self.camID = cameraIds[0] self.isConnected = True except: print('not ccd connected') self.isConnected = False self.ccdName = 'no camera' self.setWindowTitle(self.ccdName + ' v.' + version) if self.isConnected == True: print(self.ccdName, 'is connected @:', self.camID) self.cam0.open() ## init cam parameter## self.LineTrigger = str( self.conf.value(self.nbcam + "/LineTrigger") ) # line2 for Mako Line 1 for guppy (not tested) self.cam0.feature('ExposureTime').value = float( self.conf.value(self.nbcam + "/shutter")) * 1000 self.cam0.feature('Gain').value = int( self.conf.value(self.nbcam + "/gain")) self.cam0.feature('TriggerMode').value = 'Off' self.cam0.feature('TriggerActivation').value = 'RisingEdge' #self.cam0.feature('TriggerSelector').value='FrameStart' self.cam0.feature('TriggerSource').value = 'Software' def setup(self): """ user interface definition: """ cameraWidget = QWidget() vbox1 = QVBoxLayout() vbox1 = QVBoxLayout() self.camName = QLabel(self.ccdName, self) self.camName.setAlignment(Qt.AlignCenter) self.camName.setStyleSheet('font :bold 14pt;color: white') vbox1.addWidget(self.camName) hbox1 = QHBoxLayout() # horizontal layout pour run et stop self.runButton = QPushButton(self) self.runButton.setMaximumWidth(60) self.runButton.setMinimumHeight(60) self.runButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: green;}" "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}" % (self.iconPlay, self.iconPlay)) self.runButtonSave = QPushButton('5 img') self.runButtonSave.setMaximumWidth(60) self.runButtonSave.setMinimumHeight(60) self.stopButton = QPushButton(self) self.stopButton.setMaximumWidth(60) self.stopButton.setMinimumHeight(60) self.stopButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}" % (self.iconStop, self.iconStop)) self.stopButton.setEnabled(False) hbox1.addWidget(self.runButton) hbox1.addWidget(self.runButtonSave) hbox1.addWidget(self.stopButton) vbox1.addLayout(hbox1) self.trigg = QComboBox() self.trigg.setMaximumWidth(60) self.trigg.addItem('OFF') self.trigg.addItem('ON') self.labelTrigger = QLabel('Trigger') self.labelTrigger.setMaximumWidth(60) self.itrig = self.trigg.currentIndex() hbox2 = QHBoxLayout() hbox2.addWidget(self.labelTrigger) hbox2.addWidget(self.trigg) vbox1.addLayout(hbox2) self.labelExp = QLabel('Exposure (ms)') self.labelExp.setMaximumWidth(120) self.labelExp.setAlignment(Qt.AlignCenter) vbox1.addWidget(self.labelExp) self.hSliderShutter = QSlider(Qt.Horizontal) self.hSliderShutter.setMinimum(1) self.hSliderShutter.setMaximum(1000) if self.isConnected == True: self.hSliderShutter.setValue( int(self.cam0.feature('ExposureTime').value) / 1000) self.hSliderShutter.setMaximumWidth(80) self.shutterBox = QSpinBox() self.shutterBox.setMinimum(1) self.shutterBox.setMaximum(1000) self.shutterBox.setMaximumWidth(60) if self.isConnected == True: self.shutterBox.setValue( int(self.cam0.feature('ExposureTime').value) / 1000) hboxShutter = QHBoxLayout() hboxShutter.addWidget(self.hSliderShutter) hboxShutter.addWidget(self.shutterBox) vbox1.addLayout(hboxShutter) self.labelGain = QLabel('Gain') self.labelGain.setMaximumWidth(120) self.labelGain.setAlignment(Qt.AlignCenter) vbox1.addWidget(self.labelGain) hboxGain = QHBoxLayout() self.hSliderGain = QSlider(Qt.Horizontal) self.hSliderGain.setMaximumWidth(80) if self.isConnected == True: self.hSliderGain.setMinimum(self.cam0.feature('Gain').range[0]) self.hSliderGain.setMaximum(self.cam0.feature('Gain').range[1]) self.hSliderGain.setValue(int(self.cam0.feature('Gain').value)) self.gainBox = QSpinBox() if self.isConnected == True: self.gainBox.setMinimum(self.cam0.feature('Gain').range[0]) self.gainBox.setMaximum(self.cam0.feature('Gain').range[1]) self.gainBox.setMaximumWidth(60) if self.isConnected == True: self.gainBox.setValue(int(self.cam0.feature('Gain').value)) hboxGain.addWidget(self.hSliderGain) hboxGain.addWidget(self.gainBox) vbox1.addLayout(hboxGain) self.TrigSoft = QPushButton('Trig Soft', self) self.TrigSoft.setMaximumWidth(100) vbox1.addWidget(self.TrigSoft) vbox1.addStretch(1) cameraWidget.setLayout(vbox1) cameraWidget.setMinimumSize(150, 200) cameraWidget.setMaximumSize(200, 900) hMainLayout = QHBoxLayout() hMainLayout.addWidget(cameraWidget) self.visualisation = SEE( confpath=self.confVisu ) ## Widget for visualisation and tools self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation vbox2 = QVBoxLayout() vbox2.addWidget(self.visualisation) hMainLayout.addLayout(vbox2) self.setLayout(hMainLayout) def actionButton(self): '''action when button are pressed ''' self.runButton.clicked.connect(self.acquireMultiImage) self.runButtonSave.clicked.connect(self.acquireMultiImageSave) self.stopButton.clicked.connect(self.stopAcq) self.shutterBox.editingFinished.connect(self.shutter) self.hSliderShutter.sliderReleased.connect(self.mSliderShutter) self.gainBox.editingFinished.connect(self.gain) self.hSliderGain.sliderReleased.connect(self.mSliderGain) self.trigg.currentIndexChanged.connect(self.trigA) self.TrigSoft.clicked.connect(self.softTrigger) def softTrigger(self): '''to have a sofware trigger ''' print('trig soft') self.cam0.feature('TriggerSource').value = 'Software' self.cam0.run_feature_command('TriggerSoftware') if self.itrig == 1: self.cam0.feature('TriggerSource').value = self.LineTrigger def shutter(self): '''set exposure time ''' sh = self.shutterBox.value() # self.hSliderShutter.setValue(sh) # set value of slider time.sleep(0.1) if self.isConnected == True: self.cam0.feature('ExposureTime').value = float( sh * 1000) # Set shutter CCD in microseconde self.conf.setValue(self.nbcam + "/shutter", float(sh)) self.conf.sync() def mSliderShutter(self): # for shutter slider sh = self.hSliderShutter.value() self.shutterBox.setValue(sh) # time.sleep(0.1) self.cam0.feature('ExposureTime').value = float( sh * 1000) # Set shutter CCD in microseconde self.conf.setValue(self.nbcam + "/shutter", float(sh)) def gain(self): '''set gain ''' g = self.gainBox.value() # self.hSliderGain.setValue(g) # set slider value time.sleep(0.1) self.cam0.feature('Gain').value = g print("gain ", self.cam0.feature('Gain').value) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def mSliderGain(self): g = self.hSliderGain.value() self.gainBox.setValue(g) # set valeur de la box time.sleep(0.1) self.cam0.feature('Gain').value = g print("gain ", self.cam0.feature('Gain').value) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def trigA(self): '''to select trigger mode ''' self.itrig = self.trigg.currentIndex() if self.itrig == 1: self.cam0.feature('TriggerMode').value = 'On' self.cam0.feature('TriggerSource').value = self.LineTrigger else: self.cam0.feature('TriggerMode').value = 'Off' def acquireMultiImage(self): ''' start the acquisition thread ''' self.nbImage = 0 self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}" % (self.iconPlay, self.iconPlay)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.threadRunAcq = ThreadRunAcq(self) self.threadRunAcq.newDataRun.connect(self.Display) self.threadRunAcq.start() self.camIsRunnig = True def acquireMultiImageSave(self): ''' start the acquisition thread ''' self.nbImage = 5 self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}" % (self.iconPlay, self.iconPlay)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.threadRunAcq = ThreadRunAcq(self) self.threadRunAcq.newDataRun.connect(self.Display) self.threadRunAcq.start() self.camIsRunnig = True def stopAcq(self): '''Stop acquisition ''' print('stop') if self.camIsRunnig == True: self.threadRunAcq.stopThreadRunAcq() self.camIsRunnig = False self.runButton.setEnabled(True) self.runButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}" % (self.iconPlay, self.iconPlay)) self.stopButton.setEnabled(False) self.stopButton.setStyleSheet( "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}" "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(True) def Display(self, data): '''Display data with Visu module ''' self.data = data self.visualisation.newDataReceived( self.data) # send data to visualisation widget def closeEvent(self, event): ''' closing window event (cross button) ''' print(' close') self.stopAcq() time.sleep(0.1) if self.isConnected == True: self.cam0.close()
class GUPPY(QWidget): newData = QtCore.pyqtSignal(object) endAcq = QtCore.pyqtSignal(bool) def __init__(self, cam='camDefault', **kwds): super(GUPPY, self).__init__() self.nbcam = cam self.itrig = 'off' if "conf" in kwds: self.conf = kwds["conf"] else: self.conf = QtCore.QSettings('confCamera.ini', QtCore.QSettings.IniFormat) self.camParameter = dict() self.camIsRunnig = False self.nbShot = 1 self.items = cameraIds def openMenuCam(self): '''create a message box to choose a camera ''' items = cameraIds item, ok = QInputDialog.getItem(self, "Select Guppy camera", "List of avaible camera", items, 0, False, flags=QtCore.Qt.WindowStaysOnTopHint) if ok and item: items = list(items) index = items.index(item) self.cam0 = Vimba().camera(cameraIds[index]) self.isConnected = True self.nbcam = 'camDefault' self.camID = cameraIds[index] if self.isConnected == True: self.setCamParameter() return self.isConnected def openFirstCam(self): try: self.cam0 = Vimba().camera(cameraIds[0]) self.camID = cameraIds[0] self.isConnected = True self.nbcam = 'camDefault' except: self.isConnected = False self.ccdName = 'no camera' if self.isConnected == True: self.setCamParameter() return self.isConnected def openCamByID(self, camID): ''' read cam serial number ''' self.camID = camID print(self.camID, 'icff') try: self.cam0 = Vimba().camera(self.camID) self.isConnected = True print(self.camID, 'ceee') except: # if id number doesn't work we take the first one try: print('Id not valid open the fisrt camera') self.cam0 = Vimba().camera(cameraIds[0]) self.camID = cameraIds[0] self.isConnected = True except: print('not ccd connected') self.isConnected = False self.ccdName = 'no camera' if self.isConnected == True: self.setCamParameter() def setCamParameter(self): """Open camera Set initial parameters """ print('connected @:', self.camID) self.cam0.open() # for feature_name in self.cam0.feature_names(): # feature = self.cam0.feature(feature_name) # print(feature_name) # print(" ") # print(" ") ## init cam parameter## self.LineTrigger = str(self.conf.value( self.nbcam + "/LineTrigger")) # line2 for Mako Line 1 for guppy (not tested) self.cam0.feature('TriggerMode').value = 'Off' self.cam0.feature('TriggerActivation').value = 'RisingEdge' #self.cam0.feature('TriggerSelector').value='FrameStart' self.cam0.feature('TriggerSource').value = 'Software' self.camParameter["trigger"] = self.cam0.feature('TriggerMode').value self.cam0.feature('ExposureAuto').value = 'Off' self.cam0.feature('GainAuto').value = 'Off' self.cam0.feature('Height').value = self.cam0.feature( 'HeightMax').value self.cam0.feature('Height').value = self.cam0.feature( 'HeightMax').value self.cam0.feature('Width').value = self.cam0.feature('WidthMax').value self.cam0.feature('Width').value = self.cam0.feature('WidthMax').value self.camParameter["expMax"] = float( self.cam0.feature('ExposureTime').range[1]) / 1000 self.camParameter["expMin"] = float( self.cam0.feature('ExposureTime').range[0]) / 1000 #if exposure time save in the ini file is not in the range we put the minimum if self.camParameter["expMin"] <= int( self.conf.value(self.nbcam + "/shutter")) <= self.camParameter["expMax"]: self.cam0.feature('ExposureTime').value = float( self.conf.value(self.nbcam + "/shutter")) * 1000 else: self.cam0.feature('ExposureTime').value = float( self.camParameter["expMin"]) self.camParameter["exposureTime"] = int( self.cam0.feature('ExposureTime').value) / 1000 self.camParameter["gainMax"] = self.cam0.feature('Gain').range[1] self.camParameter["gainMin"] = self.cam0.feature('Gain').range[0] if self.camParameter["gainMin"] <= int( self.conf.value(self.nbcam + "/gain")) <= self.camParameter["gainMax"]: self.cam0.feature('Gain').value = int( self.conf.value(self.nbcam + "/gain")) else: print('gain error: gain set to minimum value') self.cam0.feature('Gain').value = int(self.camParameter["gainMin"]) self.camParameter["gain"] = self.cam0.feature('Gain').value self.threadRunAcq = ThreadRunAcq(self) self.threadRunAcq.newDataRun.connect(self.newImageReceived) self.threadOneAcq = ThreadOneAcq(self) self.threadOneAcq.newDataRun.connect( self.newImageReceived) #,QtCore.Qt.DirectConnection) self.threadOneAcq.newStateCam.connect(self.stateCam) def setExposure(self, sh): ''' set exposure time in ms ''' self.cam0.feature('ExposureTime').value = float( sh * 1000) # in gyppy ccd exposure time is microsecond self.camParameter["exposureTime"] = int( self.cam0.feature('ExposureTime').value) / 1000 print("exposure time is set to", self.cam0.feature('ExposureTime').value, ' micro s') def setGain(self, g): ''' set gain ''' self.cam0.feature( 'Gain').value = g # in gyppy ccd exposure time is microsecond print("Gain is set to", self.cam0.feature('Gain').value) self.camParameter["gain"] = self.cam0.feature('Gain').value def softTrigger(self): '''to have a sofware trigger ''' print('trig soft') self.cam0.feature('TriggerSource').value = 'Software' self.cam0.run_feature_command('TriggerSoftware') def setTrigger(self, trig='off'): ''' set trigger mode on/off ''' if trig == 'on': self.cam0.feature('TriggerMode').value = 'On' self.cam0.feature('TriggerSource').value = self.LineTrigger self.itrig = 'on' else: self.cam0.feature('TriggerMode').value = 'Off' self.cam0.feature('TriggerSource').value = self.LineTrigger self.itrig = 'off' self.camParameter["trigger"] = self.cam0.feature('TriggerMode').value def startAcq(self): self.camIsRunnig = True self.threadRunAcq.newRun() # to set stopRunAcq=False self.threadRunAcq.start() def startOneAcq(self, nbShot): self.nbShot = nbShot self.camIsRunnig = True self.threadOneAcq.newRun() # to set stopRunAcq=False self.threadOneAcq.start() def stopAcq(self): self.threadRunAcq.stopThreadRunAcq() self.threadOneAcq.stopThreadOneAcq() self.camIsRunnig = False def newImageReceived(self, data): self.data = data self.newData.emit(self.data) def stateCam(self, state): self.camIsRunnig = state def closeCamera(self): self.cam0.close() def endAcquisition(self): self.endAcq.emit(True)