2
__revision__ = "$Revision: 2.02 $"
3
#/*##########################################################################
4
# Copyright (C) 2004-2010 European Synchrotron Radiation Facility
6
# This file is part of the PyMCA X-ray Fluorescence Toolkit developed at
7
# the ESRF by the Beamline Instrumentation Software Support (BLISS) group.
9
# This toolkit is free software; you can redistribute it and/or modify it
10
# under the terms of the GNU General Public License as published by the Free
11
# Software Foundation; either version 2 of the License, or (at your option)
14
# PyMCA is distributed in the hope that it will be useful, but WITHOUT ANY
15
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
19
# You should have received a copy of the GNU General Public License along with
20
# PyMCA; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
21
# Suite 330, Boston, MA 02111-1307, USA.
23
# PyMCA follows the dual licensing model of Trolltech's Qt and Riverbank's PyQt
24
# and cannot be used as a free plugin for a non-free program.
26
# Please contact the ESRF industrial unit (industry@esrf.fr) if this license
27
# is a problem for you.
28
#############################################################################*/
29
import sys, getopt, string
30
nativeFileDialogs = None
31
if __name__ == '__main__':
33
longoptions = ['spec=','shm=','debug=', 'qt=', 'nativefiledialogs=']
35
opts, args = getopt.getopt(
39
except getopt.error,msg:
48
keywords['spec'] = arg
49
elif opt in ('--shm'):
51
elif opt in ('--debug'):
57
elif opt in ('--nativefiledialogs'):
59
nativeFileDialogs = True
61
nativeFileDialogs = False
66
from PyMcaMdi import qt
68
QTVERSION = qt.qVersion()
70
from PyMca_Icons import IconDict
71
from PyMca_help import HelpDict
74
if (QTVERSION < '4.0.0') and ((sys.platform == 'darwin') or (QTVERSION < '3.0.0')):
75
class SplashScreen(qt.QWidget):
76
def __init__(self,parent=None,name="SplashScreen",
77
fl=qt.Qt.WStyle_Customize | qt.Qt.WDestructiveClose,
79
qt.QWidget.__init__(self,parent,name,fl)
80
self.setCaption("PyMCA %s" % __version__)
81
layout = qt.QVBoxLayout(self)
83
label = qt.QLabel(self)
84
if pixmap is not None:label.setPixmap(pixmap)
85
else:label.setText("Hello")
86
self.bottomText = qt.QLabel(self)
88
def message(self, text):
89
font = self.bottomText.font()
91
self.bottomText.setFont(font)
92
self.bottomText.setText(text)
93
self.bottomText.show()
97
if __name__ == "__main__":
98
app = qt.QApplication(sys.argv)
99
if qt.qVersion >= '3.0.0':
100
strlist = qt.QStyleFactory.keys()
101
if sys.platform == "win32":
104
if text == "WindowsXP":
105
style = qt.QStyleFactory.create(item)
108
if 1 or QTVERSION < '4.0.0':
109
winpalette = qt.QPalette(qt.QColor(230,240,249),qt.QColor(238,234,238))
110
app.setPalette(winpalette)
112
palette = app.palette()
113
role = qt.QPalette.Window #this is the background
114
palette.setColor(role, qt.QColor(238,234,238))
115
app.setPalette(palette)
117
mpath = os.path.dirname(PyMcaMdi.__file__)
118
if mpath[-3:] == "exe":
119
mpath = os.path.dirname(mpath)
120
if QTVERSION < '4.0.0':
121
qt.QMimeSourceFactory.defaultFactory().addFilePath(mpath)
122
if (sys.platform == 'darwin') or (qt.qVersion() < '3.0.0'):
123
pixmap = qt.QPixmap('PyMcaSplashImage.png')
124
splash = SplashScreen(pixmap=pixmap)
125
splash.message( 'PyMCA version %s\n' % __version__)
127
pixmap = qt.QPixmap.fromMimeSource('PyMcaSplashImage.png')
128
splash = qt.QSplashScreen(pixmap)
133
splash.message( 'PyMCA %s' % __version__,
134
qt.Qt.AlignLeft|qt.Qt.AlignBottom,
137
fname = os.path.join(mpath,'PyMcaSplashImage.png')
138
if not os.path.exists(fname):
139
while len(mpath) > 3:
140
fname = os.path.join(mpath,'PyMcaSplashImage.png')
141
if not os.path.exists(fname):
142
mpath = os.path.dirname(mpath)
145
if os.path.exists(fname):
146
pixmap = qt.QPixmap(qt.QString(fname))
147
splash = qt.QSplashScreen(pixmap)
149
splash = qt.QSplashScreen()
155
splash.showMessage( 'PyMCA %s' % __version__,
156
qt.Qt.AlignLeft|qt.Qt.AlignBottom,
158
if sys.platform == "darwin":
159
qt.qApp.processEvents()
164
if QTVERSION > '4.0.0':
165
import PyMcaImageWindow
167
#This is to make sure it is properly frozen
168
#and that Object3D is fully supported
170
import PyQt4.QtOpenGL
171
#import Object3D.SceneGLWindow as SceneGLWindow
172
import PyMcaGLWindow as SceneGLWindow
178
import PeakIdentifier
180
###########import Fit2Spec
183
if QTVERSION > '4.0.0':
185
import QEDFStackWidget
189
import PyMcaPostBatch
191
import MaterialEditor
197
if QTVERSION > '4.3.0':
205
SOURCESLIST = QDispatcher.QDataSource.source_types.keys()
209
SOURCES = {"SpecFile":{'widget':SpecFileSelector.SpecFileSelector,'data':SpecFileLayer.SpecFileLayer},
210
"EdfFile":{'widget':EdfFileSelector.EdfFileSelector,'data':EdfFileLayer.EdfFileLayer}}
212
SOURCESLIST = ["SpecFile","EdfFile"]
214
if (sys.platform != 'win32') and (sys.platform != 'darwin'):
215
import MySPSSelector as SPSSelector
216
SOURCES["SPS"] = {'widget':SPSSelector.SPSSelector,'data':SPSLayer.SPSLayer}
217
SOURCESLIST.append("SPS")
220
class PyMca(PyMcaMdi.PyMca):
221
def __init__(self, parent=None, name="PyMca", fl=None,**kw):
222
if QTVERSION < '4.0.0':
223
if fl is None:qt.Qt.WDestructiveClose
224
PyMcaMdi.PyMca.__init__(self, parent, name, fl)
225
self.setCaption(name)
226
self.setIcon(qt.QPixmap(IconDict['gioconda16']))
227
self.menuBar().setIcon(qt.QPixmap(IconDict['gioconda16']))
229
if fl is None: fl = qt.Qt.WA_DeleteOnClose
230
PyMcaMdi.PyMca.__init__(self, parent, name, fl)
231
maxheight = qt.QDesktopWidget().height()
233
self.setMinimumHeight(int(0.8*maxheight))
234
self.setMaximumHeight(int(0.9*maxheight))
235
self.setWindowTitle(name)
236
self.setWindowIcon(qt.QIcon(qt.QPixmap(IconDict['gioconda16'])))
237
self.changeLog = None
239
self._widgetDict = {}
240
self.initSourceBrowser()
243
self.elementsInfo= None
244
self.attenuationTool = None
245
self.identifier = None
247
self.__mca2Edf = None
248
self.__fit2Spec = None
249
self.__correlator = None
250
self.__imagingTool = None
251
if QTVERSION < '4.0.0':
252
self.openMenu = qt.QPopupMenu()
253
self.openMenu.insertItem("PyMca Configuration",0)
254
self.openMenu.insertItem("Data Source",1)
255
self.connect(self.openMenu,qt.SIGNAL('activated(int)'),self.openSource)
257
self.openMenu = qt.QMenu()
258
self.openMenu.addAction("PyMca Configuration", self.openSource)
259
self.openMenu.addAction("Data Source",
260
self.sourceWidget.sourceSelector._openFileSlot)
261
#self.connect(self.openMenu,qt.SIGNAL('activated(int)'),self.openSource)
263
if QTVERSION > '4.0.0':
264
self.__useTabWidget = True
266
self.__useTabWidget = False
268
if not self.__useTabWidget:
269
self.mcawindow = McaWindow.McaWidget(self.mdi)
270
self.scanwindow = ScanWindow.ScanWindow(self.mdi)
271
self.imageWindowDict = None
272
self.connectDispatcher(self.mcawindow, self.sourceWidget)
273
self.connectDispatcher(self.scanwindow, self.sourceWidget)
274
if QTVERSION < '4.0.0':
277
self.mdi.addWindow(self.mcawindow)
278
self.mdi.addWindow(self.scanwindow)
279
#self.scanwindow.showMaximized()
280
#self.mcawindow.showMaximized()
282
if QTVERSION < '4.0.0':
283
self.mainTabWidget = qt.QTabWidget(self.mdi)
284
self.mainTabWidget.setCaption("Main Window")
285
self.mcawindow = McaWindow.McaWidget()
286
self.scanwindow = ScanWindow.ScanWindow()
287
self.mainTabWidget.addTab(self.mcawindow, "MCA")
288
self.mainTabWidget.addTab(self.scanwindow, "SCAN")
289
#self.mdi.addWindow(self.mainTabWidget)
290
self.mainTabWidget.showMaximized()
292
self.connectDispatcher(self.mcawindow, self.sourceWidget)
293
self.connectDispatcher(self.scanwindow, self.sourceWidget)
295
self.imageWindowDict = {}
296
self.imageWindowCorrelator = None
297
self.connect(self.sourceWidget,
298
qt.PYSIGNAL("addSelection"),
299
self.dispatcherAddSelectionSlot)
300
self.connect(self.sourceWidget,
301
qt.PYSIGNAL("removeSelection"),
302
self.dispatcherRemoveSelectionSlot)
303
self.connect(self.sourceWidget,
304
qt.PYSIGNAL("replaceSelection"),
305
self.dispatcherReplaceSelectionSlot)
306
self.connect(self.mainTabWidget,
307
qt.SIGNAL("currentChanged(QWidget*)"),
308
self.currentTabIndexChanged)
310
self.mainTabWidget = qt.QTabWidget(self.mdi)
311
self.mainTabWidget.setWindowTitle("Main Window")
312
self.mcawindow = McaWindow.McaWidget()
313
self.scanwindow = ScanWindow.ScanWindow()
315
self.glWindow = SceneGLWindow.SceneGLWindow()
316
self.mainTabWidget.addTab(self.mcawindow, "MCA")
317
self.mainTabWidget.addTab(self.scanwindow, "SCAN")
319
self.mainTabWidget.addTab(self.glWindow, "OpenGL")
320
self.mdi.addWindow(self.mainTabWidget)
321
#print "Markus patch"
322
#self.mainTabWidget.show()
323
#print "end Markus patch"
324
self.mainTabWidget.showMaximized()
326
self.connectDispatcher(self.mcawindow, self.sourceWidget)
327
self.connectDispatcher(self.scanwindow, self.sourceWidget)
329
self.imageWindowDict = {}
330
self.imageWindowCorrelator = None
331
self.connect(self.sourceWidget,
332
qt.SIGNAL("addSelection"),
333
self.dispatcherAddSelectionSlot)
334
self.connect(self.sourceWidget,
335
qt.SIGNAL("removeSelection"),
336
self.dispatcherRemoveSelectionSlot)
337
self.connect(self.sourceWidget,
338
qt.SIGNAL("replaceSelection"),
339
self.dispatcherReplaceSelectionSlot)
340
self.connect(self.mainTabWidget,
341
qt.SIGNAL("currentChanged(int)"),
342
self.currentTabIndexChanged)
345
if QTVERSION < '4.0.0':
346
self.connect(self.sourceWidget,
347
qt.PYSIGNAL("otherSignals"),
348
self.dispatcherOtherSignalsSlot)
350
self.connect(self.sourceWidget,
351
qt.SIGNAL("otherSignals"),
352
self.dispatcherOtherSignalsSlot)
354
if QTVERSION < '4.0.0':
355
self.connect(self.mcawindow,qt.PYSIGNAL('McaWindowSignal'),
356
self.__McaWindowSignal)
358
self.connect(self.mcawindow,qt.SIGNAL('McaWindowSignal'),
359
self.__McaWindowSignal)
360
if kw.has_key('shm'):
361
if len(kw['shm']) >= 8:
362
if kw['shm'][0:8] in ['MCA_DATA', 'XIA_DATA']:
363
self.mcawindow.showMaximized()
366
self.mcawindow.showMaximized()
367
currentConfigDict = ConfigDict.ConfigDict()
368
defaultFileName = self.__getDefaultSettingsFile()
369
self.configDir = os.path.dirname(defaultFileName)
370
if not kw.has_key('fresh'):
371
if os.path.exists(defaultFileName):
372
currentConfigDict.read(defaultFileName)
373
self.setConfig(currentConfigDict)
374
if kw.has_key('spec') and kw.has_key('shm'):
375
if len(kw['shm']) >= 8:
376
#if kw['shm'][0:8] in ['MCA_DATA', 'XIA_DATA']:
377
if kw['shm'][0:8] in ['MCA_DATA']:
378
#self.mcawindow.showMaximized()
380
self._startupSelection(source=kw['spec'],
383
self._startupSelection(source=kw['spec'],
386
self._startupSelection(source=kw['spec'],
389
def connectDispatcher(self, viewer, dispatcher = None):
390
#I could connect sourceWidget to myself and then
391
#pass the selections to the active window!!
392
#That will be made in a next iteration I guess
393
if dispatcher is None: dispatcher = self.sourceWidget
394
if QTVERSION < '4.0.0':
395
self.connect(dispatcher, qt.PYSIGNAL("addSelection"),
396
viewer._addSelection)
397
self.connect(dispatcher, qt.PYSIGNAL("removeSelection"),
398
viewer._removeSelection)
399
self.connect(dispatcher, qt.PYSIGNAL("replaceSelection"),
400
viewer._replaceSelection)
402
self.connect(dispatcher, qt.SIGNAL("addSelection"),
403
viewer._addSelection)
404
self.connect(dispatcher, qt.SIGNAL("removeSelection"),
405
viewer._removeSelection)
406
self.connect(dispatcher, qt.SIGNAL("replaceSelection"),
407
viewer._replaceSelection)
409
def currentTabIndexChanged(self, index):
410
if QTVERSION < '4.0.0':
411
#is not an index but a widget
412
index = self.mainTabWidget.indexOf(index)
413
legend = str(self.mainTabWidget.label(index))
415
legend = str(self.mainTabWidget.tabText(index))
416
for key in self.imageWindowDict.keys():
417
if key == legend:value = True
419
self.imageWindowDict[key].setPlotEnabled(value)
421
def _is2DSelection(self, ddict):
422
if ddict.has_key('imageselection'):
423
if ddict['imageselection']:
427
def _is3DSelection(self, ddict):
428
if self._is2DSelection(ddict):
431
if ddict.has_key('selection'):
432
if ddict['selection'] is None:
434
if ddict['selection'].has_key('selectiontype'):
435
if ddict['selection']['selectiontype'] == '3D':
438
if ddict['selection'].has_key('x'):
439
if ddict['selection']['x'] is not None:
440
if len(ddict['selection']['x']) > 1:
444
def dispatcherAddSelectionSlot(self, ddict):
445
if self.__useTabWidget:
446
if self.mainTabWidget.isHidden():
447
#make sure it is visible in case of being closed
448
self.mainTabWidget.show()
450
return self._dispatcherAddSelectionSlot(ddict)
452
return self._dispatcherAddSelectionSlot(ddict)
454
msg = qt.QMessageBox(self)
455
msg.setIcon(qt.QMessageBox.Critical)
456
msg.setText("Error: %s" % sys.exc_info()[1])
457
if QTVERSION < '4.0.0':
462
def _dispatcherAddSelectionSlot(self, ddict):
464
print "self.dispatcherAddSelectionSlot(ddict), ddict = ",ddict
467
if self._is2DSelection(ddict):
468
if QTVERSION < '4.0.0':
470
print "For the time being, no Qt3 support"
472
if self.imageWindowCorrelator is None:
473
self.imageWindowCorrelator = RGBCorrelator.RGBCorrelator()
475
title = "ImageWindow RGB Correlator"
476
self.imageWindowCorrelator.setWindowTitle(title)
477
legend = ddict['legend']
478
if legend not in self.imageWindowDict.keys():
479
imageWindow = PyMcaImageWindow.PyMcaImageWindow(name = legend,
480
correlator = self.imageWindowCorrelator)
481
self.imageWindowDict[legend] = imageWindow
482
if QTVERSION > '4.0.0':
483
self.connect(imageWindow, qt.SIGNAL("addImageClicked"),
484
self.imageWindowCorrelator.addImageSlot)
485
self.connect(imageWindow, qt.SIGNAL("removeImageClicked"),
486
self.imageWindowCorrelator.removeImageSlot)
487
self.connect(imageWindow, qt.SIGNAL("replaceImageClicked"),
488
self.imageWindowCorrelator.replaceImageSlot)
489
self.mainTabWidget.addTab(imageWindow, legend)
491
self.mainTabWidget.addTab(self.imageWindowCorrelator,
493
self.imageWindowDict[legend].setPlotEnabled(False)
494
self.imageWindowDict[legend]._addSelection(ddict)
495
if QTVERSION < '4.0.0':
496
self.mainTabWidget.setCurrentPage(self.mainTab.indexOf(imageWindow))
498
self.mainTabWidget.setCurrentWidget(imageWindow)
499
#self.imageWindowDict[legend].setPlotEnabled(True)
501
if self.mainTabWidget.indexOf(self.imageWindowDict[legend]) < 0:
502
self.mainTabWidget.addTab(self.imageWindowDict[legend],
504
self.imageWindowDict[legend].setPlotEnabled(False)
505
self.imageWindowDict[legend]._addSelection(ddict)
506
if QTVERSION < '4.0.0':
507
self.mainTabWidget.setCurrentPage(self.mainTab.indexOf\
508
(self.imageWindowDict[legend]))
510
self.mainTabWidget.setCurrentWidget(self.imageWindowDict\
513
self.imageWindowDict[legend]._addSelection(ddict)
516
if ddict['dataobject'].info['selectiontype'] == "1D":
517
self.mcawindow._addSelection(ddict)
518
self.scanwindow._addSelection(ddict)
520
self.mainTabWidget.setCurrentWidget(self.glWindow)
521
self.glWindow._addSelection(ddict)
523
self.mcawindow._addSelection(ddict)
524
self.scanwindow._addSelection(ddict)
526
def dispatcherRemoveSelectionSlot(self, ddict):
528
return self._dispatcherRemoveSelectionSlot(ddict)
530
msg = qt.QMessageBox(self)
531
msg.setIcon(qt.QMessageBox.Critical)
532
msg.setText("Error: %s" % sys.exc_info()[1])
533
if QTVERSION < '4.0.0':
539
def _dispatcherRemoveSelectionSlot(self, ddict):
541
print "self.dispatcherRemoveSelectionSlot(ddict), ddict = ",ddict
543
if self._is2DSelection(ddict):
544
if QTVERSION < '4.0.0':
546
print "For the time being, no Qt3 support"
548
legend = ddict['legend']
549
if legend in self.imageWindowDict.keys():
550
index = self.mainTabWidget.indexOf(self.imageWindowDict[legend])
551
self.mainTabWidget.removeTab(index)
552
self.imageWindowDict[legend]._removeSelection(ddict)
553
elif self._is3DSelection(ddict):
554
self.glWindow._removeSelection(ddict)
556
self.mcawindow._removeSelection(ddict)
557
self.scanwindow._removeSelection(ddict)
559
def dispatcherReplaceSelectionSlot(self, ddict):
561
return self._dispatcherReplaceSelectionSlot(ddict)
563
msg = qt.QMessageBox(self)
564
msg.setIcon(qt.QMessageBox.Critical)
565
msg.setText("Error: %s" % sys.exc_info()[1])
566
if QTVERSION < '4.0.0':
571
def _dispatcherReplaceSelectionSlot(self, ddict):
573
print "self.dispatcherReplaceSelectionSlot(ddict), ddict = ",ddict
574
if self._is2DSelection(ddict):
575
if QTVERSION < '4.0.0':
577
print "For the time being, no Qt3 support"
579
legend = ddict['legend']
580
for key in self.imageWindowDict.keys():
581
index = self.mainTabWidget.indexOf(self.imageWindowDict[key])
582
if key == legend:continue
584
self.mainTabWidget.removeTab(index)
585
self.imageWindowDict[key]._removeSelection(ddict)
586
self.imageWindowDict[key].setPlotEnabled(False)
587
self.dispatcherAddSelectionSlot(ddict)
588
index = self.mainTabWidget.indexOf(self.imageWindowDict[key])
589
if index != self.mainTabWidget.currentIndex():
590
if QTVERSION < '4.0.0':
591
self.mainTabWidget.setCurrentPage(index)
593
self.mainTabWidget.setCurrentWidget(self.imageWindowDict[legend])
594
elif self._is3DSelection(ddict):
595
self.glWindow._replaceSelection(ddict)
597
self.mcawindow._replaceSelection(ddict)
598
self.scanwindow._replaceSelection(ddict)
600
def dispatcherOtherSignalsSlot(self, ddict):
601
if DEBUG:print "self.dispatcherOtherSignalsSlot(ddict), ddict = ",ddict
602
if not self.__useTabWidget:return
603
if ddict['event'] == "SelectionTypeChanged":
604
if QTVERSION < '4.0.0':
605
if ddict['SelectionType'].upper() == "COUNTERS":
606
index = self.mainTabWidget.indexOf(self.scanwindow)
607
self.mainTabWidget.setCurrentPage(index)
609
for i in range(self.mainTabWidget.count()):
610
if str(self.mainTabWidget.label(i)) == \
611
ddict['SelectionType']:
612
self.mainTabWidget.setCurrentPage(i)
614
if ddict['SelectionType'].upper() == "COUNTERS":
615
self.mainTabWidget.setCurrentWidget(self.scanwindow)
617
for i in range(self.mainTabWidget.count()):
618
if str(self.mainTabWidget.tabText(i)) == \
619
ddict['SelectionType']:
620
self.mainTabWidget.setCurrentIndex(i)
622
if ddict['event'] == "SourceTypeChanged":
625
if DEBUG:print "Unhandled dict"
627
def setConfig(self, configDict):
628
if configDict.has_key('PyMca'): self.__configurePyMca(configDict['PyMca'])
629
if configDict.has_key('ROI'): self.__configureRoi(configDict['ROI'])
630
if configDict.has_key('Elements'): self.__configureElements(configDict['Elements'])
631
if configDict.has_key('Fit'): self.__configureFit(configDict['Fit'])
632
if configDict.has_key('SimpleFit'):self.__configureSimpleFit(configDict['SimpleFit'])
637
d['PyMca']['VERSION'] = __version__
638
d['PyMca']['ConfigDir'] = self.configDir
639
d['PyMca']['nativeFileDialogs'] = PyMcaDirs.nativeFileDialogs
642
d['PyMca']['Geometry'] ={}
644
d['PyMca']['Geometry']['MainWindow'] = [r.x(), r.y(), r.width(), r.height()]
645
r = self.splitter.sizes()
646
d['PyMca']['Geometry']['Splitter'] = r
647
r = self.mcawindow.geometry()
648
d['PyMca']['Geometry']['McaWindow'] = [r.x(), r.y(), r.width(), r.height()]
649
r = self.mcawindow.graph.geometry()
650
d['PyMca']['Geometry']['McaGraph'] = [r.x(), r.y(), r.width(), r.height()]
652
d['PyMca']['Sources'] = {}
653
d['PyMca']['Sources']['lastFileFilter'] = self.sourceWidget.sourceSelector.lastFileFilter
654
for source in SOURCESLIST:
655
d['PyMca'][source] = {}
656
if self.sourceWidget.sourceSelector.lastInputDir is not None:
657
d['PyMca'][source]['lastInputDir'] = self.sourceWidget.sourceSelector.lastInputDir
659
PyMcaDirs.inputDir = self.sourceWidget.sourceSelector.lastInputDir
663
d['PyMca'][source]['lastInputDir'] = "None"
664
if source == "SpecFile":
665
d['PyMca'][source]['SourceName'] = []
666
for key in self.sourceWidget.sourceList:
667
if key.sourceType == source:
668
d['PyMca'][source]['SourceName'].append(key.sourceName)
669
elif source == "EdfFile":
670
d['PyMca'][source]['SourceName'] = []
671
for key in self.sourceWidget.sourceList:
672
if key.sourceType == source:
673
d['PyMca'][source]['SourceName'].append(key.sourceName)
674
#if key == "EDF Stack":
675
# d['PyMca'][source]['SourceName'].append(self.sourceWidget.selectorWidget[source]._edfstack)
677
# d['PyMca'][source]['SourceName'].append(self.sourceWidget.selectorWidget[source].mapComboName[key])
678
elif source == "HDF5":
679
d['PyMca'][source]['SourceName'] = []
680
for key in self.sourceWidget.sourceList:
681
if key.sourceType == source:
682
d['PyMca'][source]['SourceName'].append(key.sourceName)
683
selectorWidget = self.sourceWidget.selectorWidget[source]
684
if hasattr(selectorWidget,'setWidgetConfiguration'):
685
d['PyMca'][source]['WidgetConfiguration'] = selectorWidget.getWidgetConfiguration()
687
#d['PyMca'][source]['Selection'] = self.sourceWidget[source].getSelection()
690
roilist, roidict = self.mcawindow.roiwidget.getroilistanddict()
691
d['ROI']['roilist'] = roilist
692
d['ROI']['roidict'] = {}
693
d['ROI']['roidict'].update(roidict)
697
d['Elements']['Material'] = {}
698
d['Elements']['Material'].update(ElementsInfo.Elements.Material)
700
if self.mcawindow.advancedfit.configDir is not None:
701
d['Fit'] ['ConfigDir'] = self.mcawindow.advancedfit.configDir * 1
702
d['Fit'] ['Configuration'] = {}
703
d['Fit'] ['Configuration'].update(self.mcawindow.advancedfit.mcafit.configure())
704
d['Fit'] ['Information'] = {}
705
d['Fit'] ['Information'].update(self.mcawindow.advancedfit.info)
706
d['Fit'] ['LastFit'] = {}
707
d['Fit'] ['LastFit']['hidden'] = self.mcawindow.advancedfit.isHidden()
708
d['Fit'] ['LastFit']['xdata0'] = self.mcawindow.advancedfit.mcafit.xdata0
709
d['Fit'] ['LastFit']['ydata0'] = self.mcawindow.advancedfit.mcafit.ydata0
710
d['Fit'] ['LastFit']['sigmay0']= self.mcawindow.advancedfit.mcafit.sigmay0
711
d['Fit'] ['LastFit']['fitdone']= self.mcawindow.advancedfit._fitdone()
712
#d['Fit'] ['LastFit']['fitdone']= 1
713
#d['Fit'] ['LastFit']['xmin'] = self.mcawindow.advancedfit.mcafit.sigma0
714
#d['Fit'] ['LastFit']['xmax'] = self.mcawindow.advancedfit.mcafit.sigma0
717
def saveConfig(self, config, filename = None):
718
d = ConfigDict.ConfigDict()
721
filename = self.__getDefaultSettingsFile()
724
def __configurePyMca(self, dict):
725
if dict.has_key('ConfigDir'):
726
self.configDir = dict['ConfigDir']
728
if dict.has_key('Geometry'):
729
r = qt.QRect(*dict['Geometry']['MainWindow'])
732
if key in dict['Geometry'].keys():
733
self.splitter.setSizes(dict['Geometry'][key])
735
if key in dict['Geometry'].keys():
736
r = qt.QRect(*dict['Geometry']['McaWindow'])
737
self.mcawindow.setGeometry(r)
739
if key in dict['Geometry'].keys():
740
r = qt.QRect(*dict['Geometry']['McaGraph'])
741
self.mcawindow.graph.setGeometry(r)
743
qt.qApp.processEvents()
744
qt.qApp.postEvent(self, qt.QResizeEvent(qt.QSize(dict['Geometry']['MainWindow'][2]+1,
745
dict['Geometry']['MainWindow'][3]+1),
746
qt.QSize(dict['Geometry']['MainWindow'][2],
747
dict['Geometry']['MainWindow'][3])))
748
self.mcawindow.showMaximized()
750
PyMcaDirs.nativeFileDialogs = dict.get('nativeFileDialogs', True)
752
if dict.has_key('Sources'):
753
if dict['Sources'].has_key('lastFileFilter'):
754
self.sourceWidget.sourceSelector.lastFileFilter = dict['Sources']['lastFileFilter']
755
for source in SOURCESLIST:
756
if dict.has_key(source):
757
if dict[source].has_key('lastInputDir'):
758
if dict[source] ['lastInputDir'] != "None":
759
self.sourceWidget.sourceSelector.lastInputDir = dict[source] ['lastInputDir']
761
PyMcaDirs.inputDir = dict[source] ['lastInputDir']
764
if dict[source].has_key('SourceName'):
765
if type(dict[source]['SourceName']) != type([]):
766
dict[source]['SourceName'] = [dict[source]['SourceName'] * 1]
767
for SourceName in dict[source]['SourceName']:
770
if not os.path.exists(SourceName): continue
771
self.sourceWidget.sourceSelector.openFile(SourceName, justloaded =1)
773
#This event is not needed
775
ndict["event"] = "NewSourceSelected"
776
ndict["sourcelist"] = [SourceName]
777
self.sourceWidget._sourceSelectorSlot(ndict)
779
if source == "EdfFile":
780
self.sourceWidget.selectorWidget[source].openFile(SourceName, justloaded=1)
782
self.sourceWidget.selectorWidget[source].openFile(SourceName)
784
msg = qt.QMessageBox(self)
785
msg.setIcon(qt.QMessageBox.Critical)
786
msg.setText("Error: %s\n opening file %s" % (sys.exc_info()[1],SourceName ))
787
if QTVERSION < '4.0.0':
792
if dict[source].has_key('WidgetConfiguration'):
793
selectorWidget = self.sourceWidget.selectorWidget[source]
794
if hasattr(selectorWidget,'setWidgetConfiguration'):
796
selectorWidget.setWidgetConfiguration(dict[source]['WidgetConfiguration'])
798
msg = qt.QMessageBox(self)
799
msg.setIcon(qt.QMessageBox.Critical)
800
msg.setText("Error: %s\n configuring %s widget" % (sys.exc_info()[1], source ))
801
if QTVERSION < '4.0.0':
806
if dict[source].has_key('Selection'):
807
if type(dict[source]['Selection']) != type([]):
808
dict[source]['Selection'] = [dict[source]['Selection']]
809
if source == "EdfFile":
810
self.sourceWidget[source].setSelected(dict[source]['Selection'])
814
def __configureRoi(self, dict):
815
if dict.has_key('roidict'):
816
if dict.has_key('roilist'):
817
roilist = dict['roilist']
818
if type(roilist) != type([]):
820
roidict = dict['roidict']
821
self.mcawindow.roiwidget.fillfromroidict(roilist=roilist,
825
def __configureElements(self, dict):
826
if dict.has_key('Material'):
827
ElementsInfo.Elements.Material.update(dict['Material'])
829
def __configureFit(self, d):
830
if d.has_key('Configuration'):
831
self.mcawindow.advancedfit.mcafit.configure(d['Configuration'])
832
if not self.mcawindow.advancedfit.isHidden():
833
self.mcawindow.advancedfit._updateTop()
834
if d.has_key('ConfigDir'):
835
self.mcawindow.advancedfit.configDir = d['ConfigDir'] * 1
836
if False and d.has_key('LastFit'):
837
if (d['LastFit']['ydata0'] != None) and \
838
(d['LastFit']['ydata0'] != 'None'):
839
self.mcawindow.advancedfit.setdata(x=d['LastFit']['xdata0'],
840
y=d['LastFit']['ydata0'],
841
sigmay=d['LastFit']['sigmay0'],
843
if d['LastFit']['hidden'] == 'False':
844
self.mcawindow.advancedfit.show()
845
self.mcawindow.advancedfit.raiseW()
846
if d['LastFit']['fitdone']:
848
self.mcawindow.advancedfit.fit()
854
def __configureSimpleFit(self, dict):
857
def initMenuBar(self):
858
if self.options["MenuFile"]:
859
if QTVERSION < '4.0.0':
860
self.menuFile= qt.QPopupMenu(self.menuBar())
861
idx= self.menuFile.insertItem(self.Icons["fileopen"], qt.QString("&Open"), self.onOpen, qt.Qt.CTRL+qt.Qt.Key_O)
862
self.menuFile.setWhatsThis(idx, HelpDict["fileopen"])
863
idx= self.menuFile.insertItem(self.Icons["filesave"], "&Save as", self.onSaveAs, qt.Qt.CTRL+qt.Qt.Key_S)
864
self.menuFile.setWhatsThis(idx, HelpDict["filesave"])
865
self.menuFile.insertItem("Save &Defaults", self.onSave)
866
self.menuFile.insertSeparator()
867
idx= self.menuFile.insertItem(self.Icons["fileprint"], "&Print", self.onPrint, qt.Qt.CTRL+qt.Qt.Key_P)
868
self.menuFile.setWhatsThis(idx, HelpDict["fileprint"])
869
self.menuFile.insertSeparator()
870
self.menuFile.insertItem("&Quit", qt.qApp, qt.SLOT("closeAllWindows()"), qt.Qt.CTRL+qt.Qt.Key_Q)
871
self.menuBar().insertItem('&File',self.menuFile)
872
self.onInitMenuBar(self.menuBar())
877
self.actionOpen = qt.QAction(self)
878
self.actionOpen.setText(qt.QString("&Open"))
879
self.actionOpen.setIcon(self.Icons["fileopen"])
880
self.actionOpen.setShortcut(qt.Qt.CTRL+qt.Qt.Key_O)
881
self.connect(self.actionOpen, qt.SIGNAL("triggered(bool)"),
884
self.actionSaveAs = qt.QAction(self)
885
self.actionSaveAs.setText(qt.QString("&Save"))
886
self.actionSaveAs.setIcon(self.Icons["filesave"])
887
self.actionSaveAs.setShortcut(qt.Qt.CTRL+qt.Qt.Key_S)
888
self.connect(self.actionSaveAs, qt.SIGNAL("triggered(bool)"),
892
self.actionSave = qt.QAction(self)
893
self.actionSave.setText(qt.QString("Save &Default Settings"))
894
#self.actionSave.setIcon(self.Icons["filesave"])
895
#self.actionSave.setShortcut(qt.Qt.CTRL+qt.Qt.Key_S)
896
self.connect(self.actionSave, qt.SIGNAL("triggered(bool)"),
899
self.actionPrint = qt.QAction(self)
900
self.actionPrint.setText(qt.QString("&Print"))
901
self.actionPrint.setIcon(self.Icons["fileprint"])
902
self.actionPrint.setShortcut(qt.Qt.CTRL+qt.Qt.Key_P)
903
self.connect(self.actionPrint, qt.SIGNAL("triggered(bool)"),
907
self.actionQuit = qt.QAction(self)
908
self.actionQuit.setText(qt.QString("&Quit"))
909
#self.actionQuit.setIcon(self.Icons["fileprint"])
910
self.actionQuit.setShortcut(qt.Qt.CTRL+qt.Qt.Key_Q)
911
qt.QObject.connect(self.actionQuit,
912
qt.SIGNAL("triggered(bool)"),
914
qt.SLOT("closeAllWindows()"))
916
#self.menubar = qt.QMenuBar(self)
917
self.menuFile= qt.QMenu(self.menuBar())
918
self.menuFile.addAction(self.actionOpen)
919
self.menuFile.addAction(self.actionSaveAs)
920
self.menuFile.addAction(self.actionSave)
921
self.menuFile.addSeparator()
922
self.menuFile.addAction(self.actionPrint)
923
self.menuFile.addSeparator()
924
self.menuFile.addAction(self.actionQuit)
925
self.menuBar().addMenu(self.menuFile)
926
self.menuFile.setTitle("&File")
927
self.onInitMenuBar(self.menuBar())
929
if self.options["MenuTools"]:
930
if QTVERSION < '4.0.0':
931
self.menuTools= qt.QPopupMenu()
932
self.menuTools.setCheckable(1)
933
self.connect(self.menuTools, qt.SIGNAL("aboutToShow()"), self.menuToolsAboutToShow)
934
self.menuBar().insertItem("&Tools", self.menuTools)
936
self.menuTools= qt.QMenu()
937
#self.menuTools.setCheckable(1)
938
self.connect(self.menuTools, qt.SIGNAL("aboutToShow()"),
939
self.menuToolsAboutToShow)
940
self.menuTools.setTitle("&Tools")
941
self.menuBar().addMenu(self.menuTools)
943
if self.options["MenuWindow"]:
944
if QTVERSION < '4.0.0':
945
self.menuWindow= qt.QPopupMenu()
946
self.menuWindow.setCheckable(1)
947
self.connect(self.menuWindow, qt.SIGNAL("aboutToShow()"), self.menuWindowAboutToShow)
948
self.menuBar().insertItem("&Window", self.menuWindow)
950
self.menuWindow= qt.QMenu()
951
#self.menuWindow.setCheckable(1)
952
self.connect(self.menuWindow, qt.SIGNAL("aboutToShow()"), self.menuWindowAboutToShow)
953
self.menuWindow.setTitle("&Window")
954
self.menuBar().addMenu(self.menuWindow)
956
if self.options["MenuHelp"]:
957
if QTVERSION < '4.0.0':
958
self.menuHelp= qt.QPopupMenu(self)
959
self.menuHelp.insertItem("&Menu", self.onMenuHelp)
960
self.menuHelp.insertItem("&Data Display HOWTOs", self.onDisplayHowto)
961
self.menuHelp.insertItem("MCA &HOWTOs",self.onMcaHowto)
962
self.menuHelp.insertSeparator()
963
self.menuHelp.insertItem("&About", self.onAbout)
964
self.menuHelp.insertItem("About &Qt",self.onAboutQt)
965
self.menuBar().insertSeparator()
966
self.menuBar().insertItem("&Help", self.menuHelp)
967
self.menuBrowser = None
968
self.displayBrowser = None
969
self.mcaBrowser = None
971
self.menuHelp= qt.QMenu(self)
972
self.menuHelp.addAction("&Menu", self.onMenuHelp)
973
self.menuHelp.addAction("&Data Display HOWTOs", self.onDisplayHowto)
974
self.menuHelp.addAction("MCA &HOWTOs",self.onMcaHowto)
975
self.menuHelp.addSeparator()
976
self.menuHelp.addAction("&About", self.onAbout)
977
self.menuHelp.addAction("Changes", self.onChanges)
978
self.menuHelp.addAction("About &Qt",self.onAboutQt)
979
self.menuBar().addSeparator()
980
self.menuHelp.setTitle("&Help")
981
self.menuBar().addMenu(self.menuHelp)
982
self.menuBrowser = None
983
self.displayBrowser = None
984
self.mcaBrowser = None
987
def initSourceBrowser(self):
988
self.sourceFrame = qt.QWidget(self.splitter)
989
if QTVERSION < '4.0.0':
990
self.splitter.moveToFirst(self.sourceFrame)
992
self.splitter.insertWidget(0, self.sourceFrame)
993
self.sourceFrame.setWindowTitle("Source Selector")
994
self.sourceFrame.setWindowIcon(self.windowIcon())
995
#self.splitter.setResizeMode(self.sourceFrame,qt.QSplitter.KeepSize)
996
self.sourceFrameLayout = qt.QVBoxLayout(self.sourceFrame)
997
self.sourceFrameLayout.setMargin(0)
998
self.sourceFrameLayout.setSpacing(0)
999
#layout.setAutoAdd(1)
1001
sourceToolbar = qt.QWidget(self.sourceFrame)
1002
layout1 = qt.QHBoxLayout(sourceToolbar)
1003
#self.line1 = qt.QFrame(sourceToolbar,"line1")
1004
self.line1 = Line(sourceToolbar)
1005
self.line1.setFrameShape(qt.QFrame.HLine)
1006
self.line1.setFrameShadow(qt.QFrame.Sunken)
1007
self.line1.setFrameShape(qt.QFrame.HLine)
1008
layout1.addWidget(self.line1)
1009
#self.closelabel = qt.QLabel(sourceToolbar)
1010
self.closelabel = PixmapLabel(sourceToolbar)
1011
self.closelabel.setPixmap(qt.QPixmap(IconDict['close']))
1012
layout1.addWidget(self.closelabel)
1013
self.closelabel.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed))
1014
#self.sourceBrowserTab=qt.QTabWidget(self.sourceFrame)
1016
self.sourceFrameLayout.addWidget(sourceToolbar)
1018
if QTVERSION < '4.0.0':
1020
self.connect(self.line1,qt.PYSIGNAL("LineDoubleClickEvent"),self.sourceReparent)
1021
self.connect(self.closelabel,qt.PYSIGNAL("PixmapLabelMousePressEvent"),self.toggleSource)
1024
qt.QToolTip.add(self.line1,"DoubleClick toggles floating window mode")
1025
qt.QToolTip.add(self.closelabel,"Hides Source Area")
1028
self.connect(self.line1,qt.SIGNAL("LineDoubleClickEvent"),self.sourceReparent)
1029
self.connect(self.closelabel,qt.SIGNAL("PixmapLabelMousePressEvent"),self.toggleSource)
1032
self.line1.setToolTip("DoubleClick toggles floating window mode")
1033
self.closelabel.setToolTip("Hides Source Area")
1035
def sourceReparent(self,ddict = None):
1036
if self.sourceFrame.parent() is not None:
1037
if QTVERSION < '4.0.0':
1038
self.sourceFrame.reparent(None,self.cursor().pos(),1)
1039
self.splitter.moveToFirst(self.sourceFrame)
1041
self.sourceFrame.setParent(None)
1042
self.sourceFrame.move(self.cursor().pos())
1043
self.sourceFrame.show()
1045
if QTVERSION < '4.0.0':
1046
self.sourceFrame.reparent(self.splitter,qt.QPoint(),1)
1047
self.splitter.moveToFirst(self.sourceFrame)
1050
self.splitter.insertWidget(0, self.sourceFrame)
1052
self.sourceFrame.setParent(self.splitter)
1054
def initSource(self):
1055
self.sourceWidget = QDispatcher.QDispatcher(self.sourceFrame)
1056
self.sourceFrameLayout.addWidget(self.sourceWidget)
1058
def _startupSelection(self, source, selection):
1059
self.sourceWidget.sourceSelector.openSource(source)
1060
if selection is None:return
1062
if len(selection) >= 8:
1063
if selection[0:8] == "MCA_DATA":
1065
ddict['event'] = "addSelection"
1066
ddict['SourceName'] = source
1067
ddict['Key'] = selection
1068
ddict["selection"] = {'cols': {'y': [1], 'x': [0]}}
1069
ddict["legend"] = ddict['SourceName'] + ' %s.c.1' %selection
1070
ddict["SourceType"] = 'SPS'
1071
self.sourceWidget._addSelectionSlot([ddict])
1072
if QTVERSION < '4.0.0':
1073
self.mcawindow.control.calbox.setCurrentItem(2)
1075
self.mcawindow.control.calbox.setCurrentIndex(2)
1076
self.mcawindow.calibration = self.mcawindow.calboxoptions[2]
1077
self.mcawindow.control._calboxactivated("Internal")
1081
elif selection == "XIA_DATA":
1083
ddict['event'] = "addSelection"
1084
ddict['SourceName'] = "armando5"
1085
ddict['Key'] = selection
1086
ddict["selection"] = {'rows': {'y': [1], 'x': [0]}}
1087
ddict["legend"] = ddict['SourceName'] + ' XIA_DATA.c.1'
1088
ddict["SourceType"] = 'SPS'
1089
self.sourceWidget._addSelectionSlot([ddict])
1092
def menuToolsAboutToShow(self):
1094
print "menu ToolsAboutToShow"
1095
self.menuTools.clear()
1096
if QTVERSION < '4.0.0':
1097
if self.sourceFrame.isHidden():
1098
self.menuTools.insertItem("Show Source",self.toggleSource)
1100
self.menuTools.insertItem("Hide Source",self.toggleSource)
1101
#self.menuTools.insertItem("Choose Font",self.fontdialog)
1102
self.menuTools.insertItem("Elements Info",self.__elementsInfo)
1103
self.menuTools.insertItem("Identify Peaks",self.__peakIdentifier)
1104
self.menuTools.insertItem("Batch Fitting",self.__batchFitting)
1105
self.menuTools.insertItem("Convert Mca to Edf",self.__mca2EdfConversion)
1106
#self.menuTools.insertItem("Fit to Specfile",self.__fit2SpecConversion)
1108
self.menuTools.insertItem("ROI Imaging",self.__roiImaging)
1110
if self.sourceFrame.isHidden():
1111
self.menuTools.addAction("Show Source",self.toggleSource)
1113
self.menuTools.addAction("Hide Source",self.toggleSource)
1114
self.menuTools.addAction("Elements Info",self.__elementsInfo)
1115
self.menuTools.addAction("Material Transmission",self.__attTool)
1116
self.menuTools.addAction("Identify Peaks",self.__peakIdentifier)
1117
self.menuTools.addAction("Batch Fitting",self.__batchFitting)
1118
self.menuTools.addAction("Convert Mca to Edf",self.__mca2EdfConversion)
1119
#self.menuTools.addAction("Fit to Specfile",self.__fit2SpecConversion)
1120
self.menuTools.addAction("RGB Correlator",self.__rgbCorrelator)
1122
self.menuTools.addAction("ROI Imaging",self.__roiImaging)
1124
self.menuTools.addAction("XIA Correct",
1126
if DEBUG:"print Fit to Specfile missing"
1127
def fontdialog(self):
1128
fontd = qt.QFontDialog.getFont(self)
1130
qt.qApp.setFont(fontd[0],1)
1133
def toggleSource(self,**kw):
1135
print "toggleSource called"
1136
if self.sourceFrame.isHidden():
1137
self.sourceFrame.show()
1138
if QTVERSION < '4.0.0': self.sourceFrame.raiseW()
1139
else:self.sourceFrame.raise_()
1141
self.sourceFrame.hide()
1143
def __elementsInfo(self):
1144
if self.elementsInfo is None:self.elementsInfo=ElementsInfo.ElementsInfo(None,"Elements Info")
1145
if self.elementsInfo.isHidden():
1146
self.elementsInfo.show()
1147
if QTVERSION < '4.0.0': self.elementsInfo.raiseW()
1148
else:self.elementsInfo.raise_()
1150
def __attTool(self):
1151
if self.attenuationTool is None:
1152
self.attenuationTool = MaterialEditor.MaterialEditor(toolmode=True)
1153
if self.attenuationTool.isHidden():
1154
self.attenuationTool.show()
1155
self.attenuationTool.raise_()
1157
def __peakIdentifier(self):
1158
if self.identifier is None:
1159
self.identifier=PeakIdentifier.PeakIdentifier(energy=5.9,
1161
self.identifier.myslot()
1162
if self.identifier.isHidden():
1163
self.identifier.show()
1164
if QTVERSION < '4.0.0': self.identifier.raiseW()
1165
else:self.identifier.raise_()
1167
def __batchFitting(self):
1168
if self.__batch is None:self.__batch = PyMcaBatch.McaBatchGUI(fl=0,actions=1)
1169
if self.__batch.isHidden():self.__batch.show()
1170
if QTVERSION < '4.0.0': self.__batch.raiseW()
1171
else: self.__batch.raise_()
1173
def __mca2EdfConversion(self):
1174
if self.__mca2Edf is None:self.__mca2Edf = Mca2Edf.Mca2EdfGUI(fl=0,actions=1)
1175
if self.__mca2Edf.isHidden():self.__mca2Edf.show()
1176
if QTVERSION < '4.0.0': self.__mca2Edf.raiseW()
1177
else:self.__mca2Edf.raise_()
1179
def __fit2SpecConversion(self):
1180
if self.__fit2Spec is None:self.__fit2Spec = Fit2Spec.Fit2SpecGUI(fl=0,actions=1)
1181
if self.__fit2Spec.isHidden():self.__fit2Spec.show()
1182
if QTVERSION < '4.0.0': self.__fit2Spec.raiseW()
1183
else:self.__fit2Spec.raise_()
1185
def __rgbCorrelator(self):
1186
if self.__correlator is None:self.__correlator = []
1187
fileTypeList = ["Batch Result Files (*dat)",
1191
message = "Open ONE Batch result .dat file or SEVERAL EDF files"
1192
filelist = self.__getStackOfFiles(fileTypeList, message)
1193
if not(len(filelist)): return
1195
self.sourceWidget.sourceSelector.lastInputDir = os.path.dirname(filelist[0])
1196
PyMcaDirs.inputDir = os.path.dirname(filelist[0])
1197
self.__correlator.append(PyMcaPostBatch.PyMcaPostBatch())
1198
for correlator in self.__correlator:
1199
if correlator.isHidden():
1202
self.connect(self.__correlator[-1],
1203
qt.SIGNAL("RGBCorrelatorSignal"),
1204
self._deleteCorrelator)
1206
if len(filelist) == 1:
1207
correlator.addBatchDatFile(filelist[0])
1209
correlator.addFileList(filelist)
1211
def _deleteCorrelator(self, ddict):
1212
n = len(self.__correlator)
1213
if ddict['event'] == "RGBCorrelatorClosed":
1215
if id(self.__correlator[i]) == ddict["id"]:
1216
self.__correlator[i].deleteLater()
1217
del self.__correlator[i]
1220
def __getStackOfFiles(self, typelist, message = "", getfilter=False):
1221
wdir = PyMcaDirs.inputDir
1222
fileTypeList = typelist
1224
if QTVERSION < '4.0.0':
1226
for filetype in fileTypeList:
1227
filetypes += filetype+"\n"
1228
filelist = qt.QFileDialog.getOpenFileNames(filetypes,
1233
if not len(filelist):
1235
return [], filterused
1239
if PyMcaDirs.nativeFileDialogs:
1241
for filetype in fileTypeList:
1242
filetypes += filetype+"\n"
1243
filelist = qt.QFileDialog.getOpenFileNames(self,
1247
if not len(filelist):
1249
return [], filterused
1253
sample = str(filelist[0])
1254
for filetype in fileTypeList:
1255
ftype = filetype.replace("(", "").replace(")","")
1256
extensions = ftype.split()[2:]
1257
for extension in extensions:
1258
if sample.endswith(extension[-3:]):
1259
filterused = filetype
1262
fdialog = qt.QFileDialog(self)
1263
fdialog.setModal(True)
1264
fdialog.setWindowTitle(message)
1265
strlist = qt.QStringList()
1266
for filetype in fileTypeList:
1267
strlist.append(filetype.replace("(","").replace(")",""))
1268
fdialog.setFilters(strlist)
1269
fdialog.setFileMode(fdialog.ExistingFiles)
1270
fdialog.setDirectory(wdir)
1271
if QTVERSION > '4.3.0':
1272
history = fdialog.history()
1273
if len(history) > 6:
1274
fdialog.setHistory(history[-6:])
1275
ret = fdialog.exec_()
1276
if ret == qt.QDialog.Accepted:
1277
filelist = fdialog.selectedFiles()
1279
filterused = str(fdialog.selectedFilter())
1286
return [], filterused
1289
filelist = map(str, filelist)
1291
return filelist, filterused
1296
def __roiImaging(self):
1297
if self.__imagingTool is None:
1298
fileTypeList = ["EDF Files (*edf)",
1300
"Specfile Files (*mca)",
1301
"Specfile Files (*dat)",
1302
"OMNIC Files (*map)",
1303
"HDF5 Files (*.nxs *.hdf *.h5)",
1304
"AIFIRA Files (*DAT)",
1305
"SupaVisio Files (*pige *pixe *rbs)",
1307
if 'h5py' not in sys.modules:
1308
idx = fileTypeList.index("HDF5 Files (*.nxs *.hdf *.h5)")
1309
del fileTypeList[idx]
1310
message = "Open ONE indexed stack or SEVERAL files"
1311
filelist, filefilter = self.__getStackOfFiles(fileTypeList,
1314
if not(len(filelist)): return
1316
self.sourceWidget.sourceSelector.lastInputDir = os.path.dirname(filelist[0])
1317
PyMcaDirs.inputDir = os.path.dirname(filelist[0])
1319
if QTVERSION > '4.0.0':
1320
rgbWidget = PyMcaPostBatch.RGBCorrelator.RGBCorrelator(self.mdi)
1321
rgbWidget.setWindowTitle("ROI Imaging RGB Correlator")
1322
self.mdi.addWindow(rgbWidget)
1329
widget = QEDFStackWidget.QEDFStackWidget(mcawidget=self.mcawindow,
1330
rgbwidget=rgbWidget,
1332
widget.notifyCloseEventToWidget(self)
1333
self.__imagingTool = id(widget)
1334
self._widgetDict[self.__imagingTool] = widget
1340
if len(filelist) == 1:
1341
f = open(filelist[0])
1346
if line.startswith('Spectral'):
1348
elif line.startswith('#\tDate:'):
1350
elif "AIFIRA" == filefilter.split()[0].upper():
1352
elif "HDF5" == filefilter.split()[0].upper():
1354
elif "SupaVisio" == filefilter.split()[0]:
1356
elif filelist[0][-4:].upper() in ["PIGE", "PIGE"]:
1358
elif filelist[0][-3:].upper() in ["RBS"]:
1362
widget.setStack(QEDFStackWidget.OmnicMap.OmnicMap(filelist[0]))
1364
widget.setStack(QEDFStackWidget.LuciaMap.LuciaMap(filelist[0]))
1366
stack = QEDFStackWidget.AifiraMap.AifiraMap(filelist[0])
1367
masterStack = QEDFStackWidget.DataObject.DataObject()
1368
masterStack.info = QEDFStackWidget.copy.deepcopy(stack.info)
1369
masterStack.data = stack.data[:,:,0:1024]
1370
masterStack.info['Dim_2'] = int(masterStack.info['Dim_2'] / 2)
1372
slaveStack = QEDFStackWidget.DataObject.DataObject()
1373
slaveStack.info = QEDFStackWidget.copy.deepcopy(stack.info)
1374
slaveStack.data = stack.data[:,:, 1024:]
1375
slaveStack.info['Dim_2'] = int(slaveStack.info['Dim_2'] / 2)
1376
widget.setStack(masterStack)
1377
widget.slave = QEDFStackWidget.QEDFStackWidget(rgbwidget=widget.rgbWidget,
1379
widget.slave.setStack(slaveStack)
1380
widget.connectSlave(widget.slave)
1381
widget._resetSelection()
1382
widget.loadStackButton.hide()
1385
widget.setStack(QEDFStackWidget.SupaVisioMap.SupaVisioMap(filelist[0]))
1387
widget.setStack(QEDFStackWidget.QHDF5Stack1D.QHDF5Stack1D(filelist))
1389
widget.setStack(QEDFStackWidget.QStack(filelist))
1391
widget.setStack(QEDFStackWidget.QSpecFileStack(filelist))
1395
del self._widgetDict[self.__imagingTool]
1396
self.__imagingTool = None
1397
msg = qt.QMessageBox(self)
1398
msg.setIcon(qt.QMessageBox.Critical)
1399
msg.setText("Input Output Error: %s" % (sys.exc_info()[1]))
1400
if QTVERSION < '4.0.0':
1407
del self._widgetDict[self.__imagingTool]
1408
self.__imagingTool = None
1409
msg = qt.QMessageBox(self)
1410
msg.setIcon(qt.QMessageBox.Critical)
1411
print "Error info = ",sys.exc_info()
1412
msg.setText("Unexpected Error: %s" % (sys.exc_info()[1]))
1413
if QTVERSION < '4.0.0':
1419
widget = self._widgetDict[self.__imagingTool]
1420
if widget.isHidden():
1425
def customEvent(self, event):
1426
if hasattr(event, 'dict'):
1428
if ddict.has_key('event'):
1429
if ddict['event'] == "closeEventSignal":
1430
if self._widgetDict.has_key(ddict['id']):
1431
if ddict['id'] == self.__imagingTool:
1432
self.__imagingTool = None
1433
del self._widgetDict[ddict['id']]
1435
def __xiaCorrect(self):
1436
XiaCorrect.mainGUI(qt.qApp)
1439
if QTVERSION < '4.0.0':
1440
self.openMenu.exec_loop(self.cursor().pos())
1442
self.openMenu.exec_(self.cursor().pos())
1448
if QTVERSION < '4.0.0':
1449
return self._onSaveAs()
1450
index = self.mainTabWidget.currentIndex()
1451
text = str(self.mainTabWidget.tabText(index))
1452
self.saveMenu = qt.QMenu()
1453
self.saveMenu.addAction("PyMca Configuration", self._onSaveAs)
1454
if text.upper() == 'MCA':
1455
self.saveMenu.addAction("Active Mca",
1456
self.mcawindow._saveIconSignal)
1457
elif text.upper() == 'SCAN':
1458
self.saveMenu.addAction("Active Scan",
1459
self.scanwindow._saveIconSignal)
1460
elif text in self.imageWindowDict.keys():
1461
self.saveMenu.addAction("Active Image",
1462
self.imageWindowDict[text].graphWidget._saveIconSignal)
1463
self.saveMenu.exec_(self.cursor().pos())
1465
def _onSaveAs(self):
1467
if QTVERSION < '4.0.0':
1468
outfile = qt.QFileDialog(self,"Output File Selection",1)
1469
outfile.setFilters('PyMca *.ini')
1470
outfile.setMode(outfile.AnyFile)
1472
outfile = qt.QFileDialog(self)
1473
outfile.setFilter('PyMca *.ini')
1474
outfile.setFileMode(outfile.AnyFile)
1475
outfile.setAcceptMode(qt.QFileDialog.AcceptSave)
1477
if os.path.exists(self.configDir):cwd =self.configDir
1478
if QTVERSION < '4.0.0': outfile.setDir(cwd)
1479
else: outfile.setDirectory(cwd)
1480
if QTVERSION < '4.0.0':ret = outfile.exec_loop()
1481
else:ret = outfile.exec_()
1483
filterused = str(outfile.selectedFilter()).split()
1485
if QTVERSION < '4.0.0':
1486
outdir=str(outfile.selectedFile())
1488
outdir=str(outfile.selectedFiles()[0])
1490
outputDir = os.path.dirname(outdir)
1494
outputFile = os.path.basename(outdir)
1496
outputFile = "PyMca.ini"
1503
#always overwrite for the time being
1504
if len(outputFile) < len(extension[:]):
1505
outputFile += extension[:]
1506
elif outputFile[-4:] != extension[:]:
1507
outputFile += extension[:]
1508
filename = os.path.join(outputDir, outputFile)
1509
if os.path.exists(filename):
1513
msg = qt.QMessageBox(self)
1514
msg.setIcon(qt.QMessageBox.Critical)
1515
msg.setText("Input Output Error: %s" % (sys.exc_info()[1]))
1516
if QTVERSION < '4.0.0':
1522
self._saveAs(filename)
1523
self.configDir = outputDir
1525
msg = qt.QMessageBox(self)
1526
msg.setIcon(qt.QMessageBox.Critical)
1527
msg.setText("Error Saving Configuration: %s" % (sys.exc_info()[1]))
1528
if QTVERSION < '4.0.0':
1534
def _saveAs(self, filename=None):
1535
if filename is None:filename = self.__getDefaultSettingsFile()
1536
self.saveConfig(self.getConfig(), filename)
1538
def __getDefaultSettingsFile(self):
1539
filename = "PyMca.ini"
1540
if sys.platform == 'win32':
1541
home = os.getenv('USERPROFILE')
1544
directory = os.path.join(home,"My Documents")
1550
if os.path.isdir('%s' % directory):
1551
directory = os.path.join(directory,"PyMca")
1553
#print "My Documents is not there"
1554
directory = os.path.join(home,"PyMca")
1555
if not os.path.exists('%s' % directory):
1556
#print "PyMca directory not present"
1557
os.mkdir('%s' % directory)
1559
finalfile = os.path.join(directory, filename)
1562
home = os.getenv('HOME')
1563
directory = os.path.join(home,"PyMca")
1564
if not os.path.exists('%s' % directory):
1565
os.mkdir('%s' % directory)
1566
finalfile = os.path.join(directory, filename)
1569
def openSource(self,index=0):
1571
print "index = ",index
1573
if QTVERSION < '4.0.0':
1574
outfile = qt.QFileDialog(self,"Select PyMca Configuration File",1)
1575
if os.path.exists(self.configDir):
1576
outfile.setDir(self.configDir)
1577
outfile.setFilters('PyMca *.ini')
1578
outfile.setMode(outfile.ExistingFile)
1579
ret = outfile.exec_loop()
1581
outfile = qt.QFileDialog(self)
1582
outfile.setWindowTitle("Select PyMca Configuration File")
1583
if os.path.exists(self.configDir):
1584
outfile.setDirectory(self.configDir)
1585
outfile.setFilters(['PyMca *.ini'])
1586
outfile.setFileMode(outfile.ExistingFile)
1587
ret = outfile.exec_()
1589
if QTVERSION < '4.0.0':filename=str(outfile.selectedFile())
1590
else:filename=str(outfile.selectedFiles()[0])
1597
currentConfigDict = ConfigDict.ConfigDict()
1598
self.configDir = os.path.dirname(filename)
1599
currentConfigDict.read(filename)
1600
self.setConfig(currentConfigDict)
1604
source = SOURCESLIST[index]
1605
if self.sourceFrame.isHidden():
1606
self.sourceFrame.show()
1607
if QTVERSION < '4.0.0':self.sourceFrame.raiseW()
1608
else:self.sourceFrame.raise_()
1609
self.sourceBrowserTab.showPage(self.sourceWidget[source])
1610
qt.qApp.processEvents()
1611
self.sourceWidget[source].openFile()
1613
def onMenuHelp(self):
1614
if self.menuBrowser is None:
1615
self.menuBrowser= qt.QTextBrowser()
1616
if QTVERSION < '4.0.0':
1617
self.menuBrowser.setCaption(qt.QString("Main Menu Help"))
1619
self.menuBrowser.setWindowTitle(qt.QString("Main Menu Help"))
1620
dir=os.path.dirname(PyMcaMdi.__file__)
1621
if not os.path.exists(os.path.join(dir,"HTML","Menu.html")):
1622
dir = os.path.dirname(dir)
1623
if QTVERSION < '4.0.0':
1624
self.menuBrowser.mimeSourceFactory().addFilePath(qt.QString(dir+"/HTML"))
1625
self.menuBrowser.setSource(qt.QString("Menu.html"))
1627
self.menuBrowser.setSearchPaths([os.path.join(dir,"HTML")])
1628
self.menuBrowser.setSource(qt.QUrl(qt.QString("Menu.html")))
1629
self.menuBrowser.show()
1630
if self.menuBrowser.isHidden():self.menuBrowser.show()
1631
if QTVERSION < '4.0.0': self.menuBrowser.raiseW()
1632
else: self.menuBrowser.raise_()
1634
def onDisplayHowto(self):
1635
if self.displayBrowser is None:
1636
self.displayBrowser= qt.QTextBrowser()
1637
if QTVERSION < '4.0.0':
1638
self.displayBrowser.setCaption(qt.QString("Data Display HOWTO"))
1640
self.displayBrowser.setWindowTitle(qt.QString("Data Display HOWTO"))
1641
dir=os.path.dirname(PyMcaMdi.__file__)
1642
if not os.path.exists(os.path.join(dir,"HTML","Display-HOWTO.html")):
1643
dir = os.path.dirname(dir)
1644
if QTVERSION < '4.0.0':
1645
self.displayBrowser.mimeSourceFactory().addFilePath(qt.QString(dir+"/HTML"))
1646
self.displayBrowser.setSource(qt.QString("Display-HOWTO.html"))
1648
self.displayBrowser.setSearchPaths([os.path.join(dir,"HTML")])
1649
self.displayBrowser.setSource(qt.QUrl(qt.QString("Display-HOWTO.html")))
1650
self.displayBrowser.show()
1651
if self.displayBrowser.isHidden():self.displayBrowser.show()
1652
if QTVERSION < '4.0.0':self.displayBrowser.raiseW()
1653
else:self.displayBrowser.raise_()
1655
def onMcaHowto(self):
1656
if self.mcaBrowser is None:
1657
self.mcaBrowser= MyQTextBrowser()
1658
if QTVERSION < '4.0.0':
1659
self.mcaBrowser.setCaption(qt.QString("MCA HOWTO"))
1661
self.mcaBrowser.setWindowTitle(qt.QString("MCA HOWTO"))
1662
dir=os.path.dirname(PyMcaMdi.__file__)
1663
if not os.path.exists(dir+"/HTML"+"/MCA-HOWTO.html"):
1664
dir = os.path.dirname(dir)
1665
if QTVERSION < '4.0.0':
1666
self.mcaBrowser.mimeSourceFactory().addFilePath(qt.QString(dir+"/HTML"))
1667
self.mcaBrowser.setSource(qt.QString("MCA-HOWTO.html"))
1669
self.mcaBrowser.setSearchPaths([os.path.join(dir,"HTML")])
1670
self.mcaBrowser.setSource(qt.QUrl(qt.QString("MCA-HOWTO.html")))
1671
#f = open(os.path.join(dir,"HTML","MCA-HOWTO.html"))
1672
#self.mcaBrowser.setHtml(f.read())
1674
self.mcaBrowser.show()
1675
if self.mcaBrowser.isHidden():self.mcaBrowser.show()
1676
if QTVERSION < '4.0.0':self.mcaBrowser.raiseW()
1677
else:self.mcaBrowser.raise_()
1680
qt.QMessageBox.about(self, "PyMca",
1681
"PyMca Application\nVersion: "+__version__)
1684
def onChanges(self):
1685
if self.changeLog is None:
1686
self.changeLog = qt.QTextEdit()
1687
self.changeLog.setCursor(self.cursor())
1688
self.changeLog.setWindowTitle("PyMCA %s Changes" % __version__)
1689
self.changeLog.setWindowIcon(qt.QIcon(qt.QPixmap(IconDict['gioconda16'])))
1690
mpath = os.path.dirname(PyMcaMdi.__file__)
1691
fname = os.path.join(mpath,'changelog.txt')
1692
if not os.path.exists(fname):
1693
while len(mpath) > 3:
1694
fname = os.path.join(mpath,'changelog.txt')
1695
#print "looking for ", fname
1696
if not os.path.exists(fname):
1697
mpath = os.path.dirname(mpath)
1700
if os.path.exists(fname):
1701
self.log = ChangeLog.ChangeLog(textfile='changelog.txt')
1702
self.changeLog.setDocument(self.log)
1703
self.changeLog.setMinimumWidth(500)
1705
self.log = ChangeLog.ChangeLog()
1706
self.log.setPlainText('Cannot find file changelog.txt')
1707
self.changeLog.show()
1710
print "Module name = ","PyMca",__revision__.replace("$","")
1711
print "Module name = ","PyQt ",qt.PYQT_VERSION_STR
1712
for module in sys.modules.values():
1714
if 'Revision' in module.__revision__:
1715
if module.__name__ != "__main__":
1716
print "Module name = ",module.__name__,module.__revision__.replace("$","")
1722
print "onPrint called"
1723
if self.scanwindow.hasFocus():
1724
self.scanwindow.graph.printps()
1726
self.mcawindow.show()
1727
if QTVERSION < '4.0.0':self.mcawindow.raiseW()
1728
else:self.mcawindow.raise_()
1729
self.mcawindow.graph.printps()
1731
def __McaWindowSignal(self,dict):
1732
if dict['event'] == 'NewScanCurve':
1733
if self.mcawindow.scanwindow.isHidden():
1734
self.mcawindow.scanwindow.show()
1735
self.mcawindow.scanwindow.setFocus()
1740
# GraphWindow operations
1742
def openGraph(self,name="MCA Graph"):
1744
Creates a new GraphWindow on the MDI
1746
self.setFollowActiveWindow(0)
1748
#name= self.__getNewGraphName()
1749
if name == "MCA Graph":
1750
graph= McaWindow.McaWindow(self.mdi, name=name)
1751
self.connect(graph, qt.SIGNAL("windowClosed()"), self.closeGraph)
1754
if len(self.mdi.windowList())==1:
1755
graph.showMaximized()
1756
else: self.windowTile()
1758
self.setFollowActiveWindow(1)
1760
def getActiveGraph(self):
1762
Return active GraphWindow instance or a new one
1764
graph= self.mdi.activeWindow()
1766
graph= self.openGraph()
1769
def getGraph(self, name):
1771
Return GraphWindow instance indexed by name
1772
Or None if not found
1774
for graph in self.mdi.windowList():
1775
if str(graph.caption())==name:
1779
def closeGraph(self, name):
1781
Called after a graph is closed
1783
print "closeGraph", name
1785
def __getGraphNames(self):
1786
return [ str(window.caption()) for window in self.mdi.windowList() ]
1789
def __getNewGraphName(self):
1790
names= self.__getGraphNames()
1792
while "Graph %d"%idx in names:
1794
return "Graph %d"%(idx)
1796
class MyQTextBrowser(qt.QTextBrowser):
1797
def setSource(self,name):
1798
if name == qt.QString("./PyMCA.html"):
1799
if sys.platform == 'win32':
1800
dir=os.path.dirname(PyMcaMdi.__file__)
1801
if not os.path.exists(dir+"/HTML"+"/PyMCA.html"):
1802
dir = os.path.dirname(dir)
1803
cmd = dir+"/HTML/PyMCA.pdf"
1804
os.system('"%s"' % cmd)
1809
self.report = qt.QTextBrowser()
1810
self.report.setCaption(qt.QString("PyMca Report"))
1811
self.report.mimeSourceFactory().addFilePath(qt.QString(os.path.dirname(PyMcaMdi.__file__)+"/HTML"))
1812
self.report.mimeSourceFactory().addFilePath(qt.QString(os.path.dirname(PyMcaMdi.__file__)+"/HTML/PyMCA_files"))
1813
self.report.setSource(name)
1814
if self.report.isHidden():self.report.show()
1815
self.report.raiseW()
1817
qt.QTextBrowser.setSource(self,name)
1819
class Line(qt.QFrame):
1820
def mouseDoubleClickEvent(self,event):
1822
print "Double Click Event"
1824
ddict['event']="DoubleClick"
1825
ddict['data'] = event
1826
if QTVERSION < '4.0.0':
1827
self.emit(qt.PYSIGNAL("LineDoubleClickEvent"),(ddict,))
1829
self.emit(qt.SIGNAL("LineDoubleClickEvent"),(ddict))
1831
class PixmapLabel(qt.QLabel):
1832
def mousePressEvent(self,event):
1834
print "Mouse Press Event"
1836
ddict['event']="MousePress"
1837
ddict['data'] = event
1838
if QTVERSION < '4.0.0':
1839
self.emit(qt.PYSIGNAL("PixmapLabelMousePressEvent"),(ddict,))
1841
self.emit(qt.SIGNAL("PixmapLabelMousePressEvent"),(ddict))
1843
if __name__ == '__main__':
1848
demo = PyMca(**keywords)
1849
if nativeFileDialogs is not None:
1850
PyMcaDirs.nativeFileDialogs = nativeFileDialogs
1851
if debugreport:demo.onDebug()
1852
qt.QObject.connect(app, qt.SIGNAL("lastWindowClosed()"),
1853
app,qt.SLOT("quit()"))
1854
if QTVERSION < '4.0.0':
1855
app.setMainWidget(demo)
1857
# --- close waiting widget
1860
profile.run('sys.exit(app.exec_loop())',"test")
1861
p=pstats.Stats("test")
1862
p.strip_dirs().sort_stats(-1).print_stats()
1869
profile.run('sys.exit(app.exec_())',"test")
1870
p=pstats.Stats("test")
1871
p.strip_dirs().sort_stats(-1).print_stats()
1873
sys.exit(app.exec_())