source: trunk/GSASIIimgGUI.py @ 765

Last change on this file since 765 was 765, checked in by toby, 10 years ago

refactor menus on Mac, clean up main menu generation

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 60.6 KB
Line 
1# -*- coding: utf-8 -*-
2#GSASII - image data display routines
3########### SVN repository information ###################
4# $Date: 2012-09-29 02:25:04 +0000 (Sat, 29 Sep 2012) $
5# $Author: toby $
6# $Revision: 765 $
7# $URL: trunk/GSASIIimgGUI.py $
8# $Id: GSASIIimgGUI.py 765 2012-09-29 02:25:04Z toby $
9########### SVN repository information ###################
10import wx
11import matplotlib as mpl
12import math
13import time
14import copy
15import cPickle
16import GSASIIpath
17GSASIIpath.SetVersionNumber("$Revision: 765 $")
18import GSASIIimage as G2img
19import GSASIIplot as G2plt
20import GSASIIIO as G2IO
21import GSASIIgrid as G2gd
22import numpy as np
23
24VERY_LIGHT_GREY = wx.Colour(235,235,235)
25
26# trig functions in degrees
27sind = lambda x: math.sin(x*math.pi/180.)
28tand = lambda x: math.tan(x*math.pi/180.)
29cosd = lambda x: math.cos(x*math.pi/180.)
30asind = lambda x: 180.*math.asin(x)/math.pi
31
32################################################################################
33##### Image Controls
34################################################################################                   
35def UpdateImageControls(G2frame,data,masks):
36    import ImageCalibrants as calFile
37   
38# Menu items
39           
40    def OnCalibrate(event):       
41        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=True)   
42        G2frame.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
43        G2frame.ifGetRing = True
44       
45    def OnRecalibrate(event):
46        G2img.ImageRecalibrate(G2frame,data)
47        UpdateImageControls(G2frame,data,masks)
48       
49    def OnClearCalib(event):
50        data['ring'] = []
51        data['rings'] = []
52        data['ellipses'] = []
53#        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
54        G2plt.PlotExposedImage(G2frame,event=event)
55           
56    def OnIntegrate(event):
57        if data['background image'][0]:
58            maskCopy = copy.deepcopy(masks)
59            backImg = data['background image'][0]
60            backScale = data['background image'][1]
61            id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
62            Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
63            backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
64            sumImage = G2frame.ImageZ+backImage
65            sumMin = np.min(sumImage)
66            sumMax = np.max(sumImage)
67            maskCopy['Thresholds'] = [(sumMin,sumMax),[sumMin,sumMax]]
68            G2frame.Integrate = G2img.ImageIntegrate(sumImage,data,maskCopy)
69        else:
70            G2frame.Integrate = G2img.ImageIntegrate(G2frame.ImageZ,data,masks)
71        G2plt.PlotIntegration(G2frame,newPlot=True)
72        G2IO.SaveIntegration(G2frame,G2frame.PickId,data)
73        for item in G2frame.MakePDF: item.Enable(True)
74       
75    def OnIntegrateAll(event):
76        print 'integrate all'
77        TextList = [[False,'All IMG',0]]
78        Names = []
79        if G2frame.PatternTree.GetCount():
80            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
81            while id:
82                name = G2frame.PatternTree.GetItemText(id)
83                Names.append(name)
84                if 'IMG' in name:
85                    TextList.append([False,name,id])
86                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
87            if len(TextList) == 1:
88                G2frame.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
89                return
90            dlg = G2frame.CopyDialog(G2frame,'Image integration controls','Select images to integrate:',TextList)
91            try:
92                if dlg.ShowModal() == wx.ID_OK:
93                    result = dlg.GetData()
94                    if result[0][0]:                    #the 'All IMG' is True
95                        result = TextList[1:]
96                        for item in result: item[0] = True
97                    for item in result:
98                        ifintegrate,name,id = item
99                        if ifintegrate:
100                            id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, name)
101                            Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
102                            image = G2IO.GetImageData(G2frame,imagefile,True)
103                            Id = G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')
104                            Data = G2frame.PatternTree.GetItemPyData(Id)
105                            backImage = []
106                            if Data['background image'][0]:
107                                backImg = Data['background image'][0]
108                                backScale = Data['background image'][1]
109                                id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
110                                Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
111                                backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
112                            try:
113                                Masks = G2frame.PatternTree.GetItemPyData(
114                                    G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'))
115                            except TypeError:       #missing Masks
116                                Imin,Imax = Data['Range']
117                                Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
118                                G2frame.PatternTree.SetItemPyData(
119                                    G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'),Masks)
120                            if len(backImage):                               
121                                G2frame.Integrate = G2img.ImageIntegrate(image+backImage,Data,Masks)
122                            else:
123                                G2frame.Integrate = G2img.ImageIntegrate(image,Data,Masks)
124#                            G2plt.PlotIntegration(G2frame,newPlot=True,event=event)
125                            G2IO.SaveIntegration(G2frame,Id,Data)
126            finally:
127                dlg.Destroy()
128       
129    def OnCopyControls(event):
130        import copy
131        TextList = [[False,'All IMG',0]]
132        Names = []
133        if G2frame.PatternTree.GetCount():
134            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
135            while id:
136                name = G2frame.PatternTree.GetItemText(id)
137                Names.append(name)
138                if 'IMG' in name:
139                    if id == G2frame.Image:
140                        Source = name
141                        Data = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
142                        Data['showLines'] = True
143                        Data['ring'] = []
144                        Data['rings'] = []
145                        Data['ellipses'] = []
146                        Data['setDefault'] = False
147                    else:
148                        TextList.append([False,name,id])
149                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
150            if len(TextList) == 1:
151                G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
152                return
153            dlg = G2frame.CopyDialog(G2frame,'Copy image controls','Copy controls from '+Source+' to:',TextList)
154            try:
155                if dlg.ShowModal() == wx.ID_OK:
156                    result = dlg.GetData()
157                    if result[0][0]:
158                        result = TextList[1:]
159                        for item in result: item[0] = True
160                    for i,item in enumerate(result):
161                        ifcopy,name,id = item
162                        if ifcopy:
163                            oldData = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
164                            Data['range'] = oldData['range']
165                            Data['size'] = oldData['size']                               
166                            Data['ring'] = []
167                            Data['rings'] = []
168                            Data['ellipses'] = []
169                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls'),copy.deepcopy(Data))
170            finally:
171                dlg.Destroy()
172               
173    def OnSaveControls(event):
174        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
175            'image control files (*.imctrl)|*.imctrl',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
176        try:
177            if dlg.ShowModal() == wx.ID_OK:
178                filename = dlg.GetPath()
179                File = open(filename,'w')
180                save = {}
181                keys = ['type','wavelength','calibrant','distance','center',
182                    'tilt','rotation','azmthOff','fullIntegrate','LRazimuth',
183                    'IOtth','outAzimuths']
184                for key in keys:
185                    if key in ['rotation']:
186                        File.write(key+':'+str(data[key]-90.)+'\n')                       
187                    else:
188                        File.write(key+':'+str(data[key])+'\n')
189                File.close()
190        finally:
191            dlg.Destroy()
192       
193    def OnLoadControls(event):
194        cntlList = ['wavelength','distance','tilt','rotation',
195            'fullIntegrate','outAzimuths','LRazimuth','IOtth']
196        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
197            'image control files (*.imctrl)|*.imctrl',wx.OPEN|wx.CHANGE_DIR)
198        try:
199            if dlg.ShowModal() == wx.ID_OK:
200                filename = dlg.GetPath()
201                File = open(filename,'r')
202                save = {}
203                S = File.readline()
204                while S:
205                    if S[0] == '#':
206                        S = File.readline()
207                        continue
208                    [key,val] = S[:-1].split(':')
209                    if key in ['type','calibrant',]:
210                        save[key] = val
211                    elif key in ['rotation']:
212                        save[key] = float(val)+90.
213                    elif key in ['center',]:
214                        if ',' in val:
215                            save[key] = eval(val)
216                        else:
217                            vals = val.strip('[] ').split()
218                            save[key] = [float(vals[0]),float(vals[1])] 
219                    elif key in cntlList:
220                        save[key] = eval(val)
221                    S = File.readline()
222                data.update(save)
223                UpdateImageControls(G2frame,data,masks)
224                G2plt.PlotExposedImage(G2frame,event=event)
225               
226                File.close()
227        finally:
228            dlg.Destroy()
229           
230# Sizers
231                                       
232    def ComboSizer():
233
234        def OnDataType(event):
235            data['type'] = typeSel.GetValue()[:4]
236   
237        def OnNewColorBar(event):
238            data['color'] = colSel.GetValue()
239            G2plt.PlotExposedImage(G2frame,event=event)
240       
241        def OnAzmthOff(event):
242            try:
243                azmthoff = float(azmthOff.GetValue())
244                data['azmthOff'] = azmthoff
245            except ValueError:
246                pass
247            azmthOff.SetValue("%.2f"%(data['azmthOff']))          #reset in case of error 
248       
249        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
250        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Type of image data: '),0,
251            wx.ALIGN_CENTER_VERTICAL)
252        typeSel = wx.ComboBox(parent=G2frame.dataDisplay,value=typeDict[data['type']],choices=typeList,
253            style=wx.CB_READONLY|wx.CB_DROPDOWN)
254        typeSel.SetValue(data['type'])
255        typeSel.Bind(wx.EVT_COMBOBOX, OnDataType)
256        comboSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
257        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Color bar '),0,
258            wx.ALIGN_CENTER_VERTICAL)
259        colSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['color'],choices=colorList,
260            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
261        colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
262        comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
263        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Azimuth offset '),0,
264            wx.ALIGN_CENTER_VERTICAL)
265        azmthOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['azmthOff'])),
266            style=wx.TE_PROCESS_ENTER)
267        azmthOff.Bind(wx.EVT_TEXT_ENTER,OnAzmthOff)
268        azmthOff.Bind(wx.EVT_KILL_FOCUS,OnAzmthOff)
269        comboSizer.Add(azmthOff,0,wx.ALIGN_CENTER_VERTICAL)
270        return comboSizer
271       
272    def MaxSizer():
273               
274        def OnMaxVal(event):
275            try:
276                value = min(data['range'][0][1],int(maxVal.GetValue()))
277                if value < data['range'][1][0]+1:
278                    raise ValueError
279                data['range'][1][1] = value
280            except ValueError:
281                pass
282            maxVal.SetValue('%.0f'%(data['range'][1][1]))
283            DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
284            sqrtDeltOne = math.sqrt(DeltOne)
285            maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
286            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
287            G2plt.PlotExposedImage(G2frame,event=event)
288           
289        def OnMinVal(event):
290            try:
291                value = int(minVal.GetValue())
292                if value > data['range'][1][1]-1:
293                    raise ValueError
294                data['range'][1][0] = value
295            except ValueError:
296                pass
297            minVal.SetValue('%.0f'%(data['range'][1][0]))
298            minSel.SetValue(int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
299            G2plt.PlotExposedImage(G2frame,event=event)
300           
301        def OnMaxSlider(event):
302            sqrtDeltZero = math.sqrt(data['range'][0][1])
303            imax = int(maxSel.GetValue())*sqrtDeltZero/100.
304            data['range'][1][1] = imax**2
305            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,data['range'][1][0]))
306            DeltOne = max(1.0,data['range'][1][1]-data['range'][1][0])
307            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
308            maxVal.SetValue('%.0f'%(data['range'][1][1]))
309            G2plt.PlotExposedImage(G2frame,event=event)
310           
311        def OnMinSlider(event):
312            DeltOne = data['range'][1][1]-data['range'][1][0]
313            imin = int(minSel.GetValue())*DeltOne/100.
314            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,imin))
315            minVal.SetValue('%.0f'%(data['range'][1][0]))
316            G2plt.PlotExposedImage(G2frame,event=event)
317           
318        maxSizer = wx.FlexGridSizer(2,3,0,5)
319        maxSizer.AddGrowableCol(1,1)
320        maxSizer.SetFlexibleDirection(wx.HORIZONTAL)
321        sqrtDeltZero = math.sqrt(data['range'][0][1]-max(0.0,data['range'][0][0]))
322        DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
323        sqrtDeltOne = math.sqrt(DeltOne)
324        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),0,
325            wx.ALIGN_CENTER_VERTICAL)
326        maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
327            value=int(100*sqrtDeltOne/sqrtDeltZero))
328        maxSizer.Add(maxSel,1,wx.EXPAND)
329        maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
330        maxVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][1]))
331        maxVal.Bind(wx.EVT_TEXT_ENTER,OnMaxVal)   
332        maxVal.Bind(wx.EVT_KILL_FOCUS,OnMaxVal)
333        maxSizer.Add(maxVal,0,wx.ALIGN_CENTER_VERTICAL)   
334        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),0,
335            wx.ALIGN_CENTER_VERTICAL)
336        minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
337            value=int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
338        maxSizer.Add(minSel,1,wx.EXPAND)
339        minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
340        minVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][0]))
341        minVal.Bind(wx.EVT_TEXT_ENTER,OnMinVal)   
342        minVal.Bind(wx.EVT_KILL_FOCUS,OnMinVal)
343        maxSizer.Add(minVal,0,wx.ALIGN_CENTER_VERTICAL)
344        return maxSizer
345       
346    def CalibCoeffSizer():
347       
348        def OnWavelength(event):
349            try:
350                wave = float(waveSel.GetValue())
351                if wave < .01:
352                    raise ValueError
353                data['wavelength'] = wave
354            except ValueError:
355                pass
356            waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
357           
358        calibSizer = wx.FlexGridSizer(5,2,5,5)
359        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration coefficients'),0,
360            wx.ALIGN_CENTER_VERTICAL)   
361        calibSizer.Add((5,0),0)       
362        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Beam center X,Y'),0,
363            wx.ALIGN_CENTER_VERTICAL)
364        cent = data['center']
365        centText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
366        centText.SetBackgroundColour(VERY_LIGHT_GREY)
367        calibSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)       
368        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Wavelength'),0,
369            wx.ALIGN_CENTER_VERTICAL)
370        waveSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['wavelength'])),
371            style=wx.TE_PROCESS_ENTER)
372        waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
373        waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
374        calibSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)             
375        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Distance'),0,
376            wx.ALIGN_CENTER_VERTICAL)
377        distSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
378        distSel.SetBackgroundColour(VERY_LIGHT_GREY)
379        calibSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
380        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt angle'),0,
381            wx.ALIGN_CENTER_VERTICAL)
382        tiltSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
383        tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
384        calibSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
385        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt rotation'),0,
386            wx.ALIGN_CENTER_VERTICAL)
387        rotSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['rotation']-90.)),style=wx.TE_READONLY) #kluge to get rotation from vertical - see GSASIIimage
388        rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
389        calibSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
390        return calibSizer
391   
392    def IntegrateSizer():
393       
394        def OnIOtth(event):
395            Ltth = max(float(G2frame.InnerTth.GetValue()),0.001)
396            Utth = float(G2frame.OuterTth.GetValue())
397            if Ltth > Utth:
398                Ltth,Utth = Utth,Ltth
399            data['IOtth'] = [Ltth,Utth]
400            G2frame.InnerTth.SetValue("%8.3f" % (Ltth))
401            G2frame.OuterTth.SetValue("%8.2f" % (Utth))
402            G2plt.PlotExposedImage(G2frame,event=event)
403       
404        def OnLRazim(event):
405            Lazm =int(G2frame.Lazim.GetValue())
406            if data['fullIntegrate']:
407               G2frame.Razim.SetValue("%6d" % (Lazm+360))
408            Razm = int(G2frame.Razim.GetValue())
409            if Lazm > Razm:
410                Lazm -= 360
411            data['LRazimuth'] = [Lazm,Razm]
412            G2plt.PlotExposedImage(G2frame,event=event)
413       
414        def OnNumOutChans(event):
415            try:
416                numChans = int(outChan.GetValue())
417                if numChans < 1:
418                    raise ValueError
419                data['outChannels'] = numChans
420            except ValueError:
421                pass
422            outChan.SetValue(str(data['outChannels']))          #reset in case of error       
423       
424        def OnNumOutAzms(event):
425            try:
426                numAzms = int(outAzim.GetValue())
427                if numAzms < 1:
428                    raise ValueError
429                data['outAzimuths'] = numAzms           
430            except ValueError:
431                pass
432            outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
433            G2plt.PlotExposedImage(G2frame,event=event)
434       
435        def OnOblique(event):
436            if data['Oblique'][1]:
437                data['Oblique'][1] = False
438            else:
439                data['Oblique'][1] = True
440               
441        def OnObliqVal(event):
442            try:
443                value = float(obliqVal.GetValue())
444                if 0.01 <= value <= 0.99:
445                    data['Oblique'][0] = value
446                else:
447                    raise ValueError
448            except ValueError:
449                pass
450            obliqVal.SetValue('%.3f'%(data['Oblique'][0]))
451                           
452        def OnShowLines(event):
453            if data['showLines']:
454                data['showLines'] = False
455            else:
456                data['showLines'] = True
457            G2plt.PlotExposedImage(G2frame,event=event)
458           
459        def OnFullIntegrate(event):
460            Lazm =int(G2frame.Lazim.GetValue())
461            if data['fullIntegrate']:
462                data['fullIntegrate'] = False
463                data['LRazimuth'] = [Lazm,Lazm+20]
464            else:
465                data['fullIntegrate'] = True
466                data['LRazimuth'] = [Lazm,Lazm+360]
467            UpdateImageControls(G2frame,data,masks)
468            G2plt.PlotExposedImage(G2frame,event=event)
469           
470        def OnSetDefault(event):
471            import copy
472            if data['setDefault']:
473                G2frame.imageDefault = {}
474                data['setDefault'] = False
475            else:
476                G2frame.imageDefault = copy.copy(data)
477                data['setDefault'] = True
478               
479        def OnCenterAzm(event):
480            if data['centerAzm']:
481                data['centerAzm'] = False
482            else:
483                data['centerAzm'] = True
484            G2plt.PlotExposedImage(G2frame,event=event)
485               
486        dataSizer = wx.FlexGridSizer(5,2,5,5)
487        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Integration coefficients'),0,
488            wx.ALIGN_CENTER_VERTICAL)   
489        dataSizer.Add((5,0),0)
490        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Inner/Outer 2-theta'),0,
491            wx.ALIGN_CENTER_VERTICAL)
492           
493        IOtth = data['IOtth']
494        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
495        G2frame.InnerTth = wx.TextCtrl(parent=G2frame.dataDisplay,
496            value=("%8.3f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
497        G2frame.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
498        G2frame.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
499        littleSizer.Add(G2frame.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
500        G2frame.OuterTth = wx.TextCtrl(parent=G2frame.dataDisplay,
501            value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
502        G2frame.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
503        G2frame.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
504        littleSizer.Add(G2frame.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
505        dataSizer.Add(littleSizer,0,)
506        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Start/End azimuth'),0,
507            wx.ALIGN_CENTER_VERTICAL)
508        LRazim = data['LRazimuth']
509        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
510        G2frame.Lazim = wx.TextCtrl(parent=G2frame.dataDisplay,
511            value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
512        G2frame.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
513        G2frame.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
514        littleSizer.Add(G2frame.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
515        G2frame.Razim = wx.TextCtrl(parent=G2frame.dataDisplay,
516            value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
517        G2frame.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
518        G2frame.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
519        if data['fullIntegrate']:
520            G2frame.Razim.Enable(False)
521            G2frame.Razim.SetBackgroundColour(VERY_LIGHT_GREY)
522            G2frame.Razim.SetValue("%6d" % (LRazim[0]+360))
523        littleSizer.Add(G2frame.Razim,0,wx.ALIGN_CENTER_VERTICAL)
524        dataSizer.Add(littleSizer,0,)
525        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
526            wx.ALIGN_CENTER_VERTICAL)
527        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
528        outChan = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
529        outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
530        outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
531        littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
532        outAzim = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
533        outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
534        outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
535        littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
536        dataSizer.Add(littleSizer,0,)
537        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
538        oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply detector absorption?')
539        dataSizer.Add(oblique,0,wx.ALIGN_CENTER_VERTICAL)
540        oblique.Bind(wx.EVT_CHECKBOX, OnOblique)
541        oblique.SetValue(data['Oblique'][1])
542        littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.01-0.99)  '),0,
543            wx.ALIGN_CENTER_VERTICAL)
544        obliqVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['Oblique'][0]),style=wx.TE_PROCESS_ENTER)
545        obliqVal.Bind(wx.EVT_TEXT_ENTER,OnObliqVal)
546        obliqVal.Bind(wx.EVT_KILL_FOCUS,OnObliqVal)
547        littleSizer.Add(obliqVal,0,wx.ALIGN_CENTER_VERTICAL)
548        dataSizer.Add(littleSizer,0,)
549       
550        showLines = wx.CheckBox(parent=G2frame.dataDisplay,label='Show integration limits?')
551        dataSizer.Add(showLines,0,wx.ALIGN_CENTER_VERTICAL)
552        showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
553        showLines.SetValue(data['showLines'])
554        fullIntegrate = wx.CheckBox(parent=G2frame.dataDisplay,label='Do full integration?')
555        dataSizer.Add(fullIntegrate,0,wx.ALIGN_CENTER_VERTICAL)
556        fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
557        fullIntegrate.SetValue(data['fullIntegrate'])
558        setDefault = wx.CheckBox(parent=G2frame.dataDisplay,label='Use as default for all images?')
559        dataSizer.Add(setDefault,0,wx.ALIGN_CENTER_VERTICAL)
560        setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
561        setDefault.SetValue(data['setDefault'])
562        centerAzm = wx.CheckBox(parent=G2frame.dataDisplay,label='Azimuth at bin center?')
563        dataSizer.Add(centerAzm,0,wx.ALIGN_CENTER_VERTICAL)
564        centerAzm.Bind(wx.EVT_CHECKBOX, OnCenterAzm)
565        centerAzm.SetValue(data['centerAzm'])
566        return dataSizer
567       
568    def BackSizer():
569       
570        def OnBackImage(event):
571            data['background image'][0] = backImage.GetValue()
572           
573        def OnBackMult(event):
574            try:
575                mult = float(backMult.GetValue())
576                data['background image'][1] = mult
577            except ValueError:
578                pass
579            backMult.SetValue("%.3f" % (data['background image'][1]))          #reset in case of error
580       
581        backSizer = wx.FlexGridSizer(1,4,5,5)
582        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background image'),0,wx.ALIGN_CENTER_VERTICAL)
583        Choices = ['',]+G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
584        backImage = wx.ComboBox(parent=G2frame.dataDisplay,value=data['background image'][0],choices=Choices,
585            style=wx.CB_READONLY|wx.CB_DROPDOWN)
586        backImage.Bind(wx.EVT_COMBOBOX,OnBackImage)
587        backSizer.Add(backImage)
588        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' multiplier'),0,wx.ALIGN_CENTER_VERTICAL)
589        backMult =  wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (data['background image'][1])),
590            style=wx.TE_PROCESS_ENTER)
591        backMult.Bind(wx.EVT_TEXT_ENTER,OnBackMult)
592        backMult.Bind(wx.EVT_KILL_FOCUS,OnBackMult)
593        backSizer.Add(backMult,0,wx.ALIGN_CENTER_VERTICAL)
594        return backSizer
595                       
596    def CalibSizer():
597               
598        def OnNewCalibrant(event):
599            data['calibrant'] = calSel.GetValue()
600            data['calibskip'] = calFile.Calibrants[data['calibrant']][2]
601            limits = calFile.Calibrants[data['calibrant']][3]
602            data['calibdmin'],data['pixLimit'],data['cutoff'] = limits
603            pixLimit.SetValue(str(limits[1]))
604            cutOff.SetValue('%.1f'%(limits[2]))
605            calibSkip.SetValue(str(data['calibskip']))
606            calibDmin.SetValue('%.1f'%(limits[0]))
607           
608        def OnCalibSkip(event):
609            data['calibskip'] = int(calibSkip.GetValue())
610           
611        def OnCalibDmin(event):
612            try:
613                dmin = float(calibDmin.GetValue())
614                if dmin < 0.25:
615                    raise ValueError
616                data['calibdmin'] = dmin
617            except ValueError:
618                pass
619            calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
620                   
621        def OnCutOff(event):
622            try:
623                cutoff = float(cutOff.GetValue())
624                if cutoff < 0.1:
625                    raise ValueError
626                data['cutoff'] = cutoff
627            except ValueError:
628                pass
629            cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
630       
631        def OnPixLimit(event):
632            data['pixLimit'] = int(pixLimit.GetValue())
633           
634        def OnSetRings(event):
635            if data['setRings']:
636                data['setRings'] = False
637            else:
638                data['setRings'] = True
639            G2plt.PlotExposedImage(G2frame,event=event)
640   
641        calibSizer = wx.FlexGridSizer(2,3,5,5)
642        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
643        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibrant '),0,
644            wx.ALIGN_CENTER_VERTICAL)
645        calSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['calibrant'],choices=calList,
646            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
647        calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
648        comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
649        calibSizer.Add(comboSizer,0)
650       
651        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
652        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calib lines to skip   '),0,
653            wx.ALIGN_CENTER_VERTICAL)
654        calibSkip  = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['calibskip']),choices=[str(i) for i in range(25)],
655            style=wx.CB_READONLY|wx.CB_DROPDOWN)
656        calibSkip.Bind(wx.EVT_COMBOBOX, OnCalibSkip)
657        comboSizer.Add(calibSkip,0,wx.ALIGN_CENTER_VERTICAL)
658        calibSizer.Add(comboSizer,0)
659       
660        comboSizer = wx.BoxSizer(wx.HORIZONTAL)       
661        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min calib d-spacing '),0,
662            wx.ALIGN_CENTER_VERTICAL)
663        calibDmin = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['calibdmin'])),
664            style=wx.TE_PROCESS_ENTER)
665        calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
666        calibDmin.Bind(wx.EVT_KILL_FOCUS,OnCalibDmin)
667        comboSizer.Add(calibDmin,0,wx.ALIGN_CENTER_VERTICAL)
668        calibSizer.Add(comboSizer,0)
669       
670        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
671        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min ring I/Ib '),0,
672            wx.ALIGN_CENTER_VERTICAL)
673        cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (data['cutoff'])),
674            style=wx.TE_PROCESS_ENTER)
675        cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
676        cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
677        comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
678        calibSizer.Add(comboSizer,0)
679       
680        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
681        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Pixel search range '),0,
682            wx.ALIGN_CENTER_VERTICAL)
683        pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
684            style=wx.CB_READONLY|wx.CB_DROPDOWN)
685        pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
686        comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
687        calibSizer.Add(comboSizer,0)
688       
689        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
690        setRings = wx.CheckBox(parent=G2frame.dataDisplay,label='Show ring picks?')
691        comboSizer.Add(setRings,0)
692        setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
693        setRings.SetValue(data['setRings'])
694        calibSizer.Add(comboSizer,0)
695        return calibSizer
696       
697# Image Controls main code             
698                           
699    #fix for old files:
700    if 'azmthOff' not in data:
701        data['azmthOff'] = 0.0
702    if 'background image' not in data:
703        data['background image'] = ['',1.0]
704    if 'centerAzm' not in data:
705        data['centerAzm'] = False
706    if 'Oblique' not in data:
707        data['Oblique'] = [0.5,False]
708    #end fix
709   
710    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
711    calList = [m for m in calFile.Calibrants.keys()]
712    typeList = ['PWDR - powder diffraction data','SASD - small angle scattering data',
713        'REFL - reflectometry data']
714    if not data.get('type'):                        #patch for old project files
715        data['type'] = 'PWDR'
716    typeDict = {'PWDR':typeList[0],'SASD':typeList[1],'REFL':typeList[2]}
717    if G2frame.dataDisplay:
718        G2frame.dataDisplay.Destroy()
719    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.ImageMenu)
720    if not G2frame.dataFrame.GetStatusBar():
721        G2frame.dataFrame.CreateStatusBar()
722    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
723    G2frame.dataFrame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2gd.wxID_IMRECALIBRATE)
724    G2frame.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
725    if not data['rings']:
726        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
727    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
728    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
729    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
730    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveControls, id=G2gd.wxID_IMSAVECONTROLS)
731    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadControls, id=G2gd.wxID_IMLOADCONTROLS)
732    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
733
734    mainSizer = wx.BoxSizer(wx.VERTICAL)
735    mainSizer.Add((5,10),0)   
736    mainSizer.Add(ComboSizer(),0,wx.ALIGN_LEFT)
737    mainSizer.Add((5,5),0)           
738    mainSizer.Add(MaxSizer(),0,wx.ALIGN_LEFT|wx.EXPAND)
739   
740    mainSizer.Add((5,5),0)
741    DataSizer = wx.FlexGridSizer(1,2,5,5)
742    DataSizer.Add(CalibCoeffSizer(),0)
743    DataSizer.Add(IntegrateSizer(),0)       
744    mainSizer.Add(DataSizer,0)
745    mainSizer.Add((5,5),0)           
746    mainSizer.Add(BackSizer(),0)
747    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration controls:'),0,
748        wx.ALIGN_CENTER_VERTICAL)
749    mainSizer.Add((5,5),0)
750    mainSizer.Add(CalibSizer(),0,wx.ALIGN_CENTER_VERTICAL)
751       
752    mainSizer.Layout()   
753    G2frame.dataDisplay.SetSizer(mainSizer)
754    fitSize = mainSizer.Fit(G2frame.dataFrame)
755    G2frame.dataFrame.setSizePosLeft(fitSize)
756    G2frame.dataDisplay.SetSize(fitSize)
757   
758################################################################################
759##### Masks
760################################################################################
761   
762def UpdateMasks(G2frame,data):
763   
764    def OnTextMsg(event):
765        Obj = event.GetEventObject()
766        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
767       
768    def OnThreshold(event):
769        try:
770            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
771        except ValueError:
772            lower = thresh[0][0]
773        try:
774            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
775        except ValueError:
776            upper = thresh[0][1]
777        data['Thresholds'][1] = [lower,upper]
778        lowerThreshold.SetValue("%8d" % (lower))
779        upperThreshold.SetValue("%8d" % (upper))
780        G2plt.PlotExposedImage(G2frame,event=event)
781       
782    def OnSpotDiameter(event):
783        Obj = event.GetEventObject()
784        try:
785            diameter = min(100.,max(0.1,float(Obj.GetValue())))
786        except ValueError:
787            diameter = 1.0
788        Obj.SetValue("%.2f"%(diameter))
789        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
790        G2plt.PlotExposedImage(G2frame,event=event)
791       
792    def OnDeleteSpot(event):
793        Obj = event.GetEventObject()
794        del(data['Points'][delSpotId.index(Obj)])
795        UpdateMasks(G2frame,data)
796        G2plt.PlotExposedImage(G2frame,event=event)
797       
798    def OnRingThickness(event):
799        Obj = event.GetEventObject()
800        try:
801            thick = min(1.0,max(0.001,float(Obj.GetValue())))
802        except ValueError:
803            thick = 0.1
804        Obj.SetValue("%.3f"%(thick))
805        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
806        G2plt.PlotExposedImage(G2frame,event=event)
807       
808    def OnDeleteRing(event):
809        Obj = event.GetEventObject()
810        del(data['Rings'][delRingId.index(Obj)])
811        UpdateMasks(G2frame,data)
812        G2plt.PlotExposedImage(G2frame,event=event)
813
814    def OnArcThickness(event):
815        Obj = event.GetEventObject()
816        try:
817            thick = min(20.0,max(0.001,float(Obj.GetValue())))
818        except ValueError:
819            thick = 0.1
820        Obj.SetValue("%.3f"%(thick))
821        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
822        G2plt.PlotExposedImage(G2frame,event=event)
823       
824    def OnDeleteArc(event):
825        Obj = event.GetEventObject()
826        del(data['Arcs'][delArcId.index(Obj)])
827        UpdateMasks(G2frame,data)
828        G2plt.PlotExposedImage(G2frame,event=event)
829
830    def OnDeletePoly(event):
831        Obj = event.GetEventObject()
832        del(data['Polygons'][delPolyId.index(Obj)])
833        UpdateMasks(G2frame,data)
834        G2plt.PlotExposedImage(G2frame,event=event)
835
836    def OnCopyMask(event):
837        import copy
838        TextList = [[False,'All IMG',0]]
839        Names = []
840        if G2frame.PatternTree.GetCount():
841            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
842            while id:
843                name = G2frame.PatternTree.GetItemText(id)
844                Names.append(name)
845                if 'IMG' in name:
846                    if id == G2frame.Image:
847                        Source = name
848                        Mask = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks')))
849                        del Mask['Thresholds']
850                    else:
851                        TextList.append([False,name,id])
852                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
853            if len(TextList) == 1:
854                G2frame.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
855                return
856            dlg = G2frame.CopyDialog(G2frame,'Copy mask information','Copy mask from '+Source+' to:',TextList)
857            try:
858                if dlg.ShowModal() == wx.ID_OK:
859                    result = dlg.GetData()
860                    if result[0][0]:
861                        result = TextList[1:]
862                        for item in result: item[0] = True
863                    for i,item in enumerate(result):
864                        ifcopy,name,id = item
865                        if ifcopy:
866                            mask = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'))
867                            mask.update(Mask)                               
868                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'),copy.deepcopy(mask))
869            finally:
870                dlg.Destroy()
871               
872    def OnSaveMask(event):
873        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
874            'image mask files (*.immask)|*.immask',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
875        try:
876            if dlg.ShowModal() == wx.ID_OK:
877                filename = dlg.GetPath()
878                File = open(filename,'w')
879                save = {}
880                keys = ['Points','Rings','Arcs','Polygons','Thresholds']
881                for key in keys:
882                    File.write(key+':'+str(data[key])+'\n')
883                File.close()
884        finally:
885            dlg.Destroy()
886       
887    def OnLoadMask(event):
888        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
889            'image mask files (*.immask)|*.immask',wx.OPEN|wx.CHANGE_DIR)
890        try:
891            if dlg.ShowModal() == wx.ID_OK:
892                filename = dlg.GetPath()
893                File = open(filename,'r')
894                save = {}
895                S = File.readline()
896                while S:
897                    if S[0] == '#':
898                        S = File.readline()
899                        continue
900                    [key,val] = S[:-1].split(':')
901                    if key in ['Points','Rings','Arcs','Polygons','Thresholds']:
902                        save[key] = eval(val)
903                    S = File.readline()
904                data.update(save)
905                UpdateMasks(G2frame,data)
906                G2plt.PlotExposedImage(G2frame,event=event)
907               
908                File.close()
909        finally:
910            dlg.Destroy()
911       
912    if G2frame.dataDisplay:
913        G2frame.dataDisplay.Destroy()
914    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.MaskMenu)
915    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
916    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadMask, id=G2gd.wxID_MASKLOAD)
917    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveMask, id=G2gd.wxID_MASKSAVE)   
918    if not G2frame.dataFrame.GetStatusBar():
919        Status = G2frame.dataFrame.CreateStatusBar()
920        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
921    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
922    mainSizer = wx.BoxSizer(wx.VERTICAL)
923    mainSizer.Add((5,10),0)
924
925    thresh = data['Thresholds']         #min/max intensity range
926    spots = data['Points']               #x,y,radius in mm
927    rings = data['Rings']               #radius, thickness
928    polygons = data['Polygons']         #3+ x,y pairs
929    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
930   
931    littleSizer = wx.FlexGridSizer(2,3,0,5)
932    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper limits '),0,
933        wx.ALIGN_CENTER_VERTICAL)
934    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
935    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
936    Text.SetBackgroundColour(VERY_LIGHT_GREY)
937    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
938    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
939    Text.SetBackgroundColour(VERY_LIGHT_GREY)
940    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper thresholds '),
941        0,wx.ALIGN_CENTER_VERTICAL)
942    lowerThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
943        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
944    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
945    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
946    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
947    upperThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
948        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
949    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
950    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
951    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
952    mainSizer.Add(littleSizer,0,)
953    spotIds = []
954    delSpotId = []
955    if spots:
956        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
957        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Spot masks:'),0,
958            wx.ALIGN_CENTER_VERTICAL)
959        littleSizer.Add((5,0),0)
960        littleSizer.Add((5,0),0)
961        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' position, mm'),0,
962            wx.ALIGN_CENTER_VERTICAL)
963        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' diameter, mm'),0,
964            wx.ALIGN_CENTER_VERTICAL)
965        littleSizer.Add((5,0),0)
966        for x,y,d in spots:
967            spotText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f,%.2f" % (x,y)),
968                style=wx.TE_READONLY)
969            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
970            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
971            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
972            spotDiameter = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (d)),
973                style=wx.TE_PROCESS_ENTER)
974            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
975            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
976            spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
977            spotIds.append(spotDiameter.GetId())
978            spotDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
979            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
980            delSpotId.append(spotDelete)
981            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
982        mainSizer.Add(littleSizer,0,)
983    ringIds = []
984    delRingId = []
985    if rings:
986        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
987        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Ring masks:'),0,
988            wx.ALIGN_CENTER_VERTICAL)
989        littleSizer.Add((5,0),0)
990        littleSizer.Add((5,0),0)
991        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
992            wx.ALIGN_CENTER_VERTICAL)
993        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
994            wx.ALIGN_CENTER_VERTICAL)
995        littleSizer.Add((5,0),0)
996        for tth,thick in rings:
997            ringText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
998                style=wx.TE_READONLY)
999            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
1000            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1001            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
1002            ringThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1003                style=wx.TE_PROCESS_ENTER)
1004            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
1005            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
1006            ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
1007            ringIds.append(ringThick.GetId())
1008            ringDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1009            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
1010            delRingId.append(ringDelete)
1011            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
1012        mainSizer.Add(littleSizer,0,)
1013    arcIds = []
1014    delArcId = []
1015    if arcs:
1016        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
1017        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Arc masks:'),0,
1018            wx.ALIGN_CENTER_VERTICAL)
1019        littleSizer.Add((5,0),0)
1020        littleSizer.Add((5,0),0)
1021        littleSizer.Add((5,0),0)
1022        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
1023            wx.ALIGN_CENTER_VERTICAL)
1024        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' azimuth, deg'),0,
1025            wx.ALIGN_CENTER_VERTICAL)
1026        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
1027            wx.ALIGN_CENTER_VERTICAL)
1028        littleSizer.Add((5,0),0)
1029        for tth,azimuth,thick in arcs:
1030            arcText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
1031                style=wx.TE_READONLY)
1032            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
1033            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1034            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
1035            azmText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
1036                style=wx.TE_READONLY)
1037            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
1038            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1039            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
1040            arcThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1041                style=wx.TE_PROCESS_ENTER)
1042            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
1043            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
1044            arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
1045            arcIds.append(arcThick.GetId())
1046            arcDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1047            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
1048            delArcId.append(arcDelete)
1049            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
1050        mainSizer.Add(littleSizer,0,)
1051    polyIds = []
1052    delPolyId = []
1053    if polygons:
1054        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
1055        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Polygon masks:'),0,
1056            wx.ALIGN_CENTER_VERTICAL)
1057        littleSizer.Add((5,0),0)
1058        for polygon in polygons:
1059            if polygon:
1060                polyList = []
1061                for x,y in polygon:
1062                    polyList.append("%.2f, %.2f"%(x,y))
1063                polyText = wx.ComboBox(G2frame.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
1064                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
1065                polyDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1066                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
1067                delPolyId.append(polyDelete)
1068                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
1069        mainSizer.Add(littleSizer,0,)
1070    mainSizer.Layout()   
1071    G2frame.dataDisplay.SetSizer(mainSizer)
1072    G2frame.dataDisplay.SetSize(mainSizer.Fit(G2frame.dataFrame))
1073    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))   
1074
1075################################################################################
1076##### Stress/Strain
1077################################################################################
1078
1079def UpdateStressStrain(G2frame,data):
1080   
1081    def OnAppendDzero(event):
1082        data['d-zero'].append({'Dset':1.0,'Dcalc':0.0,'pixLimit':10,'cutoff':10.0,'ImxyObs':[[],[]],'ImxyCalc':[[],[]]})
1083        UpdateStressStrain(G2frame,data)
1084           
1085    def OnCopyStrSta(event):
1086        import copy
1087        TextList = [[False,'All IMG',0]]
1088        Names = []
1089        if G2frame.PatternTree.GetCount():
1090            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
1091            while id:
1092                name = G2frame.PatternTree.GetItemText(id)
1093                Names.append(name)
1094                if 'IMG' in name:
1095                    if id == G2frame.Image:
1096                        Source = name
1097                        Data = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Stress/Strain')))
1098                    else:
1099                        TextList.append([False,name,id])
1100                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1101            if len(TextList) == 1:
1102                G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
1103                return
1104            dlg = G2frame.CopyDialog(G2frame,'Copy stress/strain controls','Copy controls from '+Source+' to:',TextList)
1105            try:
1106                if dlg.ShowModal() == wx.ID_OK:
1107                    result = dlg.GetData()
1108                    if result[0][0]:
1109                        result = TextList[1:]
1110                        for item in result: item[0] = True
1111                    for i,item in enumerate(result):
1112                        ifcopy,name,id = item
1113                        if ifcopy:
1114                            oldData = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Stress/Strain')))
1115                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Stress/Strain'),copy.deepcopy(Data))
1116            finally:
1117                dlg.Destroy()
1118
1119    def OnLoadStrSta(event):
1120        print 'Load stress/strain data - does nothing yet'
1121        event.Skip()
1122
1123    def OnSaveStrSta(event):
1124        dlg = wx.FileDialog(G2frame, 'Choose stress/strain file', '.', '', 
1125            'image control files (*.strsta)|*.strsta',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
1126        try:
1127            if dlg.ShowModal() == wx.ID_OK:
1128                filename = dlg.GetPath()
1129                File = open(filename,'w')
1130                save = {}
1131                keys = ['Type','Sample phi','Sample z','strain']
1132                keys2 = ['Dset','Dcalc','pixLimit','cutoff']
1133                File.write('{\n\t')
1134                for key in keys:
1135                    if key in 'strain':
1136                        File.write("'"+key+"':["+str(data[key][0])+','+str(data[key][1])+','+str(data[key][2])+'],')
1137                    else:
1138                        File.write("'"+key+"':"+str(data[key])+',')
1139                File.write('\n\t'+"'d-zero':[\n")
1140                for data2 in data['d-zero']:
1141                    File.write('\t\t{')
1142                    for key in keys2:
1143                        File.write("'"+key+"':"+':'+str(data2[key])+',')
1144                    File.write("'ImxyObs':[[],[]],'Imxycalc':[[],[]]},\n")
1145                File.write('\t]\n}')
1146                File.close()
1147        finally:
1148            dlg.Destroy()
1149
1150    def OnFitStrSta(event):
1151        Masks = G2frame.PatternTree.GetItemPyData(
1152            G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'))
1153        Controls = G2frame.PatternTree.GetItemPyData(
1154            G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Image Controls'))
1155        G2img.FitStrSta(G2frame.ImageZ,data,Controls,Masks)
1156        G2plt.PlotExposedImage(G2frame,event=event)
1157       
1158    def SamSizer():
1159       
1160        def OnStrainType(event):
1161            data['Type'] = strType.GetValue()
1162       
1163        def OnSamPhi(event):
1164            try:
1165                value = float(samPhi.GetValue())
1166            except ValueError:
1167                value = data['Sample phi']
1168            data['Sample phi'] = value
1169            samPhi.SetValue("%.3f" % (data['Sample phi']))
1170               
1171        def OnSamZ(event):
1172            try:
1173                value = float(samZ.GetValue())
1174            except ValueError:
1175                value = data['Sample z']
1176            data['Sample z'] = value
1177            samZ.SetValue("%.3f" % (data['Sample z']))
1178               
1179        samSizer = wx.BoxSizer(wx.HORIZONTAL)
1180        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Strain type: '),0,wx.ALIGN_CENTER_VERTICAL)
1181        strType = wx.ComboBox(G2frame.dataDisplay,value=data['Type'],choices=['True','Conventional'],
1182            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1183        strType.SetValue(data['Type'])
1184        strType.Bind(wx.EVT_COMBOBOX, OnStrainType)
1185        samSizer.Add(strType,0,wx.ALIGN_CENTER_VERTICAL)
1186       
1187        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Sample phi: '),0,wx.ALIGN_CENTER_VERTICAL)
1188        samPhi = wx.TextCtrl(G2frame.dataDisplay,-1,value=("%.3f" % (data['Sample phi'])),
1189            style=wx.TE_PROCESS_ENTER)
1190        samSizer.Add(samPhi,0,wx.ALIGN_CENTER_VERTICAL)
1191        samPhi.Bind(wx.EVT_TEXT_ENTER,OnSamPhi)
1192        samPhi.Bind(wx.EVT_KILL_FOCUS,OnSamPhi)
1193        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Sample delta-z(mm): '),0,wx.ALIGN_CENTER_VERTICAL)
1194        samZ = wx.TextCtrl(G2frame.dataDisplay,-1,value=("%.3f" % (data['Sample z'])),
1195            style=wx.TE_PROCESS_ENTER)
1196        samSizer.Add(samZ,0,wx.ALIGN_CENTER_VERTICAL)
1197        samZ.Bind(wx.EVT_TEXT_ENTER,OnSamZ)
1198        samZ.Bind(wx.EVT_KILL_FOCUS,OnSamZ)
1199        return samSizer
1200       
1201    def DzeroSizer():
1202   
1203        def OnDzero(event):
1204            Obj = event.GetEventObject()
1205            try:
1206                value = min(10.0,max(1.0,float(Obj.GetValue())))
1207            except ValueError:
1208                value = 1.0
1209            Obj.SetValue("%.5f"%(value))
1210            data['d-zero'][Indx[Obj.GetId()]]['Dset'] = value
1211           
1212        def OnDeleteDzero(event):
1213            Obj = event.GetEventObject()
1214            del(data['d-zero'][delIndx.index(Obj)])
1215            UpdateStressStrain(G2frame,data)
1216       
1217        def OnCutOff(event):
1218            Obj = event.GetEventObject()
1219            try:
1220                value = min(10.0,max(0.5,float(Obj.GetValue())))
1221            except ValueError:
1222                value = 10.0
1223            Obj.SetValue("%.1f"%(value))
1224            data['d-zero'][Indx[Obj.GetId()]]['cutoff'] = value
1225       
1226        def OnPixLimit(event):
1227            Obj = event.GetEventObject()
1228            data['d-zero'][Indx[Obj.GetId()]]['pixLimit'] = int(Obj.GetValue())
1229           
1230        Indx = {}
1231        delIndx = []   
1232        dzeroSizer = wx.FlexGridSizer(1,8,5,5)
1233        for id,dzero in enumerate(data['d-zero']):
1234            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' d-zero #%d: '%(id))),
1235                0,wx.ALIGN_CENTER_VERTICAL)
1236            dZero = wx.TextCtrl(G2frame.dataDisplay,-1,value=('%.5f'%(dzero['Dset'])),
1237                style=wx.TE_PROCESS_ENTER)
1238            dzeroSizer.Add(dZero,0,wx.ALIGN_CENTER_VERTICAL)
1239            dZero.Bind(wx.EVT_TEXT_ENTER,OnDzero)
1240            dZero.Bind(wx.EVT_KILL_FOCUS,OnDzero)
1241            Indx[dZero.GetId()] = id
1242            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' d-zero calc: %.5f'%(dzero['Dcalc']))),
1243                0,wx.ALIGN_CENTER_VERTICAL)
1244               
1245            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Min ring I/Ib '),0,
1246                wx.ALIGN_CENTER_VERTICAL)
1247            cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (dzero['cutoff'])),
1248                style=wx.TE_PROCESS_ENTER)
1249            cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
1250            cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
1251            Indx[cutOff.GetId()] = id
1252            dzeroSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
1253       
1254            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Pixel search range '),0,
1255                wx.ALIGN_CENTER_VERTICAL)
1256            pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(dzero['pixLimit']),choices=['1','2','5','10','15','20'],
1257                style=wx.CB_READONLY|wx.CB_DROPDOWN)
1258            pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
1259            Indx[pixLimit.GetId()] = id
1260            dzeroSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)               
1261               
1262            dzeroDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1263            dzeroDelete.Bind(wx.EVT_CHECKBOX,OnDeleteDzero)
1264            delIndx.append(dzeroDelete)
1265            dzeroSizer.Add(dzeroDelete,0,wx.ALIGN_CENTER_VERTICAL)
1266        return dzeroSizer
1267       
1268    def StrainSizer():
1269       
1270        strainSizer = wx.BoxSizer(wx.VERTICAL)
1271        strainSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' Strain tensor:')),
1272            0,wx.ALIGN_CENTER_VERTICAL)
1273        tensorSizer = wx.FlexGridSizer(3,6,5,5)
1274        names = [[' e11','e12','e13'],[' e21','e22','e23'],[' e31','e32','e33']]
1275        for i in range(3):
1276            for j in range(3):
1277                tensorSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=names[i][j]),0,wx.ALIGN_CENTER_VERTICAL)
1278                tensorElem = wx.TextCtrl(G2frame.dataDisplay,-1,value='%.2f'%(data['strain'][i][j]),style=wx.TE_READONLY)
1279                tensorElem.SetBackgroundColour(VERY_LIGHT_GREY)
1280                tensorSizer.Add(tensorElem,0,wx.ALIGN_CENTER_VERTICAL)
1281        strainSizer.Add(tensorSizer)
1282        return strainSizer
1283
1284    if G2frame.dataDisplay:
1285        G2frame.dataDisplay.Destroy()
1286    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.StrStaMenu)
1287    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAppendDzero, id=G2gd.wxID_APPENDDZERO)
1288    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitStrSta, id=G2gd.wxID_STRSTAFIT)
1289    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyStrSta, id=G2gd.wxID_STRSTACOPY)
1290    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadStrSta, id=G2gd.wxID_STRSTALOAD)
1291    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveStrSta, id=G2gd.wxID_STRSTASAVE)   
1292    if not G2frame.dataFrame.GetStatusBar():
1293        Status = G2frame.dataFrame.CreateStatusBar()
1294        Status.SetStatusText(" test  ")
1295    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
1296    mainSizer = wx.BoxSizer(wx.VERTICAL)
1297    mainSizer.Add((5,10),0)
1298    mainSizer.Add(SamSizer())
1299    mainSizer.Add((5,10),0)
1300    mainSizer.Add(DzeroSizer())
1301    mainSizer.Add((5,10),0)
1302    mainSizer.Add(StrainSizer())
1303   
1304    mainSizer.Layout()   
1305    G2frame.dataDisplay.SetSizer(mainSizer)
1306    G2frame.dataDisplay.SetSize(mainSizer.Fit(G2frame.dataFrame))
1307    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))   
Note: See TracBrowser for help on using the repository browser.