Exemplo n.º 1
0
 def on_actionCombine_triggered(self):
     current = self.currentPlot.dataset.uid
     dlg = dialogFromUi(self, 'panels/dataops.ui')
     for i in range(self.datasetList.count()):
         item = self.datasetList.item(i)
         newitem = QListWidgetItem(item.text(), dlg.otherList)
         newitem.setData(32, item.data(32))
         if itemuid(item) == current:
             dlg.otherList.setCurrentItem(newitem)
             # paint the current set in grey to indicate it's not allowed
             # to be selected
             newitem.setBackground(self.palette().brush(QPalette.Mid))
             newitem.setFlags(Qt.NoItemFlags)
     if dlg.exec_() != QDialog.Accepted:
         return
     items = dlg.otherList.selectedItems()
     sets = [self.data.uid2set[current]]
     for item in items:
         if itemuid(item) == current:
             return self.showError('Cannot combine set with itself.')
         sets.append(self.data.uid2set[itemuid(item)])
     for rop, rb in [(TOGETHER, dlg.opTogether),
                     (COMBINE, dlg.opCombine),
                     (ADD, dlg.opAdd),
                     (SUBTRACT, dlg.opSubtract),
                     (DIVIDE, dlg.opDivide)]:
         if rb.isChecked():
             op = rop
             break
     self._combine(op, sets)
Exemplo n.º 2
0
    def editParam(self, pname):
        if not self.paraminfo[pname]['settable'] or self.client.viewonly:
            return
        mainunit = self.paramvalues.get('unit', 'main')
        punit = (self.paraminfo[pname]['unit'] or '').replace('main', mainunit)

        dlg = dialogFromUi(self, 'panels/devices_param.ui')
        dlg.target = DeviceParamEdit(self, dev=self.devname, param=pname)
        dlg.target.setClient(self.client)
        dlg.paramName.setText('Parameter: %s.%s' % (self.devname, pname))
        dlg.paramDesc.setText(self.paraminfo[pname]['description'])
        dlg.paramValue.setText(str(self.paramvalues[pname]) + ' ' + punit)
        dlg.targetLayout.addWidget(dlg.target)
        dlg.resize(dlg.sizeHint())
        dlg.target.setFocus()
        if dlg.exec_() != QDialog.Accepted:
            return
        try:
            new_value = dlg.target.getValue()
        except ValueError:
            self.log.exception('invalid value for typed value')
            # shouldn't happen, but if it does, at least give an indication that
            # something went wrong
            QMessageBox.warning(
                self, 'Error', 'The entered value is invalid '
                'for this parameter.')
            return
        if self.devrepr == self.devname:
            self.device_panel.exec_command('%s.%s = %r' %
                                           (self.devname, pname, new_value))
        else:
            self.device_panel.exec_command(
                'set(%s, %s, %r)' % (self.devrepr, srepr(pname), new_value))
Exemplo n.º 3
0
    def execScript(self, script):
        action = 'queue'
        if self.current_status != 'idle':
            qwindow = dialogFromUi(self, 'panels/question.ui')
            qwindow.questionText.setText('A script is currently running.  What'
                                         ' do you want to do?')
            icon = qwindow.style().standardIcon
            qwindow.iconLabel.setPixmap(
                icon(QStyle.SP_MessageBoxQuestion).pixmap(32, 32))
            b0 = QPushButton(icon(QStyle.SP_DialogCancelButton), 'Cancel')
            b1 = QPushButton(icon(QStyle.SP_DialogOkButton), 'Queue script')
            b2 = QPushButton(icon(QStyle.SP_MessageBoxWarning), 'Execute now!')
            qwindow.buttonBox.addButton(b0, QDialogButtonBox.ApplyRole)
            qwindow.buttonBox.addButton(b1, QDialogButtonBox.ApplyRole)
            qwindow.buttonBox.addButton(b2, QDialogButtonBox.ApplyRole)
            qwindow.buttonBox.setFocus()
            result = [0]

            def pushed(btn):
                if btn is b1:
                    result[0] = 1
                elif btn is b2:
                    result[0] = 2
                qwindow.accept()

            qwindow.buttonBox.clicked.connect(pushed)
            qwindow.exec_()
            if result[0] == 0:
                return
            elif result[0] == 2:
                action = 'execute'
        if action == 'queue':
            self.client.run(script)
        else:
            self.client.tell('exec', script)
