source: trunk/GSASIIimgGUI.py @ 268

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

fix integration limits issues
changes to full image integration control

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