source: trunk/GSASIIimgGUI.py @ 398

Last change on this file since 398 was 398, checked in by vondreele, 10 years ago

missed updating the GUI after recalibrate

  • Property svn:keywords set to Date Author Revision URL Id
File size: 43.1 KB
Line 
1#GSASII - image data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-21 19:33:37 +0000 (Fri, 21 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 398 $
6# $URL: trunk/GSASIIimgGUI.py $
7# $Id: GSASIIimgGUI.py 398 2011-10-21 19:33:37Z vondreele $
8########### SVN repository information ###################
9import wx
10import matplotlib as mpl
11import math
12import time
13import cPickle
14import GSASIIpath
15import GSASIIimage as G2img
16import GSASIIplot as G2plt
17import GSASIIIO as G2IO
18import GSASIIgrid as G2gd
19
20VERY_LIGHT_GREY = wx.Colour(235,235,235)
21
22# trig functions in degrees
23sind = lambda x: math.sin(x*math.pi/180.)
24tand = lambda x: math.tan(x*math.pi/180.)
25cosd = lambda x: math.cos(x*math.pi/180.)
26asind = lambda x: 180.*math.asin(x)/math.pi
27
28                   
29def UpdateImageControls(self,data,masks):
30    import ImageCalibrants as calFile
31   
32    def OnDataType(event):
33        data['type'] = typeSel.GetValue()[:4]
34   
35    def OnNewColorBar(event):
36        data['color'] = colSel.GetValue()
37        G2plt.PlotExposedImage(self,event=event)
38       
39    def OnNewCalibrant(event):
40        data['calibrant'] = calSel.GetValue()
41        data['calibskip'] = calFile.Calibrants[data['calibrant']][2]
42        limits = calFile.Calibrants[data['calibrant']][3]
43        data['calibdmin'],data['pixLimit'],data['cutoff'] = limits
44        pixLimit.SetValue(str(limits[1]))
45        cutOff.SetValue('%.1f'%(limits[2]))
46        calibSkip.SetValue(str(data['calibskip']))
47        calibDmin.SetValue('%.1f'%(limits[0]))
48       
49    def OnPixLimit(event):
50        data['pixLimit'] = int(pixLimit.GetValue())
51       
52    def OnCalibSkip(event):
53        data['calibskip'] = int(calibSkip.GetValue())
54       
55    def OnSetRings(event):
56        if data['setRings']:
57            data['setRings'] = False
58        else:
59            data['setRings'] = True
60        G2plt.PlotExposedImage(self,event=event)
61
62    def OnCalibDmin(event):
63        try:
64            dmin = float(calibDmin.GetValue())
65            if dmin < 0.25:
66                raise ValueError
67            data['calibdmin'] = dmin
68        except ValueError:
69            pass
70        calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
71               
72    def OnAzmthOff(event):
73        try:
74            azmthoff = float(azmthOff.GetValue())
75            data['azmthOff'] = azmthoff
76        except ValueError:
77            pass
78        azmthOff.SetValue("%.2f"%(data['azmthOff']))          #reset in case of error 
79       
80    def OnCutOff(event):
81        try:
82            cutoff = float(cutOff.GetValue())
83            if cutoff < 0.1:
84                raise ValueError
85            data['cutoff'] = cutoff
86        except ValueError:
87            pass
88        cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
89       
90    def OnMaxVal(event):
91        try:
92            value = min(data['range'][0][1],int(maxVal.GetValue()))
93            if value < data['range'][1][0]+1:
94                raise ValueError
95            data['range'][1][1] = value
96        except ValueError:
97            pass
98        maxVal.SetValue('%.0f'%(data['range'][1][1]))
99        DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
100        sqrtDeltOne = math.sqrt(DeltOne)
101        maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
102        minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
103        G2plt.PlotExposedImage(self,event=event)
104       
105    def OnMinVal(event):
106        try:
107            value = int(minVal.GetValue())
108            if value > data['range'][1][1]-1:
109                raise ValueError
110            data['range'][1][0] = value
111        except ValueError:
112            pass
113        minVal.SetValue('%.0f'%(data['range'][1][0]))
114        minSel.SetValue(int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
115        G2plt.PlotExposedImage(self,event=event)
116       
117    def OnMaxSlider(event):
118        sqrtDeltZero = math.sqrt(data['range'][0][1])
119        imax = int(maxSel.GetValue())*sqrtDeltZero/100.
120        data['range'][1][1] = imax**2
121        data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,data['range'][1][0]))
122        DeltOne = max(1.0,data['range'][1][1]-data['range'][1][0])
123        minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
124        maxVal.SetValue('%.0f'%(data['range'][1][1]))
125        G2plt.PlotExposedImage(self,event=event)
126       
127    def OnMinSlider(event):
128        DeltOne = data['range'][1][1]-data['range'][1][0]
129        imin = int(minSel.GetValue())*DeltOne/100.
130        data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,imin))
131        minVal.SetValue('%.0f'%(data['range'][1][0]))
132        G2plt.PlotExposedImage(self,event=event)
133       
134    def OnNumOutChans(event):
135        try:
136            numChans = int(outChan.GetValue())
137            if numChans < 1:
138                raise ValueError
139            data['outChannels'] = numChans
140        except ValueError:
141            pass
142        outChan.SetValue(str(data['outChannels']))          #reset in case of error       
143       
144    def OnNumOutAzms(event):
145        try:
146            numAzms = int(outAzim.GetValue())
147            if numAzms < 1:
148                raise ValueError
149            data['outAzimuths'] = numAzms           
150        except ValueError:
151            pass
152        outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
153        G2plt.PlotExposedImage(self,event=event)
154       
155    def OnWavelength(event):
156        try:
157            wave = float(waveSel.GetValue())
158            if wave < .01:
159                raise ValueError
160            data['wavelength'] = wave
161        except ValueError:
162            pass
163        waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
164       
165    def OnShowLines(event):
166        if data['showLines']:
167            data['showLines'] = False
168        else:
169            data['showLines'] = True
170        G2plt.PlotExposedImage(self,event=event)
171       
172    def OnSetDefault(event):
173        import copy
174        if data['setDefault']:
175            self.imageDefault = {}
176            data['setDefault'] = False
177        else:
178            self.imageDefault = copy.copy(data)
179            data['setDefault'] = True
180           
181    def OnIOtth(event):
182        Ltth = max(float(self.InnerTth.GetValue()),0.001)
183        Utth = float(self.OuterTth.GetValue())
184        if Ltth > Utth:
185            Ltth,Utth = Utth,Ltth
186        data['IOtth'] = [Ltth,Utth]
187        self.InnerTth.SetValue("%8.3f" % (Ltth))
188        self.OuterTth.SetValue("%8.2f" % (Utth))
189        G2plt.PlotExposedImage(self,event=event)
190       
191    def OnFullIntegrate(event):
192        Lazm =int(self.Lazim.GetValue())
193        if data['fullIntegrate']:
194            data['fullIntegrate'] = False
195            data['LRazimuth'] = [Lazm,Lazm+20]
196        else:
197            data['fullIntegrate'] = True
198            data['LRazimuth'] = [Lazm,Lazm+360]
199        UpdateImageControls(self,data,masks)           
200        G2plt.PlotExposedImage(self,event=event)
201       
202    def OnLRazim(event):
203        Lazm =int(self.Lazim.GetValue())
204        if data['fullIntegrate']:
205           self.Razim.SetValue("%6d" % (Lazm+360))
206        Razm = int(self.Razim.GetValue())
207        if Lazm > Razm:
208            Lazm -= 360
209        data['LRazimuth'] = [Lazm,Razm]
210        G2plt.PlotExposedImage(self,event=event)
211           
212    def OnClearCalib(event):
213        data['ring'] = []
214        data['rings'] = []
215        data['ellipses'] = []
216        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
217        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
218        G2plt.PlotExposedImage(self,event=event)
219           
220    def OnCalibrate(event):       
221        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=True)   
222        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=True)   
223        self.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
224        self.ifGetRing = True
225       
226    def OnRecalibrate(event):
227        G2img.ImageRecalibrate(self,data)
228        UpdateImageControls(self,data,masks)
229       
230    def OnIntegrate(event):
231        self.Integrate = G2img.ImageIntegrate(self.ImageZ,data,masks)
232        G2plt.PlotIntegration(self,newPlot=True)
233        G2IO.SaveIntegration(self,self.PickId,data)
234        self.MakePDF.Enable(True)
235       
236    def OnIntegrateAll(event):
237        print 'integrate all'
238        TextList = [[False,'All IMG',0]]
239        Names = []
240        if self.PatternTree.GetCount():
241            id, cookie = self.PatternTree.GetFirstChild(self.root)
242            while id:
243                name = self.PatternTree.GetItemText(id)
244                Names.append(name)
245                if 'IMG' in name:
246                    TextList.append([False,name,id])
247                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
248            if len(TextList) == 1:
249                self.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
250                return
251            dlg = self.CopyDialog(self,'Image integration controls','Select images to integrate:',TextList)
252            try:
253                if dlg.ShowModal() == wx.ID_OK:
254                    result = dlg.GetData()
255                    if result[0][0]:                    #the 'All IMG' is True
256                        result = TextList[1:]
257                        for item in result: item[0] = True
258                    for item in result:
259                        ifintegrate,name,id = item
260                        if ifintegrate:
261                            id = G2gd.GetPatternTreeItemId(self, self.root, name)
262                            Npix,imagefile = self.PatternTree.GetItemPyData(id)
263                            image = G2IO.GetImageData(self,imagefile,True)
264                            Id = G2gd.GetPatternTreeItemId(self,id, 'Image Controls')
265                            Data = self.PatternTree.GetItemPyData(Id)
266                            try:
267                                Masks = self.PatternTree.GetItemPyData(
268                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'))
269                            except TypeError:       #missing Masks
270                                Imin,Imax = Data['Range']
271                                Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
272                                self.PatternTree.SetItemPyData(
273                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'),Masks)                               
274                            self.Integrate = G2img.ImageIntegrate(image,Data,Masks)
275#                            G2plt.PlotIntegration(self,newPlot=True,event=event)
276                            G2IO.SaveIntegration(self,Id,Data)
277            finally:
278                dlg.Destroy()
279       
280    def OnCopyControls(event):
281        import copy
282        TextList = [[False,'All IMG',0]]
283        Names = []
284        if self.PatternTree.GetCount():
285            id, cookie = self.PatternTree.GetFirstChild(self.root)
286            while id:
287                name = self.PatternTree.GetItemText(id)
288                Names.append(name)
289                if 'IMG' in name:
290                    if id == self.Image:
291                        Source = name
292                        Data = copy.deepcopy(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls')))
293                        Data['showLines'] = True
294                        Data['ring'] = []
295                        Data['rings'] = []
296                        Data['ellipses'] = []
297                        Data['setDefault'] = False
298                    else:
299                        TextList.append([False,name,id])
300                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
301            if len(TextList) == 1:
302                self.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
303                return
304            dlg = self.CopyDialog(self,'Copy image controls','Copy controls from '+Source+' to:',TextList)
305            try:
306                if dlg.ShowModal() == wx.ID_OK:
307                    result = dlg.GetData()
308                    if result[0][0]:
309                        result = TextList[1:]
310                        for item in result: item[0] = True
311                    for i,item in enumerate(result):
312                        ifcopy,name,id = item
313                        if ifcopy:
314                            oldData = copy.deepcopy(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls')))
315                            Data['range'] = oldData['range']
316                            Data['size'] = oldData['size']                               
317                            Data['ring'] = []
318                            Data['rings'] = []
319                            Data['ellipses'] = []
320                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'),copy.deepcopy(Data))
321            finally:
322                dlg.Destroy()
323               
324    def OnSaveControls(event):
325        dlg = wx.FileDialog(self, 'Choose image controls file', '.', '', 
326            'image control files (*.imctrl)|*.imctrl',wx.OPEN)
327        if self.dirname:
328            dlg.SetDirectory(self.dirname)
329        try:
330            if dlg.ShowModal() == wx.ID_OK:
331                filename = dlg.GetPath()
332                File = open(filename,'w')
333                save = {}
334                keys = ['type','wavelength','calibrant','distance','center',
335                    'tilt','rotation','azmthOff','fullIntegrate','LRazimuth',
336                    'IOtth','outAzimuths']
337                for key in keys:
338                    File.write(key+':'+str(data[key])+'\n')
339                File.close()
340        finally:
341            dlg.Destroy()
342       
343    def OnLoadControls(event):
344        cntlList = ['wavelength','distance','tilt','rotation',
345            'fullIntegrate','outAzimuths','LRazimuth','IOtth']
346        dlg = wx.FileDialog(self, 'Choose image controls file', '.', '', 
347            'image control files (*.imctrl)|*.imctrl',wx.OPEN)
348        if self.dirname:
349            dlg.SetDirectory(self.dirname)
350        try:
351            if dlg.ShowModal() == wx.ID_OK:
352                filename = dlg.GetPath()
353                File = open(filename,'r')
354                save = {}
355                S = File.readline()
356                while S:
357                    if S[0] == '#':
358                        S = File.readline()
359                        continue
360                    [key,val] = S[:-1].split(':')
361                    if key in ['type','calibrant',]:
362                        save[key] = val
363                    elif key in ['center',]:
364                        if ',' in val:
365                            save[key] = eval(val)
366                        else:
367                            vals = val.strip('[] ').split()
368                            save[key] = [float(vals[0]),float(vals[1])] 
369                    elif key in cntlList:
370                        save[key] = eval(val)
371                    S = File.readline()
372                data.update(save)
373                UpdateImageControls(self,data,masks)           
374                G2plt.PlotExposedImage(self,event=event)
375               
376                File.close()
377        finally:
378            dlg.Destroy()
379                                       
380    #fix for old files:
381    if 'azmthOff' not in data:
382        data['azmthOff'] = 0.0
383    #end fix
384   
385    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
386    calList = [m for m in calFile.Calibrants.keys()]
387    typeList = ['PWDR - powder diffraction data','SASD - small angle scattering data',
388        'REFL - reflectometry data']
389    if not data.get('type'):                        #patch for old project files
390        data['type'] = 'PWDR'
391    typeDict = {'PWDR':typeList[0],'SASD':typeList[1],'REFL':typeList[2]}
392    if self.dataDisplay:
393        self.dataDisplay.Destroy()
394    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
395    if not self.dataFrame.GetStatusBar():
396        self.dataFrame.CreateStatusBar()
397    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
398    self.dataFrame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2gd.wxID_IMRECALIBRATE)
399    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
400    if not data['rings']:
401        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
402        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
403    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
404    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
405    self.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
406    self.dataFrame.Bind(wx.EVT_MENU, OnSaveControls, id=G2gd.wxID_IMSAVECONTROLS)
407    self.dataFrame.Bind(wx.EVT_MENU, OnLoadControls, id=G2gd.wxID_IMLOADCONTROLS)
408    self.dataDisplay = wx.Panel(self.dataFrame)
409    mainSizer = wx.BoxSizer(wx.VERTICAL)
410    mainSizer.Add((5,10),0)
411   
412    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
413    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Type of image data: '),0,
414        wx.ALIGN_CENTER_VERTICAL)
415    typeSel = wx.ComboBox(parent=self.dataDisplay,value=typeDict[data['type']],choices=typeList,
416        style=wx.CB_READONLY|wx.CB_DROPDOWN)
417    typeSel.SetValue(data['type'])
418    typeSel.Bind(wx.EVT_COMBOBOX, OnDataType)
419    comboSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
420    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
421        wx.ALIGN_CENTER_VERTICAL)
422    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
423        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
424    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
425    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
426    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Azimuth offset '),0,
427        wx.ALIGN_CENTER_VERTICAL)
428    azmthOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (data['azmthOff'])),
429        style=wx.TE_PROCESS_ENTER)
430    azmthOff.Bind(wx.EVT_TEXT_ENTER,OnAzmthOff)
431    azmthOff.Bind(wx.EVT_KILL_FOCUS,OnAzmthOff)
432    comboSizer.Add(azmthOff,0,wx.ALIGN_CENTER_VERTICAL)
433    mainSizer.Add(comboSizer,0,wx.ALIGN_LEFT)
434    mainSizer.Add((5,5),0)
435           
436    maxSizer = wx.FlexGridSizer(2,3,0,5)
437    maxSizer.AddGrowableCol(1,1)
438    maxSizer.SetFlexibleDirection(wx.HORIZONTAL)
439    sqrtDeltZero = math.sqrt(data['range'][0][1]-max(0.0,data['range'][0][0]))
440    DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
441    sqrtDeltOne = math.sqrt(DeltOne)
442    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
443        wx.ALIGN_CENTER_VERTICAL)
444    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
445        value=int(100*sqrtDeltOne/sqrtDeltZero))
446    maxSizer.Add(maxSel,1,wx.EXPAND)
447    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
448    maxVal = wx.TextCtrl(parent=self.dataDisplay,value='%.0f'%(data['range'][1][1]))
449    maxVal.Bind(wx.EVT_TEXT_ENTER,OnMaxVal)   
450    maxVal.Bind(wx.EVT_KILL_FOCUS,OnMaxVal)
451    maxSizer.Add(maxVal,0,wx.ALIGN_CENTER_VERTICAL)   
452    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
453        wx.ALIGN_CENTER_VERTICAL)
454    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
455        value=int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
456    maxSizer.Add(minSel,1,wx.EXPAND)
457    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
458    minVal = wx.TextCtrl(parent=self.dataDisplay,value='%.0f'%(data['range'][1][0]))
459    minVal.Bind(wx.EVT_TEXT_ENTER,OnMinVal)   
460    minVal.Bind(wx.EVT_KILL_FOCUS,OnMinVal)
461    maxSizer.Add(minVal,0,wx.ALIGN_CENTER_VERTICAL)   
462    mainSizer.Add(maxSizer,0,wx.ALIGN_LEFT|wx.EXPAND)
463   
464    dataSizer = wx.FlexGridSizer(6,4,5,5)
465    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
466        wx.ALIGN_CENTER_VERTICAL)   
467    dataSizer.Add((5,0),0)
468    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
469        wx.ALIGN_CENTER_VERTICAL)   
470    dataSizer.Add((5,0),0)
471   
472    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
473        wx.ALIGN_CENTER_VERTICAL)
474    cent = data['center']
475    centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
476    centText.SetBackgroundColour(VERY_LIGHT_GREY)
477    dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
478   
479    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
480        wx.ALIGN_CENTER_VERTICAL)
481       
482    IOtth = data['IOtth']
483    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
484    self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,
485        value=("%8.3f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
486    self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
487    self.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
488    littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
489    self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,
490        value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
491    self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
492    self.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
493    littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
494    dataSizer.Add(littleSizer,0,)
495       
496    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
497        wx.ALIGN_CENTER_VERTICAL)
498    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
499        style=wx.TE_PROCESS_ENTER)
500    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
501    waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
502    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
503         
504    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
505        wx.ALIGN_CENTER_VERTICAL)
506    LRazim = data['LRazimuth']
507    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
508    self.Lazim = wx.TextCtrl(parent=self.dataDisplay,
509        value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
510    self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
511    self.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
512    littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
513    self.Razim = wx.TextCtrl(parent=self.dataDisplay,
514        value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
515    self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
516    self.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
517    if data['fullIntegrate']:
518        self.Razim.Enable(False)
519        self.Razim.SetBackgroundColour(VERY_LIGHT_GREY)
520        self.Razim.SetValue("%6d" % (LRazim[0]+360))
521    littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)
522    dataSizer.Add(littleSizer,0,)
523       
524    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
525        wx.ALIGN_CENTER_VERTICAL)
526    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
527    distSel.SetBackgroundColour(VERY_LIGHT_GREY)
528    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
529
530    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
531        wx.ALIGN_CENTER_VERTICAL)
532    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
533    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
534    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
535    outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
536    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
537    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
538    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
539    outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
540    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
541    dataSizer.Add(littleSizer,0,)
542
543    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
544        wx.ALIGN_CENTER_VERTICAL)
545    tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
546    tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
547    dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
548    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
549    dataSizer.Add(showLines,0,wx.ALIGN_CENTER_VERTICAL)
550    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
551    showLines.SetValue(data['showLines'])
552    fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')
553    dataSizer.Add(fullIntegrate,0,wx.ALIGN_CENTER_VERTICAL)
554    fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
555    fullIntegrate.SetValue(data['fullIntegrate'])
556   
557    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
558        wx.ALIGN_CENTER_VERTICAL)
559    rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation']-90.)),style=wx.TE_READONLY) #kluge to get rotation from vertical - see GSASIIimage
560    rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
561    dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
562    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
563    dataSizer.Add(setDefault,0,wx.ALIGN_CENTER_VERTICAL)
564    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
565    setDefault.SetValue(data['setDefault'])
566
567    mainSizer.Add((5,5),0)       
568    mainSizer.Add(dataSizer,0)
569    mainSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration controls:'),0,
570        wx.ALIGN_CENTER_VERTICAL)
571    mainSizer.Add((5,5),0)
572    calibSizer = wx.FlexGridSizer(2,3,5,5)
573    comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
574    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
575        wx.ALIGN_CENTER_VERTICAL)
576    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
577        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
578    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
579    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
580    calibSizer.Add(comboSizer,0)
581   
582    comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
583    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calib lines to skip   '),0,
584        wx.ALIGN_CENTER_VERTICAL)
585    calibSkip  = wx.ComboBox(parent=self.dataDisplay,value=str(data['calibskip']),choices=['0','1','2','3','4','5','6','7','8','9','10'],
586        style=wx.CB_READONLY|wx.CB_DROPDOWN)
587    calibSkip.Bind(wx.EVT_COMBOBOX, OnCalibSkip)
588    comboSizer.Add(calibSkip,0,wx.ALIGN_CENTER_VERTICAL)
589    calibSizer.Add(comboSizer,0)
590   
591    comboSizer = wx.BoxSizer(wx.HORIZONTAL)       
592    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min calib d-spacing '),0,
593        wx.ALIGN_CENTER_VERTICAL)
594    calibDmin = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (data['calibdmin'])),
595        style=wx.TE_PROCESS_ENTER)
596    calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
597    calibDmin.Bind(wx.EVT_KILL_FOCUS,OnCalibDmin)
598    comboSizer.Add(calibDmin,0,wx.ALIGN_CENTER_VERTICAL)
599    calibSizer.Add(comboSizer,0)
600   
601    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
602    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,
603        wx.ALIGN_CENTER_VERTICAL)
604    cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),
605        style=wx.TE_PROCESS_ENTER)
606    cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
607    cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
608    comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
609    calibSizer.Add(comboSizer,0)
610   
611    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
612    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
613        wx.ALIGN_CENTER_VERTICAL)
614    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
615        style=wx.CB_READONLY|wx.CB_DROPDOWN)
616    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
617    comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
618    calibSizer.Add(comboSizer,0)
619   
620    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
621    setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')
622    comboSizer.Add(setRings,0)
623    setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
624    setRings.SetValue(data['setRings'])
625    calibSizer.Add(comboSizer,0)
626   
627    mainSizer.Add(calibSizer,0,wx.ALIGN_CENTER_VERTICAL)
628       
629    mainSizer.Layout()   
630    self.dataDisplay.SetSizer(mainSizer)
631    fitSize = mainSizer.Fit(self.dataFrame)
632    self.dataFrame.setSizePosLeft(fitSize)
633    self.dataDisplay.SetSize(fitSize)
634   
635def UpdateMasks(self,data):
636   
637    def OnTextMsg(event):
638        Obj = event.GetEventObject()
639        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
640       
641    def OnThreshold(event):
642        try:
643            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
644        except ValueError:
645            lower = thresh[0][0]
646        try:
647            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
648        except ValueError:
649            upper = thresh[0][1]
650        data['Thresholds'][1] = [lower,upper]
651        lowerThreshold.SetValue("%8d" % (lower))
652        upperThreshold.SetValue("%8d" % (upper))
653        G2plt.PlotExposedImage(self,event=event)
654       
655    def OnSpotDiameter(event):
656        Obj = event.GetEventObject()
657        try:
658            diameter = min(100.,max(0.1,float(Obj.GetValue())))
659        except ValueError:
660            diameter = 1.0
661        Obj.SetValue("%.2f"%(diameter))
662        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
663        G2plt.PlotExposedImage(self,event=event)
664       
665    def OnDeleteSpot(event):
666        Obj = event.GetEventObject()
667        del(data['Points'][delSpotId.index(Obj)])
668        UpdateMasks(self,data)           
669        G2plt.PlotExposedImage(self,event=event)
670       
671    def OnRingThickness(event):
672        Obj = event.GetEventObject()
673        try:
674            thick = min(1.0,max(0.001,float(Obj.GetValue())))
675        except ValueError:
676            thick = 0.1
677        Obj.SetValue("%.3f"%(thick))
678        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
679        G2plt.PlotExposedImage(self,event=event)
680       
681    def OnDeleteRing(event):
682        Obj = event.GetEventObject()
683        del(data['Rings'][delRingId.index(Obj)])
684        UpdateMasks(self,data)           
685        G2plt.PlotExposedImage(self,event=event)
686
687    def OnArcThickness(event):
688        Obj = event.GetEventObject()
689        try:
690            thick = min(20.0,max(0.001,float(Obj.GetValue())))
691        except ValueError:
692            thick = 0.1
693        Obj.SetValue("%.3f"%(thick))
694        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
695        G2plt.PlotExposedImage(self,event=event)
696       
697    def OnDeleteArc(event):
698        Obj = event.GetEventObject()
699        del(data['Arcs'][delArcId.index(Obj)])
700        UpdateMasks(self,data)           
701        G2plt.PlotExposedImage(self,event=event)
702
703    def OnDeletePoly(event):
704        Obj = event.GetEventObject()
705        del(data['Polygons'][delPolyId.index(Obj)])
706        UpdateMasks(self,data)           
707        G2plt.PlotExposedImage(self,event=event)
708
709    def OnCopyMask(event):
710        import copy
711        TextList = [[False,'All IMG',0]]
712        Names = []
713        if self.PatternTree.GetCount():
714            id, cookie = self.PatternTree.GetFirstChild(self.root)
715            while id:
716                name = self.PatternTree.GetItemText(id)
717                Names.append(name)
718                if 'IMG' in name:
719                    if id == self.Image:
720                        Source = name
721                        Mask = copy.deepcopy(self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks')))
722                        del Mask['Thresholds']
723                    else:
724                        TextList.append([False,name,id])
725                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
726            if len(TextList) == 1:
727                self.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
728                return
729            dlg = self.CopyDialog(self,'Copy mask information','Copy mask from '+Source+' to:',TextList)
730            try:
731                if dlg.ShowModal() == wx.ID_OK:
732                    result = dlg.GetData()
733                    if result[0][0]:
734                        result = TextList[1:]
735                        for item in result: item[0] = True
736                    for i,item in enumerate(result):
737                        ifcopy,name,id = item
738                        if ifcopy:
739                            mask = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'))
740                            mask.update(Mask)                               
741                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'),copy.deepcopy(mask))
742            finally:
743                dlg.Destroy()
744               
745    def OnSaveMask(event):
746        dlg = wx.FileDialog(self, 'Choose image mask file', '.', '', 
747            'image mask files (*.immask)|*.immask',wx.OPEN)
748        if self.dirname:
749            dlg.SetDirectory(self.dirname)
750        try:
751            if dlg.ShowModal() == wx.ID_OK:
752                filename = dlg.GetPath()
753                File = open(filename,'w')
754                save = {}
755                keys = ['Points','Rings','Arcs','Polygons','Thresholds']
756                for key in keys:
757                    File.write(key+':'+str(data[key])+'\n')
758                File.close()
759        finally:
760            dlg.Destroy()
761       
762    def OnLoadMask(event):
763        dlg = wx.FileDialog(self, 'Choose image mask file', '.', '', 
764            'image mask files (*.immask)|*.immask',wx.OPEN)
765        if self.dirname:
766            dlg.SetDirectory(self.dirname)
767        try:
768            if dlg.ShowModal() == wx.ID_OK:
769                filename = dlg.GetPath()
770                File = open(filename,'r')
771                save = {}
772                S = File.readline()
773                while S:
774                    if S[0] == '#':
775                        S = File.readline()
776                        continue
777                    [key,val] = S[:-1].split(':')
778                    if key in ['Points','Rings','Arcs','Polygons','Thresholds']:
779                        save[key] = eval(val)
780                    S = File.readline()
781                data.update(save)
782                UpdateMasks(self,data)           
783                G2plt.PlotExposedImage(self,event=event)
784               
785                File.close()
786        finally:
787            dlg.Destroy()
788       
789    if self.dataDisplay:
790        self.dataDisplay.Destroy()
791    self.dataFrame.SetMenuBar(self.dataFrame.MaskMenu)
792    self.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
793    self.dataFrame.Bind(wx.EVT_MENU, OnLoadMask, id=G2gd.wxID_MASKLOAD)
794    self.dataFrame.Bind(wx.EVT_MENU, OnSaveMask, id=G2gd.wxID_MASKSAVE)   
795    if not self.dataFrame.GetStatusBar():
796        Status = self.dataFrame.CreateStatusBar()
797        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
798    self.dataDisplay = wx.Panel(self.dataFrame)
799    mainSizer = wx.BoxSizer(wx.VERTICAL)
800    mainSizer.Add((5,10),0)
801
802    thresh = data['Thresholds']         #min/max intensity range
803    spots = data['Points']               #x,y,radius in mm
804    rings = data['Rings']               #radius, thickness
805    polygons = data['Polygons']         #3+ x,y pairs
806    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
807   
808    littleSizer = wx.FlexGridSizer(2,3,0,5)
809    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper limits '),0,
810        wx.ALIGN_CENTER_VERTICAL)
811    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
812    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
813    Text.SetBackgroundColour(VERY_LIGHT_GREY)
814    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
815    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
816    Text.SetBackgroundColour(VERY_LIGHT_GREY)
817    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper thresholds '),
818        0,wx.ALIGN_CENTER_VERTICAL)
819    lowerThreshold = wx.TextCtrl(parent=self.dataDisplay,
820        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
821    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
822    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
823    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
824    upperThreshold = wx.TextCtrl(parent=self.dataDisplay,
825        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
826    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
827    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
828    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
829    mainSizer.Add(littleSizer,0,)
830    spotIds = []
831    delSpotId = []
832    if spots:
833        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
834        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Spot masks:'),0,
835            wx.ALIGN_CENTER_VERTICAL)
836        littleSizer.Add((5,0),0)
837        littleSizer.Add((5,0),0)
838        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' position, mm'),0,
839            wx.ALIGN_CENTER_VERTICAL)
840        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' diameter, mm'),0,
841            wx.ALIGN_CENTER_VERTICAL)
842        littleSizer.Add((5,0),0)
843        for x,y,d in spots:
844            spotText = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f,%.2f" % (x,y)),
845                style=wx.TE_READONLY)
846            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
847            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
848            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
849            spotDiameter = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (d)),
850                style=wx.TE_PROCESS_ENTER)
851            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
852            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
853            spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
854            spotIds.append(spotDiameter.GetId())
855            spotDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
856            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
857            delSpotId.append(spotDelete)
858            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
859        mainSizer.Add(littleSizer,0,)
860    ringIds = []
861    delRingId = []
862    if rings:
863        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
864        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Ring masks:'),0,
865            wx.ALIGN_CENTER_VERTICAL)
866        littleSizer.Add((5,0),0)
867        littleSizer.Add((5,0),0)
868        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
869            wx.ALIGN_CENTER_VERTICAL)
870        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
871            wx.ALIGN_CENTER_VERTICAL)
872        littleSizer.Add((5,0),0)
873        for tth,thick in rings:
874            ringText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
875                style=wx.TE_READONLY)
876            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
877            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
878            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
879            ringThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
880                style=wx.TE_PROCESS_ENTER)
881            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
882            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
883            ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
884            ringIds.append(ringThick.GetId())
885            ringDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
886            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
887            delRingId.append(ringDelete)
888            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
889        mainSizer.Add(littleSizer,0,)
890    arcIds = []
891    delArcId = []
892    if arcs:
893        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
894        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Arc masks:'),0,
895            wx.ALIGN_CENTER_VERTICAL)
896        littleSizer.Add((5,0),0)
897        littleSizer.Add((5,0),0)
898        littleSizer.Add((5,0),0)
899        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
900            wx.ALIGN_CENTER_VERTICAL)
901        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' azimuth, deg'),0,
902            wx.ALIGN_CENTER_VERTICAL)
903        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
904            wx.ALIGN_CENTER_VERTICAL)
905        littleSizer.Add((5,0),0)
906        for tth,azimuth,thick in arcs:
907            arcText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
908                style=wx.TE_READONLY)
909            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
910            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
911            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
912            azmText = wx.TextCtrl(parent=self.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
913                style=wx.TE_READONLY)
914            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
915            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
916            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
917            arcThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
918                style=wx.TE_PROCESS_ENTER)
919            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
920            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
921            arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
922            arcIds.append(arcThick.GetId())
923            arcDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
924            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
925            delArcId.append(arcDelete)
926            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
927        mainSizer.Add(littleSizer,0,)
928    polyIds = []
929    delPolyId = []
930    if polygons:
931        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
932        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Polygon masks:'),0,
933            wx.ALIGN_CENTER_VERTICAL)
934        littleSizer.Add((5,0),0)
935        for polygon in polygons:
936            if polygon:
937                polyList = []
938                for x,y in polygon:
939                    polyList.append("%.2f, %.2f"%(x,y))
940                polyText = wx.ComboBox(self.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
941                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
942                polyDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
943                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
944                delPolyId.append(polyDelete)
945                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
946        mainSizer.Add(littleSizer,0,)
947    mainSizer.Layout()   
948    self.dataDisplay.SetSizer(mainSizer)
949    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
950    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))   
Note: See TracBrowser for help on using the repository browser.