Exemplo n.º 4
0
    def on_actionSetLimits_triggered(self):
        dlg = dialogFromUi(self, 'panels/devices_limits.ui')
        dlg.descLabel.setText('Adjust user limits of %s:' % self.devname)
        dlg.limitMin.setText(self.limitMin.text())
        dlg.limitMax.setText(self.limitMax.text())
        abslimits = self.client.getDeviceParam(self.devname, 'abslimits')
        offset = self.client.getDeviceParam(self.devname, 'offset')
        if offset is not None:
            abslimits = abslimits[0] - offset, abslimits[1] - offset
        dlg.limitMinAbs.setText(str(abslimits[0]))
        dlg.limitMaxAbs.setText(str(abslimits[1]))
        target = DeviceParamEdit(dlg, dev=self.devname, param='userlimits')
        target.setClient(self.client)
        btn = dlg.buttonBox.addButton('Reset to maximum range',
                                      QDialogButtonBox.ResetRole)

        def callback():
            self.device_panel.exec_command('resetlimits(%s)' % self.devrepr)
            dlg.reject()

        btn.clicked.connect(callback)
        dlg.targetLayout.addWidget(target)
        res = dlg.exec_()
        if res != QDialog.Accepted:
            return
        newlimits = target.getValue()
        if newlimits[0] < abslimits[0] or newlimits[1] > abslimits[1]:
            QMessageBox.warning(
                self, 'Error', 'The entered limits are not '
                'within the absolute limits for the device.')
            # retry
            self.on_actionSetLimits_triggered()
            return
        self.device_panel.exec_command('set(%s, "userlimits", %s)' %
                                       (self.devrepr, newlimits))
Exemplo n.º 5
0
    def on_addDevBtn_clicked(self):
        devlist = self.client.getDeviceList(
            'nicos.core.device.Moveable',
            special_clause='d.valuetype is float')
        devlist = [
            item for item in devlist
            if item.startswith(('sam_', 'hexapod_')) or '_sam_' in item
        ]
        dlg = dialogFromUi(
            self, findResource('nicos_mlz/kws1/gui/sampleconf_adddev.ui'))
        dlg.widget = None

        def callback(index):
            devname = devlist[index]
            if dlg.widget:
                dlg.widget.deleteLater()
                dlg.valueFrame.layout().takeAt(0)
            dlg.widget = typedvalue.DeviceValueEdit(dlg, dev=devname)
            dlg.widget.setClient(self.client)
            dlg.valueFrame.layout().insertWidget(0, dlg.widget)

        dlg.devBox.currentIndexChanged.connect(callback)
        dlg.devBox.addItems(devlist)
        if not dlg.exec_():
            return
        self._addRow(dlg.devBox.currentText(), str(dlg.widget.getValue()))
Exemplo n.º 6
0
    def modifyData(self):
        visible_curves = self.visibleCurves()
        # get input from the user: which curves should be modified how
        dlg = dialogFromUi(self, 'panels/modify.ui')

        def checkAll():
            for i in range(dlg.list.count()):
                dlg.list.item(i).setCheckState(Qt.Checked)

        dlg.selectall.clicked.connect(checkAll)
        for i, descr in visible_curves:
            li = QListWidgetItem(descr, dlg.list)
            if len(visible_curves) == 1:
                li.setCheckState(Qt.Checked)
                dlg.operation.setFocus()
            else:
                li.setCheckState(Qt.Unchecked)
        if dlg.exec_() != QDialog.Accepted:
            return
        # evaluate selection
        op = dlg.operation.text()
        curves = []
        for i in range(dlg.list.count()):
            li = dlg.list.item(i)
            if li.checkState() == Qt.Checked:
                curves.append(i)

        # modify curve data
        for i in curves:
            curve = self.plotcurves[visible_curves[i][0]]
            self._modifyCurve(curve, op)
        self.update()
