source: trunk/GSASIIimgGUI.py @ 265

Last change on this file since 265 was 265, checked in by vondreele, 11 years ago

further progress on implementing pdf calculations
optionally put legends on the pdf plots
attempt implementation of a rotation of the azimuth ranges for multiazimuth integrations -not fully successful

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