def _connect_buttons(self, widget): w = widget.findChild(QPushButton, 'dclink_button') if w: psname = self._psname[0] dclinks = PSSearch.conv_psname_2_dclink(psname) if dclinks: dclink_type = PSSearch.conv_psname_2_psmodel(dclinks[0]) if dclink_type != 'REGATRON_DCLink': connect_window(w, PSDetailWindow, self, psname=dclinks) else: if len(dclinks) > 1: menu = QMenu(w) for dcl in dclinks: act = QAction(dcl, menu) connect_newprocess(act, [ 'sirius-hla-as-ps-regatron-individual', '-dev', dcl ], parent=self, is_pydm=True) menu.addAction(act) w.setMenu(menu) else: connect_newprocess(w, [ 'sirius-hla-as-ps-regatron-individual', '-dev', dclinks[0] ], parent=self, is_pydm=True) else: w.setHidden(True)
def _connect_buttons(self): """Connect buttons in the SummaryWidgets.""" widgets = self.main_widget.findChildren(SummaryWidget) for widget in widgets: devname = widget.devname bt = widget.get_detail_button() connect_window(bt, PUDetailWindow, self, devname=devname)
def _setup_ui(self): self.central_widget = QWidget(self) self.central_widget.layout = QHBoxLayout(self.central_widget) self.central_widget.setLayout(self.central_widget.layout) self.setCentralWidget(self.central_widget) self.save_btn = QPushButton('Save', self) self.load_btn = QPushButton('Load', self) self.save_btn.setObjectName('SaveBtn') self.load_btn.setObjectName('LoadBtn') self.central_widget.layout.addWidget(self.save_btn) self.central_widget.layout.addWidget(self.load_btn) self.central_widget.setStyleSheet(""" #SaveBtn, #LoadBtn { background: qlineargradient(x1:0 y1:0, x2:0 y2:1, stop:0 white, stop:1 lightgrey); height: 100%; border: 1px solid grey; padding: 0 5px 0 5px; } #SaveBtn:hover, #LoadBtn:hover { background: qlineargradient(x1:0 y1:0, x2:0 y2:1, stop:0 lightgrey, stop:1 white); }""") connect_window(self.save_btn, ReadAndSaveConfig2ServerWindow, self, client=self._client) connect_window(self.load_btn, LoadAndApplyConfig2MachineWindow, self, client=self._client)
def _set_correctors_channels(self, corrs): self.centralwidget.pushButton_CH1.setText(corrs[0]) _hlautil.connect_window( self.centralwidget.pushButton_CH1, _PSDetailWindow, self, psname=corrs[0]) self.centralwidget.PyDMLabel_KickRBCH1.channel = ( corrs[0].substitute(prefix=self._prefix, propty='Kick-RB')) self.centralwidget.pushButton_CH2.setText(corrs[1]) if corrs[1].dis == 'PU': _hlautil.connect_window( self.centralwidget.pushButton_CH2, _PUDetailWindow, self, devname=corrs[1]) else: _hlautil.connect_window( self.centralwidget.pushButton_CH2, _PSDetailWindow, self, psname=corrs[1]) self.centralwidget.PyDMLabel_KickRBCH2.channel = ( corrs[1].substitute(prefix=self._prefix, propty='Kick-RB')) self.centralwidget.pushButton_CV1.setText(corrs[2]) _hlautil.connect_window( self.centralwidget.pushButton_CV1, _PSDetailWindow, self, psname=corrs[2]) self.centralwidget.PyDMLabel_KickRBCV1.channel = ( corrs[2].substitute(prefix=self._prefix, propty='Kick-RB')) self.centralwidget.pushButton_CV2.setText(corrs[3]) _hlautil.connect_window( self.centralwidget.pushButton_CV2, _PSDetailWindow, self, psname=corrs[3]) self.centralwidget.PyDMLabel_KickRBCV2.channel = ( corrs[3].substitute(prefix=self._prefix, propty='Kick-RB'))
def _setup_ui(self): self.setWindowTitle(self._devname + ' Trims') self.central_widget = QWidget() self.central_widget.layout = QVBoxLayout() self.central_widget.setLayout(self.central_widget.layout) self.setCentralWidget(self.central_widget) # Create family SummaryWidget self.fam_widget = SummaryWidget( name=self._devname, parent=self, visible_props=[ 'detail', 'state', 'intlk', 'setpoint', 'monitor', 'strength_sp', 'strength_mon', 'trim']) self.fam_widget.get_trim_button().setVisible(False) # Connect family detail window fam_button = self.fam_widget.get_detail_button() connect_window(fam_button, PSDetailWindow, self, psname=self._devname) # Create SITrimFamControlWidget device = self._devname.split("-")[-1] self.trim_widget = SITrimFamControlWidget( trim=device, parent=self, orientation=SITrimFamControlWidget.HORIZONTAL) # Connect Trim detail buttons self._connect_buttons(self.trim_widget) # Add to layout self.central_widget.layout.addWidget(self.fam_widget) self.central_widget.layout.addWidget(self.trim_widget)
def setupui(self): if self.position: text = 'Positions' names = ('X', 'Y', 'Q', 'SUM') colors = ('blue', 'red', 'green', 'black') else: text = 'Antennas' names = ('A', 'B', 'C', 'D') colors = ('blue', 'red', 'green', 'magenta') vbl = QVBoxLayout(self) graph = GraphWave(self, prefix=self.prefix, bpm=self.bpm, data_prefix=self.data_prefix) graph.setLabel('left', text='Amplitude', units='a.u.') graph.setLabel('bottom', text='Frequency', units='Hz') for name, cor in zip(names, colors): opts = dict(y_channel=self.get_pvname(name + 'FFTData-RB.AMP'), x_channel=self.get_pvname(name + 'FFTFreq-RB.AVAL'), name=text[:3] + name, color=cor, lineStyle=1, lineWidth=1) # NOTE: If > 1: very low performance graph.addChannel(**opts) vbl.addWidget(graph) graph = GraphWave(self, prefix=self.prefix, bpm=self.bpm, data_prefix=self.data_prefix) graph.setLabel('left', text='Phase', units='rad') graph.setLabel('bottom', text='Frequency', units='Hz') for name, cor in zip(names, colors): opts = dict(y_channel=self.get_pvname(name + 'FFTData-RB.PHA'), x_channel=self.get_pvname(name + 'FFTFreq-RB.AVAL'), name=text[:3] + name, color=cor, lineStyle=1, lineWidth=1) # NOTE: If > 1: very low performance graph.addChannel(**opts) vbl.addWidget(graph) hbl = QHBoxLayout() hbl.addStretch() vbl.addItem(hbl) pb = QPushButton('Open FFT Config', self) hbl.addWidget(pb) hbl.addStretch() Window = create_window_from_widget(FFTConfig, title=self.bpm + ': FFT Config') util.connect_window(pb, Window, parent=self, prefix=self.prefix, bpm=self.bpm, data_prefix=self.data_prefix, position=self.position)
def _setupFamiliesLayout(self): lay = QGridLayout() lb_family = QLabel('<h4>Family</h4>', self, alignment=Qt.AlignCenter) lb_family.setStyleSheet('max-height:1.29em;') lay.addWidget(lb_family, 0, 1) lb_rbdesc = QLabel('<h4>'+self.intstrength+'-RB</h4>', self, alignment=Qt.AlignCenter) lb_rbdesc.setStyleSheet('max-height:1.29em;') lay.addWidget(lb_rbdesc, 0, 2) if self.param == 'tune': lb_refdesc = QLabel('<h4>RefKL-Mon</h4>', self, alignment=Qt.AlignCenter) lb_refdesc.setStyleSheet('max-height:1.29em;') lay.addWidget(lb_refdesc, 0, 3) lb_lastddesc = QLabel('<h4>'+self.intstrength_calcdesc+'</h4>', self, alignment=Qt.AlignCenter) lb_lastddesc.setStyleSheet('max-height:1.29em;') lay.addWidget(lb_lastddesc, 0, 4) row = 1 for fam in self.fams: dev_name = _PVName(self.acc+'-Fam:PS-'+fam) pref_name = dev_name.substitute(prefix=self.prefix) pbt = QPushButton(qta.icon('fa5s.list-ul'), '', self) pbt.setObjectName('pbt') pbt.setStyleSheet(""" #pbt{ min-width:25px; max-width:25px; min-height:25px; max-height:25px; icon-size:20px;}""") _hlautil.connect_window( pbt, _PSDetailWindow, parent=self, psname=dev_name) lay.addWidget(pbt, row, 0) lb_name = QLabel(fam, self, alignment=Qt.AlignCenter) lay.addWidget(lb_name, row, 1) lb_rb = PyDMLabel(self, pref_name.substitute( propty=self.intstrength+'-RB')) lay.addWidget(lb_rb, row, 2) if self.param == 'tune': lb_ref = PyDMLabel(self, self.ioc_prefix.substitute( propty='RefKL'+fam+'-Mon')) lay.addWidget(lb_ref, row, 3) lb_calc = PyDMLabel(self, self.ioc_prefix.substitute( propty=self.intstrength_calcpv.format(fam))) lay.addWidget(lb_calc, row, 4) row += 1 return lay
def get_selection_lists_widget(self, parent): """.""" sel_wid = QWidget(parent) sel_lay = QHBoxLayout(sel_wid) icon = qta.icon('fa5s.hammer', color=get_appropriate_color(self.acc)) Window = create_window_from_widget( SelectionMatrix, title='Corrs and BPMs selection', icon=icon) btn = QPushButton('', sel_wid) btn.setObjectName('btn') btn.setIcon(qta.icon('fa5s.tasks')) btn.setToolTip('Open window to select BPMs and correctors') btn.setStyleSheet( '#btn{min-width:3.8em; max-width:3.8em;\ min-height:2em; max-height:2em; icon-size:25px;}') connect_window( btn, Window, None, device=self.device, prefix=self.prefix, acc=self.acc) sel_lay.addWidget(btn) lay = QVBoxLayout() sel_lay.addStretch() sel_lay.addLayout(lay) hlay = QHBoxLayout() lay.addLayout(hlay) hlay.addWidget(SiriusEnumComboBox( sel_wid, self.devpref.substitute(propty='RespMatMode-Sel'))) hlay.addWidget(SiriusLabel( sel_wid, self.devpref.substitute(propty='RespMatMode-Sts'))) if self.acc in {'SI', 'BO'}: hlay = QHBoxLayout() lay.addLayout(hlay) pdm_chbx = PyDMCheckbox( sel_wid, self.devpref.substitute(propty='RFEnbl-Sel')) pdm_chbx.setText('use RF') pdm_led = SiriusLedState( sel_wid, self.devpref.substitute(propty='RFEnbl-Sts')) hlay.addWidget(pdm_chbx) hlay.addWidget(pdm_led) btn = QPushButton('', sel_wid) btn.setToolTip('Visualize RespMat') btn.setIcon(qta.icon('mdi.chart-line')) btn.setObjectName('btn') btn.setStyleSheet('#btn{max-width:40px; icon-size:40px;}') connect_newprocess( btn, [f'sirius-hla-{self.acc.lower():s}-ap-sofb.py', '--matrix']) sel_lay.addWidget(btn) return sel_wid
def _setupUi(self): vlay = QVBoxLayout(self) vlay.setSpacing(15) self.setLayout(vlay) lab = QLabel('<h2>Sirius DCCT List</h2>', alignment=Qt.AlignCenter) vlay.addWidget(lab) for dcct in self.dcct_list: pbt = QPushButton(dcct) pbt.setStyleSheet("""min-width:10em;""") util.connect_window(pbt, DCCTMain, parent=None, prefix=self.prefix, device=dcct) vlay.addWidget(pbt)
def _create_corr_summwidget(self, corr): """Create and return a corrector detail widget.""" wid = QWidget() wid.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Maximum) lay = QGridLayout(wid) lay.setContentsMargins(0, 0, 0, 0) lay.setAlignment(Qt.AlignCenter) propty_sp = 'Current-SP' if corr.sec == 'LI' else 'Kick-SP' propty_mon = propty_sp.replace('SP', 'Mon') led = SiriusLedState( self, corr.substitute(prefix=self.prefix, propty='PwrState-Sts')) led.setStyleSheet("max-width:1.29em;") lay.addWidget(led, 1, 1) nickname = corr.get_nickname(sec=corr.sec == 'LI', dev=True) pb = QPushButton(nickname, self) if corr.dis == 'PU': util.connect_window(pb, PUDetailWindow, parent=self, devname=corr) else: util.connect_window(pb, PSDetailWindow, parent=self, psname=corr) pb.setStyleSheet(""" min-width:6em; max-width:6em; min-height:1.29em;""") lay.addWidget(pb, 1, 2) sp_kick = PyDMSpinboxScrollbar( self, corr.substitute(prefix=self.prefix, propty=propty_sp)) sp_kick.setStyleSheet("QDoubleSpinBox{min-width:4em; max-width:4em; }" "QScrollBar{max-width:4em;}") sp_kick.spinbox.precisionFromPV = False sp_kick.spinbox.precision = 1 sp_kick.scrollbar.limitsFromPV = True lay.addWidget(sp_kick, 1, 3, 2, 1) lb_kick = PyDMLabel( self, corr.substitute(prefix=self.prefix, propty=propty_mon)) lb_kick.setStyleSheet(""" min-width:5em; max-width:5em; min-height:1.29em;""") lb_kick.showUnits = True lb_kick.precisionFromPV = False lb_kick.precision = 1 lb_kick.setAlignment(Qt.AlignCenter) lay.addWidget(lb_kick, 1, 4) return wid
def _connect_buttons(self, widget): for w in widget.get_summary_widgets(): detail_bt = w.get_detail_button() psname = detail_bt.text() if not psname: psname = detail_bt.toolTip() psname = _PVName(psname) if PSSearch.conv_psname_2_psmodel(psname) == 'REGATRON_DCLink': connect_newprocess( w, ['sirius-hla-as-ps-regatron-individual', '-dev', psname], parent=self, is_pydm=True) else: connect_window(detail_bt, PSDetailWindow, self, psname=psname) trim_bt = w.get_trim_button() if trim_bt is not None: connect_window(trim_bt, PSTrimWindow, self, device=psname)
def _fill_dclink_container(self): self._dclink_is_filled = True self._dclink_container.layout().addWidget( SummaryHeader(self.dclinks[0], self.visible_props, self)) for dclink_name in self.dclinks: w = SummaryWidget(dclink_name, self.visible_props, self) if self.dclinks_type == 'REGATRON_DCLink': connect_newprocess(w.detail_bt, [ 'sirius-hla-as-ps-regatron-individual', '-dev', dclink_name ], parent=self, is_pydm=True) else: connect_window(w.detail_bt, PSDetailWindow, self, psname=dclink_name) self._dclink_container.layout().addWidget(w) self.dclink_widgets.append(w)
def add_buttons_for_images(self): """.""" grpbx = QGroupBox('Other Graphs', self) gdl = QGridLayout(grpbx) gdl.setSpacing(2) self.hbl_nameh.addWidget(grpbx) btn = QPushButton('Corrs', grpbx) gdl.addWidget(btn, 0, 0) Window = create_window_from_widget(CorrectorsWidget, title='Correctors') _util.connect_window(btn, Window, self, device=self.device, prefix=self.prefix, acc=self.acc) if self.isring: btn = QPushButton('MTurn Orb', grpbx) gdl.addWidget(btn, 0, 1) Window = create_window_from_widget(MultiTurnWidget, title='Multi Turn') _util.connect_window(btn, Window, self, sigs=self.updater[0].raw_ref_sig, device=self.device, prefix=self.prefix, csorb=self._csorb) btn = QPushButton('MTurn Sum', grpbx) gdl.addWidget(btn, 0, 2) Window = create_window_from_widget(MultiTurnSumWidget, title='Multi Turn Sum') _util.connect_window(btn, Window, self, device=self.device, prefix=self.prefix, csorb=self._csorb) btn = QPushButton('SingPass Sum', grpbx) gdl.addWidget(btn, 0, 3) Window = create_window_from_widget(SinglePassSumWidget, title='Single Pass Sum') _util.connect_window(btn, Window, self, device=self.device, prefix=self.prefix, csorb=self._csorb)
def _setupUi(self): label = QLabel('<h3>'+self.scrn_prefix+' Settings</h3>', self, alignment=Qt.AlignCenter) gbox_general = QGroupBox('Low Level Devices Prefixes', self) gbox_general.setLayout(self._setupGeneralInfoLayout()) gbox_cam = QGroupBox('Camera Settings', self) gbox_cam.setLayout(self._setupCamSettingsLayout()) bt_cal = QPushButton('Screen Calibration', self) util.connect_window(bt_cal, _ScrnCalibrationSettings, parent=self, prefix=self.prefix, device=self.device) lay = QVBoxLayout() lay.setSpacing(15) lay.addWidget(label) lay.addWidget(gbox_general) lay.addWidget(gbox_cam) lay.addWidget(bt_cal, alignment=Qt.AlignRight) self.centralwidget.setLayout(lay)
def get_singular_values_widget(self, parent): """.""" svs_wid = QWidget(parent) svs_lay = QGridLayout(svs_wid) wid = self.create_pair(svs_wid, 'MinSingValue') lbl = QLabel('Min. SV: ') svs_lay.addWidget(lbl, 0, 0) svs_lay.addWidget(wid, 0, 1) wid = self.create_pair(svs_wid, 'TikhonovRegConst') lbl = QLabel('Tikhonov: ') svs_lay.addWidget(lbl, 1, 0) svs_lay.addWidget(wid, 1, 1) lbl = QLabel('Nr Sing Vals') lbls = SiriusLabel( svs_wid, self.devpref.substitute(propty='NrSingValues-Mon')) btn = QPushButton('', svs_wid) btn.setToolTip('Check Singular Values') btn.setIcon(qta.icon('mdi.chart-line')) btn.setObjectName('btn') btn.setStyleSheet('#btn{max-width:30px; icon-size:30px;}') hbl = QHBoxLayout() hbl.addWidget(btn) hbl.addStretch() hbl.addWidget(lbl) hbl.addWidget(lbls) svs_lay.addLayout(hbl, 2, 0, 1, 2) Window = create_window_from_widget( SingularValues, title='Check Singular Values') connect_window( btn, Window, svs_wid, device=self.device, prefix=self.prefix) return svs_wid
def _setupUi(self): cwt = QWidget(self) self.setCentralWidget(cwt) # label lab = QLabel( '<h3>'+self._tl+' Position and Angle Correction</h3>', cwt) lab.setStyleSheet(""" min-height:1.55em; max-height: 1.55em; qproperty-alignment: 'AlignVCenter | AlignRight'; background-color: qlineargradient(spread:pad, x1:1, y1:0.0227273, x2:0, y2:0, stop:0 rgba(173, 190, 207, 255), stop:1 rgba(213, 213, 213, 255));""") # apply button self.pb_updateref = PyDMPushButton( self, 'Update Reference', pressValue=1, init_channel=self.posang_prefix.substitute( propty='SetNewRefKick-Cmd')) self.pb_updateref.setStyleSheet( 'min-height: 2.4em; max-height: 2.4em;') self.led_needrefupdt = SiriusLedAlert( self, self.posang_prefix.substitute(propty='NeedRefUpdate-Mon')) self.ch_needrefupdt = SiriusConnectionSignal( self.posang_prefix.substitute(propty='NeedRefUpdate-Mon')) self.ch_needrefupdt.new_value_signal[int].connect( self._handle_need_update_ref_led) self.led_needrefupdt.setStyleSheet( 'QLed{min-width: 1.29em; max-width: 1.29em;}') box_ref = QHBoxLayout() box_ref.setContentsMargins(0, 0, 0, 0) box_ref.addWidget(self.pb_updateref) box_ref.addWidget(self.led_needrefupdt) # delta setters self.hgbox = QGroupBox('Horizontal', self) self.hgbox.setLayout(self._setupDeltaControlLayout('x')) self.vgbox = QGroupBox('Vertical', self) self.vgbox.setLayout(self._setupDeltaControlLayout('y')) # correctors self.corrgbox = QGroupBox('Correctors', self) self.corrgbox.setLayout(self._setupCorrectorsLayout()) # status self.statgbox = QGroupBox('Correction Status', self) self.statgbox.setLayout(self._setupStatusLayout()) glay = QGridLayout(cwt) glay.setHorizontalSpacing(12) glay.setVerticalSpacing(12) glay.addWidget(lab, 0, 0, 1, 2) glay.addLayout(box_ref, 1, 0, 1, 2) glay.addWidget(self.hgbox, 2, 0) glay.addWidget(self.vgbox, 2, 1) glay.addWidget(self.corrgbox, 3, 0, 1, 2) glay.addWidget(self.statgbox, 4, 0, 1, 2) # menu act_settings = self.menuBar().addAction('Settings') _hlautil.connect_window(act_settings, CorrParamsDetailWindow, parent=self, tl=self._tl, prefix=self._prefix) # stlesheet self.setStyleSheet(""" PyDMSpinbox{ min-width: 5em; max-width: 5em; } PyDMLabel, PyDMSpinboxScrollbar{ min-width: 6em; max-width: 6em; } QPushButton{ min-width: 8em; } QLabel{ min-height: 1.35em; qproperty-alignment: AlignCenter; } """)
def setupui(self): vbl = QVBoxLayout(self) lab = QLabel('<h2>' + self.bpm + ' Settings</h2>') lab.setAlignment(Qt.AlignCenter) vbl.addWidget(lab) vbl.addSpacing(10) hbl = QHBoxLayout() hbl.setSpacing(15) hbl.addStretch() grpbx = CustomGroupBox('Status', self) gdl = QGridLayout(grpbx) props = (('asyn.CNCT', 'Connected'), ('asyn.ENBL', 'Enabled'), ('RFFEasyn.CNCT', 'RFFE Connected'), ('RFFEasyn.ENBL', 'RFFE Enabled'), ('ADCAD9510PllStatus-Mon', 'Clock Synched')) for i, prop in enumerate(props): led = SiriusLedState(grpbx, init_channel=self.get_pvname(prop[0])) led.setOffColor(led.Red) lab = QLabel(prop[1], grpbx) gdl.addWidget(led, i, 0) gdl.addWidget(lab, i, 1) hbl.addWidget(grpbx) hbl.addStretch() grpbx = CustomGroupBox('Advanced Settings', self) vbl2 = QVBoxLayout(grpbx) vbl2.setSpacing(10) pbt = QPushButton('Software') Window = create_window_from_widget(AdvancedSettings, title=self.bpm + ': Advanced Settings') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) vbl2.addWidget(pbt) pbt = QPushButton('Hardware') Window = create_window_from_widget(HardwareSettings, title=self.bpm + ': Hardware Settings') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) vbl2.addWidget(pbt) hbl.addWidget(grpbx) hbl.addStretch() vbl.addItem(hbl) vbl.addSpacing(20) vbl.addStretch() grpbx = self._create_formlayout_groupbox( 'Offset Parameters', (('PosQOffset-SP', 'Offset PosQ'), ('PosXOffset-SP', 'Offset PosX'), ('PosYOffset-SP', 'Offset PosY'))) vbl.addWidget(grpbx) vbl.addSpacing(20) vbl.addStretch() grpbx = self._create_formlayout_groupbox('Gain Parameters', (('PosKq-SP', 'Gain PosQ'), ('PosKsum-SP', 'Gain Sum'), ('PosKx-SP', 'Gain PosX'), ('PosKy-SP', 'Gain PosY'))) vbl.addWidget(grpbx) vbl.addSpacing(20) vbl.addStretch() grpbx = self._create_formlayout_groupbox( 'Informations', (('INFOHarmonicNumber-SP', 'Harmonic Number'), ('INFOFOFBRate-SP', 'FOFB Rate'), ('INFOMONITRate-SP', 'Monitor Rate'), ('INFOTBTRate-SP', 'TbT Rate'), ('RFFEAtt-SP', 'RFFE Attenuation'))) vbl.addWidget(grpbx) vbl.addSpacing(20) vbl.addStretch()
def setupui(self): gdl = QGridLayout(self) lab = QLabel('<h2>' + self.bpm + ' Advanced Settings</h2>') lab.setAlignment(Qt.AlignCenter) gdl.addWidget(lab, 0, 0, 1, 2) grpbx = self._create_formlayout_groupbox( 'Monit', (('MonitEnable-Sel', 'Enable'), ('MONITUpdtTime-SP', 'Update Time'))) gdl.addWidget(grpbx, 1, 0) grpbx = self._create_formlayout_groupbox( 'Switching', (('SwMode-Sel', 'Mode'), ('SwTagEn-Sel', 'Tag Enable'), ('SwDataMaskEn-Sel', 'Data Mask Enable'), ('SwDataMaskSamples-SP', 'Data Mask Samples'), ('SwDly-SP', 'Delay'), ('SwDivClk-SP', 'Division Clock'))) gdl.addWidget(grpbx, 2, 0) grpbx = self._create_formlayout_groupbox( 'RFFE', (('RFFEAtt-SP', 'Attenuation'), ('RFFEPidSpAC-SP', 'Pid Setpoint AC'), ('RFFEPidSpBD-SP', 'Pid Setpoint BD'), ('RFFEHeaterAC-SP', 'Heater AC'), ('RFFEHeaterBD-SP', 'Heater BD'), ('RFFEPidACKp-SP', 'Pid AC Kp'), ('RFFEPidBDKp-SP', 'Pid BD Kp'), ('RFFEPidACTi-SP', 'Pid AC Ti'), ('RFFEPidBDTi-SP', 'Pid BD Ti'), ('RFFEPidACTd-SP', 'Pid AC Td'), ('RFFEPidBDTd-SP', 'Pid BD Td'))) gdl.addWidget(grpbx, 1, 1, 2, 1) grpbx = CustomGroupBox('Triggers Configuration', self) hbl = QHBoxLayout(grpbx) hbl.setSpacing(10) hbl.addStretch() pbt = QPushButton('Physical Triggers') Window = create_window_from_widget(PhysicalTriggers, title=self.bpm + ': Physical Triggers') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) hbl.addWidget(pbt) hbl.addStretch() pbt = QPushButton('ACQ Logical Triggers') Window = create_window_from_widget(LogicalTriggers, title=self.bpm + ': ACQ Logical Triggers') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm, trig_tp='') hbl.addWidget(pbt) hbl.addStretch() pbt = QPushButton('Post-Mortem Logical Triggers') Window = create_window_from_widget(LogicalTriggers, title=self.bpm + ': Post-Mortem Logical Triggers') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm, trig_tp='_PM') hbl.addWidget(pbt) hbl.addStretch() gdl.addWidget(grpbx, 3, 0, 1, 2)
def _setupCurrentSettingsWidget(self): self._ld_storedebeam = QLabel('Stored EBeam?', self) self._ld_storedebeam.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) self._led_storedebeam = SiriusLedState( self, self.devname.substitute(propty='StoredEBeam-Mon')) self._ld_dcctfault = QLabel('DCCT Fault Check:', self) self._ld_dcctfault.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) self._bt_dcctfault = PyDMStateButton( self, self.devname.substitute(propty='DCCTFltCheck-Sel')) self._bt_dcctfault.shape = PyDMStateButton.Rounded self._led_dcctfault = SiriusLedState( self, self.devname.substitute(propty='DCCTFltCheck-Sts')) self._ld_seldcct = QLabel('Select DCCT:', self) self._ld_seldcct.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) self._cb_seldcct = PyDMEnumComboBox( self, self.devname.substitute(propty='DCCT-Sel')) self._lb_seldcct = PyDMLabel( self, self.devname.substitute(propty='DCCT-Sts')) self._lb_seldcct.setAlignment(Qt.AlignCenter) self._lb_seldcct.precision = 0 self._led_dcct13c4 = SiriusLedAlert( self, _PVName('SI-13C4:DI-DCCT:ReliableMeas-Mon').substitute( prefix=self.prefix)) self._lb_dcct13c4 = QLabel('DCCT 13C4', self) self._lb_dcct13c4.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) self._pb_13c4_detail = QPushButton(self) self._pb_13c4_detail.setObjectName('DCCT13C4_dtl') self._pb_13c4_detail.setStyleSheet( "#DCCT13C4_dtl{min-width:25px; max-width:25px; icon-size:20px;}") self._pb_13c4_detail.setIcon(qta.icon('fa5s.ellipsis-h')) connect_window(self._pb_13c4_detail, DCCTMain, self, prefix=self.prefix, device='SI-13C4:DI-DCCT') hlay_dcct13c4 = QHBoxLayout() hlay_dcct13c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) hlay_dcct13c4.addWidget(self._led_dcct13c4) hlay_dcct13c4.addWidget(self._lb_dcct13c4) hlay_dcct13c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) hlay_dcct13c4.addWidget(self._pb_13c4_detail) hlay_dcct13c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) self._led_dcct14c4 = SiriusLedAlert( self, _PVName('SI-14C4:DI-DCCT:ReliableMeas-Mon').substitute( prefix=self.prefix)) self._lb_dcct14c4 = QLabel('DCCT 14C4', self) self._lb_dcct14c4.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) self._pb_14c4_detail = QPushButton(self) self._pb_14c4_detail.setObjectName('DCCT14C4_dtl') self._pb_14c4_detail.setStyleSheet( "#DCCT14C4_dtl{min-width:25px; max-width:25px; icon-size:20px;}") self._pb_14c4_detail.setIcon(qta.icon('fa5s.ellipsis-h')) connect_window(self._pb_14c4_detail, DCCTMain, self, prefix=self.prefix, device='SI-14C4:DI-DCCT') hlay_dcct14c4 = QHBoxLayout() hlay_dcct14c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) hlay_dcct14c4.addWidget(self._led_dcct14c4) hlay_dcct14c4.addWidget(self._lb_dcct14c4) hlay_dcct14c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) hlay_dcct14c4.addWidget(self._pb_14c4_detail) hlay_dcct14c4.addItem( QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum)) gbox = QGroupBox('Current Settings and Status', self) lay = QGridLayout(gbox) lay.addWidget(self._ld_storedebeam, 0, 0) lay.addWidget(self._led_storedebeam, 0, 1) lay.addWidget(self._ld_dcctfault, 1, 0) lay.addWidget(self._bt_dcctfault, 1, 1) lay.addWidget(self._led_dcctfault, 1, 2) lay.addWidget(self._ld_seldcct, 2, 0) lay.addWidget(self._cb_seldcct, 2, 1) lay.addWidget(self._lb_seldcct, 2, 2) lay.addItem(QSpacerItem(1, 1, QSzPlcy.Expanding, QSzPlcy.Minimum), 3, 0) lay.addLayout(hlay_dcct13c4, 4, 0, 1, 3) lay.addLayout(hlay_dcct14c4, 5, 0, 1, 3) lay.setColumnStretch(0, 2) lay.setColumnStretch(1, 1) lay.setColumnStretch(2, 1) return gbox
def _settingsLayout(self): label_CamEnbl = QLabel('Enable: ', self) hbox_CamEnbl = _create_propty_layout(parent=self, prefix=self.scrn_prefix, propty='CamEnbl', propty_type='enbldisabl') label_CamAcqPeriod = QLabel('Acquire\nPeriod [s]:', self) hbox_CamAcqPeriod = _create_propty_layout(parent=self, prefix=self.scrn_prefix, propty='CamAcqPeriod', propty_type='sprb', width=5.0) label_CamExposureTime = QLabel('Exposure\nTime [us]:', self) hbox_CamExposureTime = _create_propty_layout(parent=self, prefix=self.scrn_prefix, propty='CamExposureTime', propty_type='sprb', width=5.0) label_CamGain = QLabel('Gain[dB]:', self) hbox_CamGain = _create_propty_layout(parent=self, prefix=self.scrn_prefix, propty='CamGain', width=5.0, propty_type='sprb') label_AutoGain = QLabel('Auto Gain: ', self) self.pb_autogain = PyDMPushButton( label='', icon=qta.icon('mdi.auto-fix'), parent=self, pressValue=1, init_channel=self.scrn_prefix.substitute(propty='CamAutoGain-Cmd')) self.pb_autogain.setObjectName('autog') self.pb_autogain.setStyleSheet( "#autog{min-width:25px; max-width:25px; icon-size:20px;}") cam_prefix = SiriusPVName(self.scrn_prefix).substitute(dev='ScrnCam') label_Reset = QLabel('Reset: ', self) self.pb_dtl = PyDMPushButton( label='', icon=qta.icon('fa5s.sync'), parent=self, pressValue=1, init_channel=cam_prefix.substitute(propty='Rst-Cmd')) self.pb_dtl.setObjectName('reset') self.pb_dtl.setStyleSheet( "#reset{min-width:25px; max-width:25px; icon-size:20px;}") self.pb_details = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self.pb_details.setToolTip('More settings') self.pb_details.setObjectName('detail') self.pb_details.setStyleSheet( "#detail{min-width:25px; max-width:25px; icon-size:20px;}") self.pb_details.setSizePolicy(QSzPlcy.Expanding, QSzPlcy.Preferred) util.connect_window(self.pb_details, _ScrnSettingsDetails, parent=self, prefix=self.prefix, device=self.device) hbox_aux = QHBoxLayout() hbox_aux.addWidget(self.pb_dtl, alignment=Qt.AlignLeft) hbox_aux.addWidget(self.pb_details, alignment=Qt.AlignRight) lay = QFormLayout() lay.setFormAlignment(Qt.AlignCenter) lay.addRow(label_CamEnbl, hbox_CamEnbl) lay.addRow(label_CamAcqPeriod, hbox_CamAcqPeriod) lay.addRow(label_CamExposureTime, hbox_CamExposureTime) lay.addRow(label_CamGain, hbox_CamGain) lay.addRow(label_AutoGain, self.pb_autogain) lay.addRow(label_Reset, hbox_aux) return lay
def setupui(self): vbl = QVBoxLayout(self) self.stack = QStackedWidget(self) vbl.addWidget(self.stack) rbA = QRadioButton('Antennas', self) rbP = QRadioButton('Positions', self) rbA.toggled.connect(_part(self.toggle_button, 0)) rbP.toggled.connect(_part(self.toggle_button, 1)) self.radio_buttons.append(rbA) self.radio_buttons.append(rbP) rbA.setChecked(True) hbl = QHBoxLayout() hbl.addStretch() hbl.addWidget(rbA) hbl.addStretch() hbl.addWidget(rbP) hbl.addStretch() vbl.addItem(hbl) # ##### Antennas Widget ###### stack1 = QWidget(self.stack) self.stack.addWidget(stack1) vbl = QVBoxLayout(stack1) graph = self.create_graph(stack1, False) vbl.addWidget(graph) stats = self.create_statistics(stack1, False) vbl.addWidget(stats) if not self.data_prefix.startswith('PM'): hbl2 = QHBoxLayout() hbl2.addStretch() vbl.addItem(hbl2) pb = QPushButton('Open FFT Data', stack1) hbl2.addWidget(pb) hbl2.addStretch() Window = create_window_from_widget( FFTData, title=self.bpm+': FFT Data') util.connect_window( pb, Window, parent=stack1, prefix=self.prefix, bpm=self.bpm, data_prefix=self.data_prefix, position=False) # ##### Position Widget ###### stack2 = QWidget(self.stack) self.stack.addWidget(stack2) vbl = QVBoxLayout(stack2) graph = self.create_graph(stack2, True) vbl.addWidget(graph) stats = self.create_statistics(stack2, True) vbl.addWidget(stats) if not self.data_prefix.startswith('PM'): hbl2 = QHBoxLayout() hbl2.addStretch() vbl.addItem(hbl2) pb = QPushButton('Open FFT Data', stack2) hbl2.addWidget(pb) hbl2.addStretch() Window = create_window_from_widget( FFTData, title=self.bpm+': FFT Data') util.connect_window( pb, Window, parent=stack1, prefix=self.prefix, bpm=self.bpm, data_prefix=self.data_prefix, position=True) self.setStyleSheet(""" #MultiTurnDataGraph{ min-width:48em; min-height:24em; } QLabel{ min-width:6em; max-width:6em; min-height:1.5em; max-height:1.5em; }""")
def setupui(self): self.layoutv = QVBoxLayout(self) lab = QLabel('<h2>' + self.bpm + '</h2>', self, alignment=Qt.AlignCenter) self.layoutv.addWidget(lab) self.layoutv.addSpacing(30) grpbx = CustomGroupBox('BPM General Status', self) hbl = QHBoxLayout(grpbx) hbl.addSpacing(10) hbl.addStretch() chan2vals = { 'asyn.CNCT': 1, 'asyn.ENBL': 1, 'RFFEasyn.CNCT': 1, 'RFFEasyn.ENBL': 1, 'ADCAD9510PllStatus-Mon': 1 } chan2vals = {self.get_pvname(k): v for k, v in chan2vals.items()} led = PyDMLedMultiChannel(self, channels2values=chan2vals) hbl.addWidget(led) hbl.addSpacing(10) hbl.addStretch() pbt = QPushButton('Open Settings') Window = create_window_from_widget(ParamsSettings, title=self.bpm + ': Settings') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) hbl.addWidget(pbt) hbl.addSpacing(10) hbl.addStretch() self.layoutv.addWidget(grpbx) self.layoutv.addSpacing(20) self.layoutv.addStretch() grpbx = CustomGroupBox('Triggered Acquisitions', self) hbl = QHBoxLayout(grpbx) hbl.addSpacing(10) hbl.addStretch() pbt = QPushButton('MultiBunch/SinglePass') Window = create_window_from_widget( TriggeredAcquisition, title=self.bpm + ': MultiBunch/SinglePass Acquisitions') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) hbl.addWidget(pbt) hbl.addSpacing(10) hbl.addStretch() pbt = QPushButton('PostMortem') Window = create_window_from_widget(PostMortemAcquisition, title=self.bpm + ': PostMortem Acquisitions') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) hbl.addWidget(pbt) hbl.addSpacing(10) hbl.addStretch() self.layoutv.addWidget(grpbx) self.layoutv.addSpacing(20) self.layoutv.addStretch() grpbx = self._create_formlayout_groupbox('Monitoring', (('PosX-Mon', 'Position X'), ('PosY-Mon', 'Position Y'), ('PosQ-Mon', 'Position Q'), ('Sum-Mon', 'Sum'))) hbl = QHBoxLayout() hbl.addStretch() pbt = QPushButton('Open Graphics', grpbx) hbl.addWidget(pbt) hbl.addStretch() Window = create_window_from_widget(MonitData, title=self.bpm + ': Monit Data') util.connect_window(pbt, Window, parent=grpbx, prefix=self.prefix, bpm=self.bpm) grpbx.layoutf.addRow(hbl) grpbx.layoutf.setSpacing(10) self.layoutv.addWidget(grpbx) self.layoutv.addSpacing(20) self.layoutv.addStretch() if 'SI' in self.bpm: grpbx = CustomGroupBox('Orbit Interlock', self) hbl = QHBoxLayout(grpbx) pbt = QPushButton('Open Interlock Settings', grpbx) util.connect_window(pbt, BPMOrbIntlkDetailWindow, parent=grpbx, prefix=self.prefix, device=self.bpm) hbl.addStretch() hbl.addWidget(pbt) hbl.addStretch() self.layoutv.addWidget(grpbx) self.layoutv.addSpacing(20) self.layoutv.addStretch()
def _setupUi(self): lay = QVBoxLayout() lay.addWidget( QLabel('<h3>Settings</h3>', self, alignment=Qt.AlignHCenter | Qt.AlignBottom)) lay.setStretch(0, 1) # Measure l_reliablemeas = QLabel('Reliability: ') self.led_ReliableMeas = SiriusLedAlert( self, self.dcct_prefix.substitute(propty='ReliableMeas-Mon')) l_curr = QLabel('Current [mA]: ', self, alignment=Qt.AlignRight) self.label_current = PyDMLabel( self, self.dcct_prefix.substitute(propty='Current-Mon')) self.led_StoredEBeam = SiriusLedState( self, self.dcct_prefix.substitute(propty='StoredEBeam-Mon')) hlay_current = QHBoxLayout() hlay_current.addWidget(self.label_current) hlay_current.addWidget(self.led_StoredEBeam) l_enbl = QLabel('Enable:', self) self.pydmstatebutton_Enbl = PyDMStateButton( self, self.dcct_prefix.substitute(propty='Enbl-Sel')) self.pydmstatebutton_Enbl.shape = 1 self.led_Enbl = SiriusLedState( self, self.dcct_prefix.substitute(propty='Enbl-Sts')) hlay_enbl = QHBoxLayout() hlay_enbl.addWidget(self.pydmstatebutton_Enbl) hlay_enbl.addWidget(self.led_Enbl) l_meastrig = QLabel('Trigger Source:', self) self.pydmenumcombobox_MeasTrg = PyDMEnumComboBox( self, self.dcct_prefix.substitute(propty='MeasTrg-Sel')) self.pydmlabel_MeasTrg = PyDMLabel( self, self.dcct_prefix.substitute(propty='MeasTrg-Sts')) hlay_meastrig = QHBoxLayout() hlay_meastrig.addWidget(self.pydmenumcombobox_MeasTrg) hlay_meastrig.addWidget(self.pydmlabel_MeasTrg) if 'SI' in self.device: l_range = QLabel('Range: ', self) self.pydmenumcombobox_Range = PyDMEnumComboBox( self, self.dcct_prefix.substitute(propty='Range-Sel')) self.pydmlabel_Range = PyDMLabel( self, self.dcct_prefix.substitute(propty='Range-Sts')) hlay_range = QHBoxLayout() hlay_range.addWidget(self.pydmenumcombobox_Range) hlay_range.addWidget(self.pydmlabel_Range) hlay_range.setContentsMargins(0, 0, 0, 0) l_measmode = QLabel('Mode: ', self) self.pydmenumcombobox_MeasMode = PyDMEnumComboBox( self, self.dcct_prefix.substitute(propty='MeasMode-Sel')) self.pydmlabel_MeasMode = PyDMLabel( self, self.dcct_prefix.substitute(propty='MeasMode-Sts')) hlay_measmode = QHBoxLayout() hlay_measmode.addWidget(self.pydmenumcombobox_MeasMode) hlay_measmode.addWidget(self.pydmlabel_MeasMode) hlay_measmode.setContentsMargins(0, 0, 0, 0) glay_mode = QGridLayout() self.normalmode_widget = self._setupMeasSettingsWidget('Normal') self.fastmode_widget = self._setupMeasSettingsWidget('Fast') glay_mode.addWidget(self.normalmode_widget, 0, 0) glay_mode.addWidget(self.fastmode_widget, 0, 0) glay_mode.setContentsMargins(0, 0, 0, 0) self.mode_channel = SiriusConnectionSignal( self.dcct_prefix.substitute(propty='MeasMode-Sel')) self.mode_channel.new_value_signal.connect(self._showMeasModeSettings) # Details self.pb_details = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self.pb_details.setToolTip('Open details') self.pb_details.setObjectName('detail') self.pb_details.setStyleSheet( "#detail{min-width:25px; max-width:25px; icon-size:20px;}") detail_window = create_window_from_widget(DCCTSettingsDetails, title=self.device + ' Settings Details') _hlautil.connect_window(self.pb_details, detail_window, self, prefix=self.prefix, device=self.device) gbox_gen = QGroupBox('Measure') glay_gen = QGridLayout(gbox_gen) glay_gen.setAlignment(Qt.AlignVCenter) glay_gen.addWidget(l_curr, 0, 0) glay_gen.addLayout(hlay_current, 0, 1) glay_gen.addWidget(l_reliablemeas, 1, 0) glay_gen.addWidget(self.led_ReliableMeas, 1, 1, alignment=Qt.AlignLeft) glay_gen.addWidget(l_enbl, 2, 0) glay_gen.addLayout(hlay_enbl, 2, 1) glay_gen.addWidget(l_meastrig, 3, 0) glay_gen.addLayout(hlay_meastrig, 3, 1) if 'SI' in self.device: glay_gen.addWidget(l_range, 4, 0) glay_gen.addLayout(hlay_range, 4, 1) glay_gen.addWidget(l_measmode, 5, 0) glay_gen.addLayout(hlay_measmode, 5, 1) glay_gen.addLayout(glay_mode, 6, 0, 1, 2) glay_gen.addWidget(self.pb_details, 7, 0, 1, 2, alignment=Qt.AlignRight) gbox_gen.setStyleSheet(""" .QLabel{ qproperty-alignment: 'AlignVCenter | AlignRight'; min-width: 6em;} PyDMLed{ min-width: 6em;}""") lay.addWidget(gbox_gen) lay.setStretch(1, 7) # Trigger self.trigger_widget = QGroupBox('Trigger') hbl = QHBoxLayout(self.trigger_widget) hbl.addWidget( HLTriggerSimple(self.trigger_widget, device=self.device.substitute(dis='TI'), prefix=self.prefix)) lay.addWidget(self.trigger_widget) lay.setStretch(2, 3) self.setLayout(lay) self.setStyleSheet(""" QSpinBox, QComboBox, QPushButton, PyDMSpinbox, PyDMEnumComboBox, PyDMLabel{ min-width:6em; max-width:6em;} .QLabel{max-height:1.5em;}""")
def _connect_buttons(self, widget): for widget in widget.get_summary_widgets(): psname = widget.devname detail_bt = widget.get_detail_button() connect_window(detail_bt, PSDetailWindow, self, psname=psname)
def _statusWidget(self): self._ld_alarm = QLabel('Alarms', self, alignment=Qt.AlignCenter) self._led_alarm = SiriusLedAlert( self, self.dev_pref.substitute(propty='Alarm-Mon')) self._pb_alarmdetail = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self._pb_alarmdetail.setObjectName('dtl') self._pb_alarmdetail.setStyleSheet( "#dtl{min-width:25px; max-width:25px; icon-size:20px;}") connect_window(self._pb_alarmdetail, APUAlarmDetails, self, prefix=self._prefix, device=self._device) self._ld_intlk = QLabel('Interlocks', self, alignment=Qt.AlignCenter) self._led_intlkresume = PyDMLedMultiChannel( self, { self.dev_pref.substitute(propty='IntlkInStop-Mon'): 0, self.dev_pref.substitute(propty='IntlkInEOpnGap-Mon'): 0, self.dev_pref.substitute(propty='IntlkOutPwrEnbld-Mon'): 1 }) self._pb_intlkdetail = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self._pb_intlkdetail.setObjectName('dtl') self._pb_intlkdetail.setStyleSheet( "#dtl{min-width:25px; max-width:25px; icon-size:20px;}") connect_window(self._pb_intlkdetail, APUInterlockDetails, self, prefix=self._prefix, device=self._device) self._ld_hwsys = QLabel('Hardware\n&LowLevel', self, alignment=Qt.AlignCenter) self._led_hwsysresume = PyDMLedMultiChannel( self, { self.dev_pref.substitute(propty='StateHw-Mon'): { 'value': [0x4C, 0x3C], 'comp': 'in' }, self.dev_pref.substitute(propty='State-Mon'): { 'value': [1, 4], 'comp': 'in' }, self.dev_pref.substitute(propty='IsOperational-Mon'): 1 }) self._led_hwsysresume.offColor = PyDMLed.Yellow self._led_hwsysresume.onColor = PyDMLed.LightGreen self._pb_hwsysdetail = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self._pb_hwsysdetail.setObjectName('dtl') self._pb_hwsysdetail.setStyleSheet( "#dtl{min-width:25px; max-width:25px; icon-size:20px;}") connect_window(self._pb_hwsysdetail, APUHardLLDetails, self, prefix=self._prefix, device=self._device) self._ld_reset = QLabel('Reset', self, alignment=Qt.AlignCenter) self._pb_reset = PyDMPushButton(self, label='', icon=qta.icon('fa5s.sync')) self._pb_reset.setToolTip('Reset active alarms.') self._pb_reset.channel = self.dev_pref.substitute(propty='DevCtrl-Cmd') self._pb_reset.pressValue = 2 # Reset self._pb_reset.setObjectName('Reset') self._pb_reset.setStyleSheet( '#Reset{min-width:30px; max-width:30px; icon-size:25px;}') gbox_alrmintlk = QGroupBox('Status') lay_alrmintlk = QGridLayout(gbox_alrmintlk) lay_alrmintlk.addWidget(self._pb_alarmdetail, 0, 0) lay_alrmintlk.addWidget(self._ld_alarm, 0, 1) lay_alrmintlk.addWidget(self._led_alarm, 0, 2) lay_alrmintlk.addWidget(self._pb_intlkdetail, 1, 0) lay_alrmintlk.addWidget(self._ld_intlk, 1, 1) lay_alrmintlk.addWidget(self._led_intlkresume, 1, 2) lay_alrmintlk.addWidget(self._pb_hwsysdetail, 2, 0) lay_alrmintlk.addWidget(self._ld_hwsys, 2, 1) lay_alrmintlk.addWidget(self._led_hwsysresume, 2, 2) lay_alrmintlk.addWidget(self._ld_reset, 3, 1) lay_alrmintlk.addWidget(self._pb_reset, 3, 2) return gbox_alrmintlk
def _setupUi(self): # status label_status = QLabel('Status: ', self, alignment=Qt.AlignRight | Qt.AlignVCenter) channels2values = { self.device.substitute(propty='ForceComplete-Mon'): 1, self.device.substitute(propty='NegativeDoneMov-Mon'): 1, self.device.substitute(propty='PositiveDoneMov-Mon'): 1 } self.multiled_status = PyDMLedMultiChannel(self, channels2values) self.multiled_status.setStyleSheet('max-width: 1.29em;') self.pb_details = QPushButton(qta.icon('fa5s.ellipsis-h'), '', self) self.pb_details.setToolTip('Open details') self.pb_details.setObjectName('detail') self.pb_details.setStyleSheet( "#detail{min-width:25px; max-width:25px; icon-size:20px;}") util.connect_window(self.pb_details, _DiffCtrlDetails, parent=self, prefix=self.prefix, device=self.device) self.lb_descCtrl1 = QLabel('', self, alignment=Qt.AlignRight | Qt.AlignVCenter) self.sb_Ctrl1 = PyDMSpinbox(self) self.sb_Ctrl1.showStepExponent = False self.lb_Ctrl1 = PyDMLabel(self) self.lb_descCtrl2 = QLabel('', self, alignment=Qt.AlignRight | Qt.AlignVCenter) self.sb_Ctrl2 = PyDMSpinbox(self) self.sb_Ctrl2.showStepExponent = False self.lb_Ctrl2 = PyDMLabel(self) self.pb_open = PyDMPushButton( parent=self, label='Open', pressValue=1, init_channel=self.device.substitute(propty='Home-Cmd')) tmp_file = _substitute_in_file( _os.path.abspath(_os.path.dirname(__file__)) + '/ui_as_ap_dev' + self.orientation.lower() + 'mon.ui', {'PREFIX': self.prefix}) self.dev_widget = loadUi(tmp_file) self.dev_widget.setObjectName('dev') self.dev_widget_scrarea = QScrollArea() self.dev_widget_scrarea.setObjectName('scrarea') self.dev_widget_scrarea.setStyleSheet( '#scrarea{background-color: transparent; max-width: 15em;}' '#dev{background-color:transparent;}') self.dev_widget_scrarea.setWidget(self.dev_widget) lay = QGridLayout(self) lay.setAlignment(Qt.AlignTop) lay.addWidget(label_status, 0, 0) lay.addWidget(self.multiled_status, 0, 1) lay.addWidget(self.pb_details, 0, 2, alignment=Qt.AlignRight) lay.addWidget(self.lb_descCtrl1, 1, 0) lay.addWidget(self.sb_Ctrl1, 1, 1) lay.addWidget(self.lb_Ctrl1, 1, 2) lay.addWidget(self.lb_descCtrl2, 2, 0) lay.addWidget(self.sb_Ctrl2, 2, 1) lay.addWidget(self.lb_Ctrl2, 2, 2) lay.addWidget(self.pb_open, 3, 1, 1, 2) lay.addWidget(self.dev_widget_scrarea, 0, 3, 4, 1)
def _get_acq_commom_params_grpbx(self): grp_bx = QGroupBox('Common Parameters', self) fbl = QFormLayout(grp_bx) lbl = QLabel('Non-linear Corr.', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair_butled(grp_bx, 'PolyCalibration') fbl.addRow(lbl, wid) self._set_detailed([lbl, wid]) lbl = QLabel('Channel Rate', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair_sel(grp_bx, 'TrigAcqChan') fbl.addRow(lbl, wid) lbl = QLabel('Trigger Type', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair_sel(grp_bx, 'TrigAcqTrigger') fbl.addRow(lbl, wid) self._set_detailed([lbl, wid]) lbl = QLabel('Repeat', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair_butled(grp_bx, 'TrigAcqRepeat') fbl.addRow(lbl, wid) self._set_detailed([lbl, wid]) if self.isring: lbl = QLabel('Nr of Shots', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair(grp_bx, 'TrigNrShots') fbl.addRow(lbl, wid) self._set_detailed([lbl, wid]) lbl = QLabel('SamplesPre', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair(grp_bx, 'TrigNrSamplesPre') fbl.addRow(lbl, wid) lbl = QLabel('SamplesPost', grp_bx, alignment=Qt.AlignCenter) wid = self.create_pair(grp_bx, 'TrigNrSamplesPost') fbl.addRow(lbl, wid) lbl = QLabel('Acquisition:', grp_bx, alignment=Qt.AlignCenter) strt = PyDMPushButton( grp_bx, label='', init_channel=self.devpref.substitute(propty='TrigAcqCtrl-Sel'), pressValue=self._csorb.TrigAcqCtrl.Start) strt.setToolTip('Start Acquisition') strt.setIcon(qta.icon('fa5s.play')) strt.setObjectName('strt') strt.setStyleSheet( '#strt{min-width:25px; max-width:25px; icon-size:20px;}') stop = PyDMPushButton( grp_bx, label='', init_channel=self.devpref.substitute(propty='TrigAcqCtrl-Sel'), pressValue=self._csorb.TrigAcqCtrl.Stop) stop.setToolTip('Stop Acquisition') stop.setIcon(qta.icon('fa5s.stop')) stop.setObjectName('stop') stop.setStyleSheet( '#stop{min-width:25px; max-width:25px; icon-size:20px;}') abrt = PyDMPushButton( grp_bx, label='', init_channel=self.devpref.substitute(propty='TrigAcqCtrl-Sel'), pressValue=self._csorb.TrigAcqCtrl.Abort) abrt.setToolTip('Abort Acquisition') abrt.setIcon(qta.icon('fa5s.ban')) abrt.setObjectName('abrt') abrt.setStyleSheet( '#abrt{min-width:25px; max-width:25px; icon-size:20px;}') pdmlbl = PyDMLabel(grp_bx, self.devpref.substitute(propty='TrigAcqCtrl-Sts')) pdmlbl.setObjectName('pdmlbl') pdmlbl.setStyleSheet('#pdmlbl{min-width:6em; max-width:6em;}') pdmlbl.setAlignment(Qt.AlignCenter) hbl = QHBoxLayout() fbl.addRow(hbl) hbl.addStretch() hbl.addWidget(lbl) hbl.addWidget(strt) hbl.addWidget(stop) hbl.addWidget(abrt) hbl.addWidget(pdmlbl) conf = PyDMPushButton( grp_bx, pressValue=1, init_channel=self.devpref.substitute(propty='TrigAcqConfig-Cmd')) conf.setToolTip('Resend Configurations') conf.setIcon(qta.icon('fa5s.sync')) conf.setObjectName('conf') conf.setStyleSheet( '#conf{min-width:25px; max-width:25px; icon-size:20px;}') sts = QPushButton('', grp_bx) sts.setIcon(qta.icon('fa5s.list-ul')) sts.setToolTip('Open Detailed Status View') sts.setObjectName('sts') sts.setStyleSheet( '#sts{min-width:25px; max-width:25px; icon-size:20px;}') Window = create_window_from_widget(StatusWidget, title='Orbit Status') connect_window(sts, Window, grp_bx, device=self.device, prefix=self.prefix, acc=self.acc, is_orb=True) pdm_led = SiriusLedAlert( grp_bx, self.devpref.substitute(propty='OrbStatus-Mon')) lbl = QLabel('Status:', grp_bx) hbl = QHBoxLayout() hbl.setSpacing(9) hbl.addStretch() hbl.addWidget(lbl) hbl.addWidget(pdm_led) hbl.addWidget(sts) hbl.addWidget(conf) fbl.addRow(hbl) return grp_bx
def _acquisitionWidget(self): label_CamEnbl = QLabel('Acquire Enable Status:', self) hbox_CamEnbl = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='Enbl', propty_type='enbldisabl') label_FrameCnt = QLabel('Frame Count:', self) hbox_FrameCnt = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='FrameCnt', propty_type='mon') label_AcqMode = QLabel('Acquire Mode:', self) hbox_AcqMode = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='AcqMode', propty_type='enum') label_AcqPeriod = QLabel('Acquire Period [s]:', self) hbox_AcqPeriod = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='AcqPeriod', propty_type='sprb') label_AcqPeriodLowLim = QLabel('Acquire Period Low Limit [s]:', self) hbox_AcqPeriodLowLim = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='AcqPeriodLowLim', propty_type='sprb') label_ExpMode = QLabel('Exposure Mode:', self) hbox_ExpMode = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='ExposureMode', propty_type='enum') label_ExpTime = QLabel('Exposure Time [us]:', self) hbox_ExpTime = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='ExposureTime', propty_type='sprb') label_Gain = QLabel('Gain [dB]:', self) hbox_Gain = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='Gain', propty_type='sprb', cmd={ 'label': '', 'pressValue': 1, 'width': '25', 'height': '25', 'icon': qta.icon('mdi.auto-fix'), 'icon-size': '20', 'toolTip': 'Auto Gain', 'name': 'AutoGain' }) label_TransformType = QLabel('Transform Type:', self) hbox_TransformType = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='TransformType', propty_type='enum') label_BlackLevel = QLabel('Black Level [gray va]:', self) hbox_BlackLevel = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='BlackLevel', propty_type='sprb') label_DebouncerPeriod = QLabel('Debouncer Period [us]:', self) hbox_DebouncerPeriod = create_propty_layout(parent=self, prefix=self.cam_prefix, propty='DebouncerPeriod', propty_type='sprb') self.pb_advanced = QPushButton('Advanced', self) my_window = create_window_from_widget( BaslerCamAcqAdvSettings, is_main=False, title='Basler Camera Advanced Acquisition Settings') util.connect_window(self.pb_advanced, my_window, parent=self, device=self.device, prefix=self.prefix) hbox_adv = QHBoxLayout() hbox_adv.addWidget(self.pb_advanced, alignment=Qt.AlignRight) wid = QWidget() flay = QFormLayout(wid) flay.setLabelAlignment(Qt.AlignRight) flay.setFormAlignment(Qt.AlignHCenter) flay.addRow(label_CamEnbl, hbox_CamEnbl) flay.addRow(label_FrameCnt, hbox_FrameCnt) flay.addRow(label_AcqMode, hbox_AcqMode) flay.addRow(label_AcqPeriod, hbox_AcqPeriod) flay.addRow(label_AcqPeriodLowLim, hbox_AcqPeriodLowLim) flay.addRow(label_ExpMode, hbox_ExpMode) flay.addRow(label_ExpTime, hbox_ExpTime) flay.addRow(label_Gain, hbox_Gain) flay.addRow(label_BlackLevel, hbox_BlackLevel) flay.addRow(label_DebouncerPeriod, hbox_DebouncerPeriod) flay.addRow(label_TransformType, hbox_TransformType) flay.addRow(hbox_adv) return wid
def _setupCorrectorsLayout(self): lay = QGridLayout() lay.setVerticalSpacing(9) lay.setHorizontalSpacing(9) label_kicksp = QLabel('<h4>Kick-SP</h4>', self) label_kickrb = QLabel('<h4>Kick-RB</h4>', self) label_kickref = QLabel('<h4>RefKick-Mon</h4>', self) lay.addWidget(label_kicksp, 0, 2) lay.addWidget(label_kickrb, 0, 3) lay.addWidget(label_kickref, 0, 4) idx = 1 for corrid, corr in self.corrs.items(): pbt = QPushButton(qta.icon('fa5s.list-ul'), '', self) pbt.setObjectName('pbt') pbt.setStyleSheet(""" #pbt{ min-width:25px; max-width:25px; min-height:25px; max-height:25px; icon-size:20px;} """) if corr.dis == 'PU': _hlautil.connect_window( pbt, _PUDetailWindow, self, devname=corr) else: _hlautil.connect_window( pbt, _PSDetailWindow, self, psname=corr) lb_name = QLabel(corr, self) le_sp = PyDMSpinboxScrollbar( self, corr.substitute(prefix=self._prefix, propty='Kick-SP')) le_sp.spinbox.setAlignment(Qt.AlignCenter) le_sp.scrollbar.limitsFromPV = True lb_rb = PyDMLabel(self, corr.substitute( prefix=self._prefix, propty='Kick-RB')) lb_ref = PyDMLabel(self, self.posang_prefix.substitute( propty='RefKick'+corrid+'-Mon')) lay.addWidget(pbt, idx, 0, alignment=Qt.AlignTop) lay.addWidget( lb_name, idx, 1, alignment=Qt.AlignLeft | Qt.AlignTop) lay.addWidget(le_sp, idx, 2, alignment=Qt.AlignTop) lay.addWidget(lb_rb, idx, 3, alignment=Qt.AlignTop) lay.addWidget(lb_ref, idx, 4, alignment=Qt.AlignTop) idx += 1 if self._tl == 'TB': pref = self._prefix + ('-' if self._prefix else '') lay.addItem(QSpacerItem(0, 8, QSzPlcy.Ignored, QSzPlcy.Fixed)) label_voltsp = QLabel('<h4>Amplitude-SP</h4>', self) label_voltrb = QLabel('<h4>Amplitude-RB</h4>', self) lay.addWidget(label_voltsp, idx+2, 2) lay.addWidget(label_voltrb, idx+2, 3) lb_kly2_name = QLabel('Klystron 2', self) le_kly2_sp = PyDMSpinboxScrollbar( self, pref+'LA-RF:LLRF:KLY2:SET_AMP') le_kly2_sp.spinbox.precisionFromPV = False le_kly2_sp.spinbox.precision = 2 le_kly2_sp.spinbox.setAlignment(Qt.AlignCenter) le_kly2_sp.scrollbar.limitsFromPV = True lb_kly2_rb = PyDMLabel(self, pref+'LA-RF:LLRF:KLY2:GET_AMP') lb_kly2_rb.precisionFromPV = False lb_kly2_rb.precision = 2 lay.addWidget(lb_kly2_name, idx+3, 1, alignment=Qt.AlignLeft | Qt.AlignTop) lay.addWidget(le_kly2_sp, idx+3, 2, alignment=Qt.AlignTop) lay.addWidget(lb_kly2_rb, idx+3, 3, alignment=Qt.AlignTop) self._kckr_name = _PVName('BO-01D:PU-InjKckr') else: self._kckr_name = _PVName('SI-01SA:PU-InjNLKckr') label_voltsp = QLabel('<h4>Voltage-SP</h4>', self) label_voltrb = QLabel('<h4>Voltage-RB</h4>', self) lay.addWidget(label_voltsp, idx+4, 2) lay.addWidget(label_voltrb, idx+4, 3) lay.addItem(QSpacerItem(0, 8, QSzPlcy.Ignored, QSzPlcy.Fixed)) pb_kckr = QPushButton(qta.icon('fa5s.list-ul'), '', self) pb_kckr.setObjectName('pb') pb_kckr.setStyleSheet(""" #pb{ min-width:25px; max-width:25px; min-height:25px; max-height:25px; icon-size:20px;} """) lb_kckr_name = QLabel(self._kckr_name, self) _hlautil.connect_window( pb_kckr, _PUDetailWindow, self, devname=self._kckr_name) lb_kckr_sp = PyDMSpinboxScrollbar( self, self._kckr_name.substitute( prefix=self._prefix, propty='Voltage-SP')) lb_kckr_sp.scrollbar.limitsFromPV = True lb_kckr_rb = PyDMLabel(self, self._kckr_name.substitute( prefix=self._prefix, propty='Voltage-RB')) lay.addWidget(pb_kckr, idx+5, 0, alignment=Qt.AlignTop) lay.addWidget( lb_kckr_name, idx+5, 1, alignment=Qt.AlignLeft | Qt.AlignTop) lay.addWidget(lb_kckr_sp, idx+5, 2, alignment=Qt.AlignTop) lay.addWidget(lb_kckr_rb, idx+5, 3, alignment=Qt.AlignTop) return lay
def _setupScrnsCorrsWidget(self): # screens lay_screens = QVBoxLayout() lay_screens.setContentsMargins(0, 0, 0, 0) header_screens = self._create_headerline( (('', 0), ('Screen', 6.5), ('Cam', 3.5), ('Type-Sel', 5), ('Type-Sts', 5), ('', 0))) header_screens.setObjectName('header_screens') header_screens.setStyleSheet( '#header_screens {border-bottom: 2px solid gray;}') header_screens.layout().setContentsMargins(0, 9, 0, 9) header_screens.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Maximum) lay_screens.addWidget(header_screens) for idx, scrn_prefix in enumerate(self._scrns): scrn_prefix = SiriusPVName(scrn_prefix) w = self._create_scrn_summwidget(scrn_prefix, idx) w.layout().setContentsMargins(9, 9, 9, 9) lay_screens.addWidget(w) # correctors w_corr = QWidget() w_corr.setObjectName('w_corr') w_corr.setStyleSheet('#w_corr {border-left: 2px solid gray;}') lay_corr = QGridLayout(w_corr) lay_corr.setContentsMargins(0, 0, 0, 0) lay_corr.setVerticalSpacing(25) lay_corr.setHorizontalSpacing(15) lay_corr.setAlignment(Qt.AlignTop) header_corrs = self._create_headerline( (('', 0), ('', 1.29), ('', 5), ('Kick-SP', 5), ('Kick-Mon', 5), ('', 0), ('', 1.29), ('', 5), ('Kick-SP', 5), ('Kick-Mon', 5), ('', 0))) header_corrs.setObjectName('header_corrs') header_corrs.setStyleSheet( '#header_corrs {border-bottom: 2px solid gray;}') header_corrs.layout().setContentsMargins(0, 9, 0, 9) header_corrs.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Maximum) lay_corr.addWidget(header_corrs, 0, 0, 1, 2) for corr, row, col in (('TB-04:PS-CH-1', 1, 0), ('TB-04:PS-CH-2', 2, 0), ('TB-04:PS-CV-1', 1, 1), ('TB-04:PS-CV-2', 2, 1), ('TB-04:PU-InjSept', 3, 0), ('BO-01D:PU-InjKckr', 3, 1)): corr = SiriusPVName(corr) w = self._create_corr_summwidget(corr) w.layout().setContentsMargins(9, 9, 9, 9) lay_corr.addWidget(w, row, col) # posang posang_prefix = SiriusPVName('TB-Glob:AP-PosAng').substitute( prefix=self.prefix) w_posang = QWidget() w_posang.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Maximum) w_posang.setObjectName('w_posang') w_posang.setStyleSheet('#w_posang {border-top: 2px solid gray;}') lay_posang = QGridLayout(w_posang) lay_posang.setVerticalSpacing(9) lay_posang.setHorizontalSpacing(15) header_posang = self._create_headerline( (('', 0), ('', 1.29), ('Position and Angle Correction', 30), ('', 0))) header_posang.setSizePolicy(QSzPlcy.Preferred, QSzPlcy.Maximum) lay_posang.addWidget(header_posang, 0, 0, 1, 2) self.pb_update_ref = PyDMPushButton( label='Update Reference', parent=self, init_channel=posang_prefix.substitute(propty='SetNewRefKick-Cmd'), pressValue=1) self.pb_update_ref.setStyleSheet('min-height: 2em;') lay_posang.addWidget(self.pb_update_ref, 1, 0, 1, 2) for col, title, axis in ((0, 'Horizontal', 'X'), (1, 'Vertical', 'Y')): lb_pos = QLabel('<h4>Δ' + axis.lower() + '</h4>', self, alignment=Qt.AlignRight) lb_pos.setSizePolicy(QSzPlcy.Maximum, QSzPlcy.Maximum) pos_sp = PyDMSpinbox( self, posang_prefix.substitute(propty='DeltaPos' + axis + '-SP')) pos_sp.setObjectName('pos_sp_' + axis.lower()) pos_sp.showStepExponent = False pos_rb = PyDMLabel( self, posang_prefix.substitute(propty='DeltaPos' + axis + '-RB')) pos_rb.setObjectName('pos_rb_' + axis.lower()) lb_ang = QLabel('<h4>Δ' + axis.lower() + '\'</h4>', self, alignment=Qt.AlignRight) lb_ang.setSizePolicy(QSzPlcy.Maximum, QSzPlcy.Maximum) ang_sp = PyDMSpinbox( self, posang_prefix.substitute(propty='DeltaAng' + axis + '-SP')) ang_sp.setObjectName('ang_sp_' + axis.lower()) ang_sp.showStepExponent = False ang_rb = PyDMLabel( self, posang_prefix.substitute(propty='DeltaAng' + axis + '-RB')) ang_rb.setObjectName('ang_rb_' + axis.lower()) gbox_posang = QGroupBox(title, self) axlay = QGridLayout(gbox_posang) axlay.addWidget(lb_pos, 0, 0) axlay.addWidget(pos_sp, 0, 1) axlay.addWidget(pos_rb, 0, 2) axlay.addWidget(lb_ang, 1, 0) axlay.addWidget(ang_sp, 1, 1) axlay.addWidget(ang_rb, 1, 2) lay_posang.addWidget(gbox_posang, 2, col) self.pb_posang_settings = QPushButton('Settings', self) util.connect_window(self.pb_posang_settings, CorrParamsDetailWindow, parent=self, tl='TB', prefix=self.prefix) lay_posang.addWidget(self.pb_posang_settings, 3, 0, 1, 2, alignment=Qt.AlignRight) lay_posangref = QGridLayout() lay_posangref.setHorizontalSpacing(9) lay_posangref.setVerticalSpacing(9) lay_posangref.addWidget( QLabel('<h4>Reference Kicks</h4>', self, alignment=Qt.AlignCenter), 0, 0, 1, 7) for corr in ('CH1', 'CH2', 'CV1', 'CV2'): lb_corr = PyDMLabel(self, posang_prefix.substitute(propty=corr + '-Cte')) lb_corr.setStyleSheet('font-weight:bold;') lb_refkick = PyDMLabel( self, posang_prefix.substitute(propty='RefKick' + corr + '-Mon')) lb_refkick.showUnits = True col = 1 if 'CH' in corr else 4 row = 0 if '1' in corr else 1 lay_posangref.addWidget(lb_corr, row + 1, col) lay_posangref.addWidget(lb_refkick, row + 1, col + 1) lay_posangref.setColumnStretch(0, 1) lay_posangref.setColumnStretch(1, 3) lay_posangref.setColumnStretch(2, 3) lay_posangref.setColumnStretch(3, 1) lay_posangref.setColumnStretch(4, 3) lay_posangref.setColumnStretch(5, 3) lay_posangref.setColumnStretch(6, 1) lay_posang.addLayout(lay_posangref, 4, 0, 1, 2) lay_corr.addWidget(w_posang, 4, 0, 1, 2) lay_corr.setRowStretch(0, 1) lay_corr.setRowStretch(1, 2) lay_corr.setRowStretch(2, 2) lay_corr.setRowStretch(3, 2) lay_corr.setRowStretch(4, 10) lay = QHBoxLayout() lay.setContentsMargins(0, 0, 0, 0) lay.setSpacing(0) lay.addLayout(lay_screens) lay.addWidget(w_corr) self.corr_wid.setLayout(lay)