Exemplo n.º 7
0
    def on_addDevBtn_clicked(self):
        dev_list = self.client.getDeviceList('nicos.core.device.Moveable',
                                             only_explicit=False)
        # Only get the sample changer related motors
        dev_list = [
            item for item in dev_list
            if item.startswith('sc_') and 'motor' in item
        ]
        dlg = dialogFromUi(
            self,
            findResource('nicos_ess/loki/gui/ui_files/sampleconf_adddev.ui'))
        dlg.widget = None

        def callback(index):
            dev_name = dev_list[index]
            if dlg.widget:
                dlg.widget.deleteLater()
                dlg.valueFrame.layout().takeAt(0)
            dlg.widget = typedvalue.DeviceValueEdit(dlg, dev=dev_name)
            dlg.widget.setClient(self.client)
            dlg.valueFrame.layout().insertWidget(0, dlg.widget)

        dlg.devBox.currentIndexChanged.connect(callback)
        dlg.devBox.addItems(dev_list)
        if not dlg.exec_():
            return
        if dlg.widget is not None:
            self._addRow(dlg.devBox.currentText(), str(dlg.widget.getValue()))
Exemplo n.º 8
0
 def on_readDevsBtn_clicked(self):
     dlg = dialogFromUi(self, findResource(
         'nicos_mlz/kws1/gui/sampleconf_readpos.ui'))
     if self.instrument == 'kws1':
         dlg.kws3Box.hide()
     elif self.instrument == 'kws2':
         dlg.kws3Box.hide()
         dlg.hexaBox.hide()
     elif self.instrument == 'kws3':
         dlg.rotBox.hide()
         dlg.transBox.hide()
         dlg.hexaBox.hide()
         dlg.kws3Box.setChecked(True)
     if not dlg.exec_():
         return
     if dlg.rotBox.isChecked():
         self._addRow('sam_rot', self._readDev('sam_rot'))
     if dlg.transBox.isChecked():
         self._addRow('sam_trans_x', self._readDev('sam_trans_x'))
         self._addRow('sam_trans_y', self._readDev('sam_trans_y'))
     if dlg.hexaBox.isChecked():
         for axis in ('dt', 'tx', 'ty', 'tz', 'rx', 'ry', 'rz'):
             self._addRow('hexapod_' + axis,
                          self._readDev('hexapod_' + axis))
     if dlg.kws3Box.isChecked():
         self._addRow('sam_x', self._readDev('sam_x'))
         self._addRow('sam_y', self._readDev('sam_y'))
Exemplo n.º 9
0
 def chooseProposal(self, proposals):
     dlg = dialogFromUi(self, 'panels/setup_exp_proposal.ui')
     dlg.list.setItemDelegate(ProposalDelegate(dlg))
     for prop in proposals:
         item = QListWidgetItem('', dlg.list)
         item.setData(Qt.UserRole, prop)
     if not dlg.exec_():
         return
     sel = dlg.list.currentRow()
     return proposals[sel]
Exemplo n.º 10
0
 def choose_proposal(self, proposals):
     dlg = dialogFromUi(self, 'panels/setup_exp_proposal.ui')
     dlg.list.setItemDelegate(ProposalDelegate(dlg))
     for prop in proposals:
         prop_copy = deepcopy(prop)
         prop_copy['users'] = [{'name': combineUsers(prop['users'])}]
         item = QListWidgetItem('', dlg.list)
         item.setData(Qt.UserRole, prop_copy)
     if not dlg.exec_():
         return
     sel = dlg.list.currentRow()
     return proposals[sel]
Exemplo n.º 11
0
 def on_actionAddComment_triggered(self):
     dlg = dialogFromUi(self, 'panels/elog_comment.ui')
     dlg.helpFrame.setVisible(False)
     dlg.mdLabel.linkActivated.connect(
         lambda link: dlg.helpFrame.setVisible(True))
     if dlg.exec_() != QDialog.Accepted:
         return
     text = dlg.freeFormText.toPlainText()
     if not text:
         return
     self.client.eval('LogEntry(%r)' % text)
     self.timer.start(750)
