Source code for PyMca5.PyMcaGui.pymca.McaCalibrationControlGUI

#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import sys
import os

from PyMca5.PyMcaGui import PyMcaQt as qt
QTVERSION = qt.qVersion()
if hasattr(qt, "QString"):
    QString = qt.QString
else:
    QString = qt.safe_str

from PyMca5 import PyMcaDirs

DEBUG = 0
[docs]class McaCalibrationControlGUI(qt.QWidget): sigMcaCalibrationControlGUISignal = qt.pyqtSignal(object) def __init__(self, parent=None, name=""): qt.QWidget.__init__(self, parent) if name is not None: self.setWindowTitle(name) self.lastInputDir = None self.build() self.connections()
[docs] def build(self): layout = qt.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.calbox = None self.calbut = None calibration = McaCalibrationControlLine(self) self.calbox = calibration.calbox self.calbut = calibration.calbut self.calinfo = McaCalibrationInfoLine(self) self.calmenu = qt.QMenu() self.calmenu.addAction(QString("Edit"), self._copysignal) self.calmenu.addAction(QString("Compute") ,self._computesignal) self.calmenu.addSeparator() self.calmenu.addAction(QString("Load") , self._loadsignal) self.calmenu.addAction(QString("Save") , self._savesignal) layout.addWidget(calibration) layout.addWidget(self.calinfo)
[docs] def connections(self):
#selection changed #self.connect(self.calbox,qt.SIGNAL("activated(const QString &)"), # self._calboxactivated) self.calbox.activated.connect(self._calboxactivated) self.calbut.clicked.connect(self._calbuttonclicked) def _calboxactivated(self, item=None): if DEBUG: item = qt.safe_str(item) print("Calibration box activated %s" % item) comboitem, combotext = self.calbox.getCurrent() self._emitpysignal(box=[comboitem,combotext], boxname='Calibration', event='activated') def _calbuttonclicked(self): if DEBUG: print("Calibration button clicked") self.calmenu.exec_(self.cursor().pos()) def _copysignal(self): comboitem,combotext = self.calbox.getCurrent() self._emitpysignal(button="CalibrationCopy", box=[comboitem,combotext], event='clicked') def _computesignal(self): comboitem,combotext = self.calbox.getCurrent() self._emitpysignal(button="Calibration", box=[comboitem,combotext], event='clicked') def _loadsignal(self): if self.lastInputDir is None: self.lastInputDir = PyMcaDirs.inputDir if self.lastInputDir is not None: if not os.path.exists(self.lastInputDir): self.lastInputDir = None self.lastInputFilter = "Calibration files (*.calib)\n" if sys.platform == "win32": windir = self.lastInputDir if windir is None: windir = os.getcwd() filename= qt.safe_str(qt.QFileDialog.getOpenFileName(self, "Load existing calibration file", windir, self.lastInputFilter)) else: windir = self.lastInputDir if windir is None:windir = os.getcwd() filename = qt.QFileDialog(self) filename.setWindowTitle("Load existing calibration file") filename.setModal(1) if hasattr(qt, "QStringList"): strlist = qt.QStringList() else: strlist = [] tmp = [self.lastInputFilter.replace("\n","")] for filetype in tmp: strlist.append(filetype.replace("(","").replace(")","")) filename.setFilters(strlist) filename.setFileMode(qt.QFileDialog.ExistingFile) filename.setDirectory(windir) ret = filename.exec_() if ret: if len(filename.selectedFiles()): filename = qt.safe_str(filename.selectedFiles()[0]) else: return else: return if not len(filename): return if len(filename) < 6: filename = filename + ".calib" elif filename[-6:] != ".calib": filename = filename + ".calib" self.lastInputDir = os.path.dirname(filename) comboitem,combotext = self.calbox.getCurrent() self._emitpysignal(button="CalibrationLoad", box=[comboitem,combotext], line_edit = filename, event='clicked') def _savesignal(self): if self.lastInputDir is None: self.lastInputDir = PyMcaDirs.outputDir if self.lastInputDir is not None: if not os.path.exists(self.lastInputDir): self.lastInputDir = None self.lastInputFilter = "Calibration files (*.calib)\n" if sys.platform == "win32": windir = self.lastInputDir if windir is None: windir = "" filename= qt.safe_str(qt.QFileDialog.getSaveFileName(self, "Save a new calibration file", windir, self.lastInputFilter)) else: windir = self.lastInputDir if windir is None:windir = os.getcwd() filename = qt.QFileDialog(self) filename.setWindowTitle("Save a new calibration file") filename.setModal(1) if hasattr(qt, "QStringList"): strlist = qt.QStringList() else: strlist = [] tmp = [self.lastInputFilter.replace("\n","")] for filetype in tmp: strlist.append(filetype.replace("(","").replace(")","")) filename.setFilters(strlist) filename.setFileMode(qt.QFileDialog.AnyFile) filename.setDirectory(windir) ret = filename.exec_() if ret: if len(filename.selectedFiles()): filename = qt.safe_str(filename.selectedFiles()[0]) else: return else: return if not len(filename): return if len(filename) < 6: filename = filename + ".calib" elif filename[-6:] != ".calib": filename = filename + ".calib" self.lastInputDir = os.path.dirname(filename) PyMcaDirs.outputDir = os.path.dirname(filename) comboitem,combotext = self.calbox.getCurrent() self._emitpysignal(button="CalibrationSave", box=[comboitem,combotext], line_edit = filename, event='clicked') def _emitpysignal(self,button=None, box=None, boxname=None, checkbox=None, line_edit=None, event=None): if DEBUG: print("_emitpysignal called ",button,box) data={} data['button'] = button data['box'] = box data['checkbox'] = checkbox data['line_edit'] = line_edit data['event'] = event data['boxname'] = boxname self.sigMcaCalibrationControlGUISignal.emit(data)
[docs]class McaCalibrationControlLine(qt.QWidget): def __init__(self, parent=None, name=None, calname="", caldict = None): if caldict is None: caldict = {} qt.QWidget.__init__(self, parent) if name is not None: self.setWindowTitle(name) self.l = qt.QHBoxLayout(self) self.l.setContentsMargins(0, 0, 0, 0) self.l.setSpacing(0) self.build()
[docs] def build(self): widget = self callabel = qt.QLabel(widget) callabel.setText(str("<b>%s</b>" % 'Calibration')) self.calbox = SimpleComboBox(widget, options=['None', 'Original (from Source)', 'Internal (from Source OR PyMca)']) self.calbox.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed)) self.calbut = qt.QPushButton(widget) self.calbut.setText('Calibrate') self.calbut.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed)) self.l.addWidget(callabel) self.l.addWidget(self.calbox) self.l.addWidget(self.calbut)
[docs]class McaCalibrationInfoLine(qt.QWidget): def __init__(self, parent=None, name=None, calname="", caldict = None): if caldict is None: caldict = {} qt.QWidget.__init__(self, parent) if name is not None:self.setWindowTitle(name) self.caldict=caldict if calname not in self.caldict.keys(): self.caldict[calname] = {} self.caldict[calname]['order'] = 1 self.caldict[calname]['A'] = 0.0 self.caldict[calname]['B'] = 1.0 self.caldict[calname]['C'] = 0.0 self.currentcal = calname self.build() self.setParameters(self.caldict[calname])
[docs] def build(self): layout= qt.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) parw = self self.lab= qt.QLabel("<nobr><b>Active Curve Uses</b></nobr>", parw) layout.addWidget(self.lab) lab= qt.QLabel("A:", parw) layout.addWidget(lab) self.AText= qt.QLineEdit(parw) self.AText.setReadOnly(1) layout.addWidget(self.AText) lab= qt.QLabel("B:", parw) layout.addWidget(lab) self.BText= qt.QLineEdit(parw) self.BText.setReadOnly(1) layout.addWidget(self.BText) lab= qt.QLabel("C:", parw) layout.addWidget(lab) self.CText= qt.QLineEdit(parw) self.CText.setReadOnly(1) layout.addWidget(self.CText)
[docs] def setParameters(self, pars, name = None): if name is not None: self.currentcal = name if 'order' in pars: order = pars['order'] elif pars["C"] != 0.0: order = 2 else: order = 1 self.AText.setText("%.8g" % pars["A"]) self.BText.setText("%.8g" % pars["B"]) self.CText.setText("%.8g" % pars["C"]) """ if pars['order'] > 1: self.orderbox.setCurrentItem(1) self.CText.setReadOnly(0) else: self.orderbox.setCurrentItem(0) self.CText.setReadOnly(1) """ self.caldict[self.currentcal]["A"] = pars["A"] self.caldict[self.currentcal]["B"] = pars["B"] self.caldict[self.currentcal]["C"] = pars["C"] self.caldict[self.currentcal]["order"] = order
[docs]class SimpleComboBox(qt.QComboBox): def __init__(self, parent=None, name=None, options=['1','2','3']): qt.QComboBox.__init__(self,parent) self.setOptions(options)
[docs] def setOptions(self,options=['1','2','3']): self.clear() for item in options: self.addItem(item)
[docs] def getCurrent(self): return self.currentIndex(), qt.safe_str(self.currentText())
if __name__ == '__main__': app = qt.QApplication(sys.argv) demo = McaCalibrationControlGUI() demo.show() app.exec_()