source: trunk/GSASIIimgGUI.py @ 267

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

removed azm rotation - didn't work
fix azimuthal polarization

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