Exemplo n.º 12
0
 def _get_new_value(self, window_title, desc):
     dlg = dialogFromUi(self, 'panels/devices_newpos.ui')
     dlg.setWindowTitle(window_title)
     dlg.descLabel.setText(desc)
     dlg.oldValue.setText(self.valuelabel.text())
     target = DeviceValueEdit(dlg, dev=self.devname)
     target.setClient(self.client)
     dlg.targetLayout.addWidget(target)
     target.setFocus()
     res = dlg.exec_()
     if res != QDialog.Accepted:
         return None
     return target.getValue()
Exemplo n.º 13
0
    def on_remarkBtn_clicked(self):
        dlg = dialogFromUi(self, 'panels/expinfo_remark.ui')

        def callback():
            self.showInfo('The remark will be added to the logbook as a '
                          'heading and will also appear in the data files.')
        dlg.buttonBox.helpRequested.connect(callback)

        for ch in dlg.findChildren(NicosWidget):
            ch.setClient(self.client)
        dlg.remarkEdit.setFocus()
        if not dlg.exec_():
            return
        self.client.run('Remark(%r)' % dlg.remarkEdit.getValue())
Exemplo n.º 14
0
 def on_settingAdd_clicked(self):
     dlg = dialogFromUi(self, 'dialogs/settings_conn.ui')
     if dlg.exec_() != QDialog.Accepted:
         return
     if not dlg.name.text():
         return
     name = dlg.name.text()
     while name in self.connpresets:
         name += '_'
     cdata = ConnectionData(dlg.host.text(), dlg.port.value(),
                            dlg.login.text(), None, dlg.viewonly.isChecked())
     self.connpresets[name] = cdata
     QListWidgetItem(name + ' (%s:%s)' % (cdata.host, cdata.port),
                     self.settinglist).setData(32, name)
Exemplo n.º 15
0
 def on_actionAttachElog_triggered(self):
     newdlg = dialogFromUi(self, 'panels/plot_attach.ui')
     suffix = self.currentPlot.SAVE_EXT
     newdlg.filename.setText(
         safeName('data_%s' % self.currentPlot.dataset.name + suffix))
     ret = newdlg.exec_()
     if ret != QDialog.Accepted:
         return
     descr = newdlg.description.text()
     fname = newdlg.filename.text()
     pathname = self.currentPlot.saveQuietly()
     with open(pathname, 'rb') as fp:
         remotefn = self.client.ask('transfer', fp.read())
     if remotefn is not None:
         self.client.eval('_LogAttach(%r, [%r], [%r])' %
                          (descr, remotefn, fname))
     os.unlink(pathname)
Exemplo n.º 16
0
 def on_settingEdit_clicked(self):
     item = self.settinglist.currentItem()
     if item is None:
         return
     cdata = self.connpresets[item.data(32)]
     dlg = dialogFromUi(self, 'dialogs/settings_conn.ui')
     dlg.name.setText(item.data(32))
     dlg.name.setEnabled(False)
     dlg.host.setText(cdata.host)
     dlg.port.setValue(cdata.port)
     dlg.login.setText(cdata.user)
     dlg.viewonly.setChecked(cdata.viewonly)
     if dlg.exec_() != QDialog.Accepted:
         return
     cdata.host = dlg.host.text()
     cdata.port = dlg.port.value()
     cdata.user = dlg.login.text()
     cdata.viewonly = dlg.viewonly.isChecked()
     item.setText('%s (%s:%s)' % (dlg.name.text(), cdata.host, cdata.port))
Exemplo n.º 17
0
    def on_actionAbout_triggered(self):
        import nicos.authors

        if self.client.isconnected:
            dinfo = self.client.daemon_info.copy()
            dinfo['server_host'] = self.client.host
        else:
            dinfo = {}
        dlg = dialogFromUi(self, 'dialogs/about.ui')
        dlg.clientVersion.setText(nicos_version)
        dlg.pyVersion.setText(
            '%s/%s/%s' %
            (sys.version.split()[0], QT_VERSION_STR, PYQT_VERSION_STR))
        dlg.serverHost.setText(dinfo.get('server_host', 'not connected'))
        dlg.nicosRoot.setText(dinfo.get('nicos_root', ''))
        dlg.serverVersion.setText(dinfo.get('daemon_version', ''))
        dlg.customPath.setText(dinfo.get('custom_path', ''))
        dlg.customVersion.setText(dinfo.get('custom_version', ''))
        dlg.contributors.setPlainText(nicos.authors.authors_list)
        dlg.adjustSize()
        dlg.exec_()
Exemplo n.º 18
0
    def selectCurve(self):
        """Let the user select a visible plot curve.

        If there is only one curve, return it directly.
        """
        visible_curves = self.visibleDataCurves()
        if not visible_curves:
            return
        if len(visible_curves) > 1:
            dlg = dialogFromUi(self, 'panels/selector.ui')
            dlg.setWindowTitle('Select curve to fit')
            dlg.label.setText('Select a curve:')
            for _, descr in visible_curves:
                QListWidgetItem(descr, dlg.list)
            dlg.list.setCurrentRow(0)
            if dlg.exec_() != QDialog.Accepted:
                return
            fitcurve = visible_curves[dlg.list.currentRow()][0]
        else:
            fitcurve = visible_curves[0][0]
        return self.plotcurves[fitcurve]
Exemplo n.º 19
0
    def on_actionAttachFile_triggered(self):
        dlg = dialogFromUi(self, 'panels/elog_attach.ui')

        def on_fileSelect_clicked():
            self.selectInputFile(dlg.fileName, 'Choose a file to attach')
            dlg.fileRename.setFocus()

        dlg.fileSelect.clicked.connect(on_fileSelect_clicked)
        if dlg.exec_() != QDialog.Accepted:
            return
        fname = dlg.fileName.text()
        if not path.isfile(fname):
            return self.showError('The given file name is not a valid file.')
        newname = dlg.fileRename.text()
        if not newname:
            newname = path.basename(fname)
        desc = dlg.fileDesc.text()
        filecontent = open(fname, 'rb').read()
        remotefn = self.client.ask('transfer', filecontent)
        if remotefn is not None:
            self.client.eval('_LogAttach(%r, [%r], [%r])' %
                             (desc, remotefn, newname))
        self.timer.start(750)
Exemplo n.º 20
0
    def on_actionGenerate_triggered(self):
        def read_axes():
            ax1, ax2 = dlg._info[2], dlg._info[4]
            for (ax, box) in [(ax1, dlg.ax1Box), (ax2, dlg.ax2Box)]:
                if not ax:
                    continue
                x = self.client.eval('%s.read()' % ax, None)
                if x is None:
                    QMessageBox.warning(dlg, 'Error',
                                        'Could not read %s.' % ax)
                    return
                box.setText('%.1f' % x)

        def btn_toggled(checked):
            if checked:
                dlg._info = dlg.sender()._info
                ax1, ax2 = dlg._info[2], dlg._info[4]
                for ax, lbl, box, revbox in [
                        (ax1, dlg.ax1Lbl, dlg.ax1Box, dlg.ax1RevBox),
                        (ax2, dlg.ax2Lbl, dlg.ax2Box, None)
                ]:
                    if ax:
                        lbl.setText(ax)
                        lbl.show()
                        box.show()
                        if revbox:
                            revbox.show()
                            revbox.setText('%s starts at far end' % ax)
                    else:
                        lbl.hide()
                        box.hide()
                        if revbox:
                            revbox.hide()

        dlg = dialogFromUi(self, findResource(
            'nicos_mlz/kws1/gui/sampleconf_gen.ui'))
        dlg.ax1Box.setValidator(DoubleValidator(self))
        dlg.ax2Box.setValidator(DoubleValidator(self))
        dlg.readBtn.clicked.connect(read_axes)
        nrows = int(math.ceil(len(self.holder_info) / 2.0))
        row, col = 0, 0
        for name, info in self.holder_info:
            btn = QRadioButton(name, dlg)
            btn._info = info
            btn.toggled.connect(btn_toggled)
            dlg.optionFrame.layout().addWidget(btn, row, col)
            if (row, col) == (0, 0):
                btn.setChecked(True)
            row += 1
            if row == nrows:
                row = 0
                col += 1
        if not dlg.exec_():
            return
        rows, levels, ax1, dax1, ax2, dax2 = dlg._info
        sax1 = float(dlg.ax1Box.text()) if ax1 else 0
        sax2 = float(dlg.ax2Box.text()) if ax2 else 0
        if dlg.ax1RevBox.isChecked():
            dax1 = -dax1

        n = 0
        for i in range(levels):
            for j in range(rows):
                n += 1
                position = {}
                if ax1:
                    position[ax1] = round(sax1 + j * dax1, 1)
                if ax2:
                    position[ax2] = round(sax2 + i * dax2, 1)
                config = dict(
                    name = str(n),
                    comment = '',
                    detoffset = -335.0,
                    thickness = 1.0,
                    timefactor = 1.0,
                    aperture = (0, 0, 10, 10),
                    position = position,
                )
                self.configs.append(config)
        firstitem = None
        for config in self.configs:
            newitem = QListWidgetItem(config['name'], self.list)
            firstitem = firstitem or newitem
        # select the first item
        self.list.setCurrentItem(firstitem)
        self.on_list_itemClicked(firstitem)

        self.fileGroup.setEnabled(False)
        self.sampleGroup.setEnabled(True)
        self.dirty = True
Exemplo n.º 21
0
    def on_actionGenerate_triggered(self):
        def read_axes():
            ax1, ax2 = dlg._info[2], dlg._info[4]
            for (ax, box) in [(ax1, dlg.ax1Box), (ax2, dlg.ax2Box)]:
                if not ax:
                    continue
                x = self.client.eval('%s.read()' % ax, None)
                if x is None:
                    QMessageBox.warning(dlg, 'Error', f'Could not read {ax}.')
                    return
                box.setText(f'x:.1f')

        def btn_toggled(checked):
            if checked:
                dlg._info = dlg.sender()._info
                ax1, ax2 = dlg._info[2], dlg._info[4]
                for ax, lbl, box, revbox in [
                    (ax1, dlg.ax1Lbl, dlg.ax1Box, dlg.ax1RevBox),
                    (ax2, dlg.ax2Lbl, dlg.ax2Box, None)
                ]:
                    if ax:
                        lbl.setText(ax)
                        lbl.show()
                        box.show()
                        if revbox:
                            revbox.show()
                            revbox.setText(f'{ax} starts at far end')
                    else:
                        lbl.hide()
                        box.hide()
                        if revbox:
                            revbox.hide()

        if not self.holder_info:
            self.showError('Cannot auto-generate sample list as no sample '
                           'changers are defined')
            return

        dlg = dialogFromUi(
            self,
            findResource('nicos_ess/loki/gui/ui_files/sampleconf_gen.ui'))
        dlg.ax1Box.setValidator(DoubleValidator(self))
        dlg.ax2Box.setValidator(DoubleValidator(self))
        dlg.readBtn.clicked.connect(read_axes)
        n_rows = int(math.ceil(len(self.holder_info) / 2.0))
        row, col = 0, 0
        for name, info in self.holder_info:
            btn = QRadioButton(name, dlg)
            btn._info = info
            btn.toggled.connect(btn_toggled)
            dlg.optionFrame.layout().addWidget(btn, row, col)
            if (row, col) == (0, 0):
                btn.setChecked(True)
            row += 1
            if row == n_rows:
                row = 0
                col += 1
        if dlg.exec_() != QDialog.Accepted:
            return

        self._generate_configs(dlg)

        first_item = None
        for config in self.configs:
            new_item = QListWidgetItem(config['name'], self.list)
            first_item = first_item or new_item
        # select the first item
        self.list.setCurrentItem(first_item)
        self.on_list_itemClicked(first_item)

        self.sampleGroup.setEnabled(True)
        self.applyBtn.setEnabled(True)