source: trunk/GSASIIimgGUI.py @ 612

Last change on this file since 612 was 584, checked in by vondreele, 13 years ago

add coding line everywhere
more options in sample parm copy

  • Property svn:keywords set to Date Author Revision URL Id
File size: 49.1 KB
Line 
1# -*- coding: utf-8 -*-
2#GSASII - image data display routines
3########### SVN repository information ###################
4# $Date: 2012-05-03 16:35:40 +0000 (Thu, 03 May 2012) $
5# $Author: vondreele $
6# $Revision: 584 $
7# $URL: trunk/GSASIIimgGUI.py $
8# $Id: GSASIIimgGUI.py 584 2012-05-03 16:35:40Z vondreele $
9########### SVN repository information ###################
10import wx
11import matplotlib as mpl
12import math
13import time
14import copy
15import cPickle
16import GSASIIpath
17import GSASIIimage as G2img
18import GSASIIplot as G2plt
19import GSASIIIO as G2IO
20import GSASIIgrid as G2gd
21import numpy as np
22
23VERY_LIGHT_GREY = wx.Colour(235,235,235)
24
25# trig functions in degrees
26sind = lambda x: math.sin(x*math.pi/180.)
27tand = lambda x: math.tan(x*math.pi/180.)
28cosd = lambda x: math.cos(x*math.pi/180.)
29asind = lambda x: 180.*math.asin(x)/math.pi
30
31################################################################################
32##### Image Controls
33################################################################################                   
34def UpdateImageControls(G2frame,data,masks):
35    import ImageCalibrants as calFile
36   
37# Menu items
38           
39    def OnCalibrate(event):       
40        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=True)   
41        G2frame.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
42        G2frame.ifGetRing = True
43       
44    def OnRecalibrate(event):
45        G2img.ImageRecalibrate(G2frame,data)
46        UpdateImageControls(G2frame,data,masks)
47       
48    def OnClearCalib(event):
49        data['ring'] = []
50        data['rings'] = []
51        data['ellipses'] = []
52#        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
53        G2plt.PlotExposedImage(G2frame,event=event)
54           
55    def OnIntegrate(event):
56       
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        G2frame.MakePDF.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 DataSizer():
347               
348        def OnIOtth(event):
349            Ltth = max(float(G2frame.InnerTth.GetValue()),0.001)
350            Utth = float(G2frame.OuterTth.GetValue())
351            if Ltth > Utth:
352                Ltth,Utth = Utth,Ltth
353            data['IOtth'] = [Ltth,Utth]
354            G2frame.InnerTth.SetValue("%8.3f" % (Ltth))
355            G2frame.OuterTth.SetValue("%8.2f" % (Utth))
356            G2plt.PlotExposedImage(G2frame,event=event)
357       
358        def OnWavelength(event):
359            try:
360                wave = float(waveSel.GetValue())
361                if wave < .01:
362                    raise ValueError
363                data['wavelength'] = wave
364            except ValueError:
365                pass
366            waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
367       
368        def OnLRazim(event):
369            Lazm =int(G2frame.Lazim.GetValue())
370            if data['fullIntegrate']:
371               G2frame.Razim.SetValue("%6d" % (Lazm+360))
372            Razm = int(G2frame.Razim.GetValue())
373            if Lazm > Razm:
374                Lazm -= 360
375            data['LRazimuth'] = [Lazm,Razm]
376            G2plt.PlotExposedImage(G2frame,event=event)
377       
378        def OnNumOutChans(event):
379            try:
380                numChans = int(outChan.GetValue())
381                if numChans < 1:
382                    raise ValueError
383                data['outChannels'] = numChans
384            except ValueError:
385                pass
386            outChan.SetValue(str(data['outChannels']))          #reset in case of error       
387       
388        def OnNumOutAzms(event):
389            try:
390                numAzms = int(outAzim.GetValue())
391                if numAzms < 1:
392                    raise ValueError
393                data['outAzimuths'] = numAzms           
394            except ValueError:
395                pass
396            outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
397            G2plt.PlotExposedImage(G2frame,event=event)
398       
399        def OnShowLines(event):
400            if data['showLines']:
401                data['showLines'] = False
402            else:
403                data['showLines'] = True
404            G2plt.PlotExposedImage(G2frame,event=event)
405           
406        def OnFullIntegrate(event):
407            Lazm =int(G2frame.Lazim.GetValue())
408            if data['fullIntegrate']:
409                data['fullIntegrate'] = False
410                data['LRazimuth'] = [Lazm,Lazm+20]
411            else:
412                data['fullIntegrate'] = True
413                data['LRazimuth'] = [Lazm,Lazm+360]
414            UpdateImageControls(G2frame,data,masks)
415            G2plt.PlotExposedImage(G2frame,event=event)
416           
417        def OnSetDefault(event):
418            import copy
419            if data['setDefault']:
420                G2frame.imageDefault = {}
421                data['setDefault'] = False
422            else:
423                G2frame.imageDefault = copy.copy(data)
424                data['setDefault'] = True
425               
426        def OnCenterAzm(event):
427            if data['centerAzm']:
428                data['centerAzm'] = False
429            else:
430                data['centerAzm'] = True
431            G2plt.PlotExposedImage(G2frame,event=event)
432               
433        def OnBackImage(event):
434            data['background image'][0] = backImage.GetValue()
435           
436        def OnBackMult(event):
437            try:
438                mult = float(backMult.GetValue())
439                data['background image'][1] = mult
440            except ValueError:
441                pass
442            backMult.SetValue("%.3f" % (data['background image'][1]))          #reset in case of error
443
444        dataSizer = wx.FlexGridSizer(6,4,5,5)
445        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration coefficients'),0,
446            wx.ALIGN_CENTER_VERTICAL)   
447        dataSizer.Add((5,0),0)
448        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Integration coefficients'),0,
449            wx.ALIGN_CENTER_VERTICAL)   
450        dataSizer.Add((5,0),0)
451       
452        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Beam center X,Y'),0,
453            wx.ALIGN_CENTER_VERTICAL)
454        cent = data['center']
455        centText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
456        centText.SetBackgroundColour(VERY_LIGHT_GREY)
457        dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
458       
459        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Inner/Outer 2-theta'),0,
460            wx.ALIGN_CENTER_VERTICAL)
461           
462        IOtth = data['IOtth']
463        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
464        G2frame.InnerTth = wx.TextCtrl(parent=G2frame.dataDisplay,
465            value=("%8.3f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
466        G2frame.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
467        G2frame.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
468        littleSizer.Add(G2frame.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
469        G2frame.OuterTth = wx.TextCtrl(parent=G2frame.dataDisplay,
470            value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
471        G2frame.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
472        G2frame.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
473        littleSizer.Add(G2frame.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
474        dataSizer.Add(littleSizer,0,)
475           
476        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Wavelength'),0,
477            wx.ALIGN_CENTER_VERTICAL)
478        waveSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['wavelength'])),
479            style=wx.TE_PROCESS_ENTER)
480        waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
481        waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
482        dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
483             
484        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Start/End azimuth'),0,
485            wx.ALIGN_CENTER_VERTICAL)
486        LRazim = data['LRazimuth']
487        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
488        G2frame.Lazim = wx.TextCtrl(parent=G2frame.dataDisplay,
489            value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
490        G2frame.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
491        G2frame.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
492        littleSizer.Add(G2frame.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
493        G2frame.Razim = wx.TextCtrl(parent=G2frame.dataDisplay,
494            value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
495        G2frame.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
496        G2frame.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
497        if data['fullIntegrate']:
498            G2frame.Razim.Enable(False)
499            G2frame.Razim.SetBackgroundColour(VERY_LIGHT_GREY)
500            G2frame.Razim.SetValue("%6d" % (LRazim[0]+360))
501        littleSizer.Add(G2frame.Razim,0,wx.ALIGN_CENTER_VERTICAL)
502        dataSizer.Add(littleSizer,0,)
503           
504        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Distance'),0,
505            wx.ALIGN_CENTER_VERTICAL)
506        distSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
507        distSel.SetBackgroundColour(VERY_LIGHT_GREY)
508        dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
509   
510        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
511            wx.ALIGN_CENTER_VERTICAL)
512        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
513        outChan = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
514        outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
515        outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
516        littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
517        outAzim = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
518        outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
519        outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
520        littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
521        dataSizer.Add(littleSizer,0,)
522   
523        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt angle'),0,
524            wx.ALIGN_CENTER_VERTICAL)
525        tiltSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
526        tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
527        dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
528        showLines = wx.CheckBox(parent=G2frame.dataDisplay,label='Show integration limits?')
529        dataSizer.Add(showLines,0,wx.ALIGN_CENTER_VERTICAL)
530        showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
531        showLines.SetValue(data['showLines'])
532        fullIntegrate = wx.CheckBox(parent=G2frame.dataDisplay,label='Do full integration?')
533        dataSizer.Add(fullIntegrate,0,wx.ALIGN_CENTER_VERTICAL)
534        fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
535        fullIntegrate.SetValue(data['fullIntegrate'])
536       
537        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt rotation'),0,
538            wx.ALIGN_CENTER_VERTICAL)
539        rotSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['rotation']-90.)),style=wx.TE_READONLY) #kluge to get rotation from vertical - see GSASIIimage
540        rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
541        dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
542        setDefault = wx.CheckBox(parent=G2frame.dataDisplay,label='Use as default for all images?')
543        dataSizer.Add(setDefault,0,wx.ALIGN_CENTER_VERTICAL)
544        setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
545        setDefault.SetValue(data['setDefault'])
546        centerAzm = wx.CheckBox(parent=G2frame.dataDisplay,label='Azimuth at bin center?')
547        dataSizer.Add(centerAzm,0,wx.ALIGN_CENTER_VERTICAL)
548        centerAzm.Bind(wx.EVT_CHECKBOX, OnCenterAzm)
549        centerAzm.SetValue(data['centerAzm'])
550       
551        dataSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background image'),0,wx.ALIGN_CENTER_VERTICAL)
552        Choices = ['',]+G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
553        backImage = wx.ComboBox(parent=G2frame.dataDisplay,value=data['background image'][0],choices=Choices,
554            style=wx.CB_READONLY|wx.CB_DROPDOWN)
555        backImage.Bind(wx.EVT_COMBOBOX,OnBackImage)
556        dataSizer.Add(backImage)
557        dataSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' multiplier'),0,wx.ALIGN_CENTER_VERTICAL)
558        backMult =  wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (data['background image'][1])),
559            style=wx.TE_PROCESS_ENTER)
560        backMult.Bind(wx.EVT_TEXT_ENTER,OnBackMult)
561        backMult.Bind(wx.EVT_KILL_FOCUS,OnBackMult)
562        dataSizer.Add(backMult,0,wx.ALIGN_CENTER_VERTICAL)
563        return dataSizer
564
565    def CalibSizer():
566               
567        def OnNewCalibrant(event):
568            data['calibrant'] = calSel.GetValue()
569            data['calibskip'] = calFile.Calibrants[data['calibrant']][2]
570            limits = calFile.Calibrants[data['calibrant']][3]
571            data['calibdmin'],data['pixLimit'],data['cutoff'] = limits
572            pixLimit.SetValue(str(limits[1]))
573            cutOff.SetValue('%.1f'%(limits[2]))
574            calibSkip.SetValue(str(data['calibskip']))
575            calibDmin.SetValue('%.1f'%(limits[0]))
576           
577        def OnCalibSkip(event):
578            data['calibskip'] = int(calibSkip.GetValue())
579           
580        def OnCalibDmin(event):
581            try:
582                dmin = float(calibDmin.GetValue())
583                if dmin < 0.25:
584                    raise ValueError
585                data['calibdmin'] = dmin
586            except ValueError:
587                pass
588            calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
589                   
590        def OnCutOff(event):
591            try:
592                cutoff = float(cutOff.GetValue())
593                if cutoff < 0.1:
594                    raise ValueError
595                data['cutoff'] = cutoff
596            except ValueError:
597                pass
598            cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
599       
600        def OnPixLimit(event):
601            data['pixLimit'] = int(pixLimit.GetValue())
602           
603        def OnSetRings(event):
604            if data['setRings']:
605                data['setRings'] = False
606            else:
607                data['setRings'] = True
608            G2plt.PlotExposedImage(G2frame,event=event)
609   
610        calibSizer = wx.FlexGridSizer(2,3,5,5)
611        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
612        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibrant '),0,
613            wx.ALIGN_CENTER_VERTICAL)
614        calSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['calibrant'],choices=calList,
615            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
616        calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
617        comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
618        calibSizer.Add(comboSizer,0)
619       
620        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
621        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calib lines to skip   '),0,
622            wx.ALIGN_CENTER_VERTICAL)
623        calibSkip  = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['calibskip']),choices=[str(i) for i in range(25)],
624            style=wx.CB_READONLY|wx.CB_DROPDOWN)
625        calibSkip.Bind(wx.EVT_COMBOBOX, OnCalibSkip)
626        comboSizer.Add(calibSkip,0,wx.ALIGN_CENTER_VERTICAL)
627        calibSizer.Add(comboSizer,0)
628       
629        comboSizer = wx.BoxSizer(wx.HORIZONTAL)       
630        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min calib d-spacing '),0,
631            wx.ALIGN_CENTER_VERTICAL)
632        calibDmin = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['calibdmin'])),
633            style=wx.TE_PROCESS_ENTER)
634        calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
635        calibDmin.Bind(wx.EVT_KILL_FOCUS,OnCalibDmin)
636        comboSizer.Add(calibDmin,0,wx.ALIGN_CENTER_VERTICAL)
637        calibSizer.Add(comboSizer,0)
638       
639        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
640        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min ring I/Ib '),0,
641            wx.ALIGN_CENTER_VERTICAL)
642        cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (data['cutoff'])),
643            style=wx.TE_PROCESS_ENTER)
644        cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
645        cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
646        comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
647        calibSizer.Add(comboSizer,0)
648       
649        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
650        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Pixel search range '),0,
651            wx.ALIGN_CENTER_VERTICAL)
652        pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
653            style=wx.CB_READONLY|wx.CB_DROPDOWN)
654        pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
655        comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
656        calibSizer.Add(comboSizer,0)
657       
658        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
659        setRings = wx.CheckBox(parent=G2frame.dataDisplay,label='Show ring picks?')
660        comboSizer.Add(setRings,0)
661        setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
662        setRings.SetValue(data['setRings'])
663        calibSizer.Add(comboSizer,0)
664        return calibSizer
665       
666# Image Controls main code             
667                           
668    #fix for old files:
669    if 'azmthOff' not in data:
670        data['azmthOff'] = 0.0
671    if 'background image' not in data:
672        data['background image'] = ['',1.0]
673    if 'centerAzm' not in data:
674        data['centerAzm'] = False
675    #end fix
676   
677    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
678    calList = [m for m in calFile.Calibrants.keys()]
679    typeList = ['PWDR - powder diffraction data','SASD - small angle scattering data',
680        'REFL - reflectometry data']
681    if not data.get('type'):                        #patch for old project files
682        data['type'] = 'PWDR'
683    typeDict = {'PWDR':typeList[0],'SASD':typeList[1],'REFL':typeList[2]}
684    if G2frame.dataDisplay:
685        G2frame.dataDisplay.Destroy()
686    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.ImageMenu)
687    if not G2frame.dataFrame.GetStatusBar():
688        G2frame.dataFrame.CreateStatusBar()
689    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
690    G2frame.dataFrame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2gd.wxID_IMRECALIBRATE)
691    G2frame.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
692    if not data['rings']:
693        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
694    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
695    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
696    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
697    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveControls, id=G2gd.wxID_IMSAVECONTROLS)
698    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadControls, id=G2gd.wxID_IMLOADCONTROLS)
699    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
700
701    mainSizer = wx.BoxSizer(wx.VERTICAL)
702    mainSizer.Add((5,10),0)   
703    mainSizer.Add(ComboSizer(),0,wx.ALIGN_LEFT)
704    mainSizer.Add((5,5),0)           
705    mainSizer.Add(MaxSizer(),0,wx.ALIGN_LEFT|wx.EXPAND)
706   
707    mainSizer.Add((5,5),0)       
708    mainSizer.Add(DataSizer(),0)
709    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration controls:'),0,
710        wx.ALIGN_CENTER_VERTICAL)
711    mainSizer.Add((5,5),0)
712    mainSizer.Add(CalibSizer(),0,wx.ALIGN_CENTER_VERTICAL)
713       
714    mainSizer.Layout()   
715    G2frame.dataDisplay.SetSizer(mainSizer)
716    fitSize = mainSizer.Fit(G2frame.dataFrame)
717    G2frame.dataFrame.setSizePosLeft(fitSize)
718    G2frame.dataDisplay.SetSize(fitSize)
719   
720################################################################################
721##### Masks
722################################################################################
723   
724def UpdateMasks(G2frame,data):
725   
726    def OnTextMsg(event):
727        Obj = event.GetEventObject()
728        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
729       
730    def OnThreshold(event):
731        try:
732            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
733        except ValueError:
734            lower = thresh[0][0]
735        try:
736            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
737        except ValueError:
738            upper = thresh[0][1]
739        data['Thresholds'][1] = [lower,upper]
740        lowerThreshold.SetValue("%8d" % (lower))
741        upperThreshold.SetValue("%8d" % (upper))
742        G2plt.PlotExposedImage(G2frame,event=event)
743       
744    def OnSpotDiameter(event):
745        Obj = event.GetEventObject()
746        try:
747            diameter = min(100.,max(0.1,float(Obj.GetValue())))
748        except ValueError:
749            diameter = 1.0
750        Obj.SetValue("%.2f"%(diameter))
751        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
752        G2plt.PlotExposedImage(G2frame,event=event)
753       
754    def OnDeleteSpot(event):
755        Obj = event.GetEventObject()
756        del(data['Points'][delSpotId.index(Obj)])
757        UpdateMasks(G2frame,data)
758        G2plt.PlotExposedImage(G2frame,event=event)
759       
760    def OnRingThickness(event):
761        Obj = event.GetEventObject()
762        try:
763            thick = min(1.0,max(0.001,float(Obj.GetValue())))
764        except ValueError:
765            thick = 0.1
766        Obj.SetValue("%.3f"%(thick))
767        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
768        G2plt.PlotExposedImage(G2frame,event=event)
769       
770    def OnDeleteRing(event):
771        Obj = event.GetEventObject()
772        del(data['Rings'][delRingId.index(Obj)])
773        UpdateMasks(G2frame,data)
774        G2plt.PlotExposedImage(G2frame,event=event)
775
776    def OnArcThickness(event):
777        Obj = event.GetEventObject()
778        try:
779            thick = min(20.0,max(0.001,float(Obj.GetValue())))
780        except ValueError:
781            thick = 0.1
782        Obj.SetValue("%.3f"%(thick))
783        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
784        G2plt.PlotExposedImage(G2frame,event=event)
785       
786    def OnDeleteArc(event):
787        Obj = event.GetEventObject()
788        del(data['Arcs'][delArcId.index(Obj)])
789        UpdateMasks(G2frame,data)
790        G2plt.PlotExposedImage(G2frame,event=event)
791
792    def OnDeletePoly(event):
793        Obj = event.GetEventObject()
794        del(data['Polygons'][delPolyId.index(Obj)])
795        UpdateMasks(G2frame,data)
796        G2plt.PlotExposedImage(G2frame,event=event)
797
798    def OnCopyMask(event):
799        import copy
800        TextList = [[False,'All IMG',0]]
801        Names = []
802        if G2frame.PatternTree.GetCount():
803            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
804            while id:
805                name = G2frame.PatternTree.GetItemText(id)
806                Names.append(name)
807                if 'IMG' in name:
808                    if id == G2frame.Image:
809                        Source = name
810                        Mask = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks')))
811                        del Mask['Thresholds']
812                    else:
813                        TextList.append([False,name,id])
814                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
815            if len(TextList) == 1:
816                G2frame.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
817                return
818            dlg = G2frame.CopyDialog(G2frame,'Copy mask information','Copy mask from '+Source+' to:',TextList)
819            try:
820                if dlg.ShowModal() == wx.ID_OK:
821                    result = dlg.GetData()
822                    if result[0][0]:
823                        result = TextList[1:]
824                        for item in result: item[0] = True
825                    for i,item in enumerate(result):
826                        ifcopy,name,id = item
827                        if ifcopy:
828                            mask = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'))
829                            mask.update(Mask)                               
830                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'),copy.deepcopy(mask))
831            finally:
832                dlg.Destroy()
833               
834    def OnSaveMask(event):
835        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
836            'image mask files (*.immask)|*.immask',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
837        try:
838            if dlg.ShowModal() == wx.ID_OK:
839                filename = dlg.GetPath()
840                File = open(filename,'w')
841                save = {}
842                keys = ['Points','Rings','Arcs','Polygons','Thresholds']
843                for key in keys:
844                    File.write(key+':'+str(data[key])+'\n')
845                File.close()
846        finally:
847            dlg.Destroy()
848       
849    def OnLoadMask(event):
850        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
851            'image mask files (*.immask)|*.immask',wx.OPEN|wx.CHANGE_DIR)
852        try:
853            if dlg.ShowModal() == wx.ID_OK:
854                filename = dlg.GetPath()
855                File = open(filename,'r')
856                save = {}
857                S = File.readline()
858                while S:
859                    if S[0] == '#':
860                        S = File.readline()
861                        continue
862                    [key,val] = S[:-1].split(':')
863                    if key in ['Points','Rings','Arcs','Polygons','Thresholds']:
864                        save[key] = eval(val)
865                    S = File.readline()
866                data.update(save)
867                UpdateMasks(G2frame,data)
868                G2plt.PlotExposedImage(G2frame,event=event)
869               
870                File.close()
871        finally:
872            dlg.Destroy()
873       
874    if G2frame.dataDisplay:
875        G2frame.dataDisplay.Destroy()
876    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.MaskMenu)
877    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
878    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadMask, id=G2gd.wxID_MASKLOAD)
879    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveMask, id=G2gd.wxID_MASKSAVE)   
880    if not G2frame.dataFrame.GetStatusBar():
881        Status = G2frame.dataFrame.CreateStatusBar()
882        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
883    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
884    mainSizer = wx.BoxSizer(wx.VERTICAL)
885    mainSizer.Add((5,10),0)
886
887    thresh = data['Thresholds']         #min/max intensity range
888    spots = data['Points']               #x,y,radius in mm
889    rings = data['Rings']               #radius, thickness
890    polygons = data['Polygons']         #3+ x,y pairs
891    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
892   
893    littleSizer = wx.FlexGridSizer(2,3,0,5)
894    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper limits '),0,
895        wx.ALIGN_CENTER_VERTICAL)
896    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
897    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
898    Text.SetBackgroundColour(VERY_LIGHT_GREY)
899    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
900    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
901    Text.SetBackgroundColour(VERY_LIGHT_GREY)
902    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper thresholds '),
903        0,wx.ALIGN_CENTER_VERTICAL)
904    lowerThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
905        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
906    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
907    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
908    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
909    upperThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
910        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
911    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
912    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
913    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
914    mainSizer.Add(littleSizer,0,)
915    spotIds = []
916    delSpotId = []
917    if spots:
918        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
919        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Spot masks:'),0,
920            wx.ALIGN_CENTER_VERTICAL)
921        littleSizer.Add((5,0),0)
922        littleSizer.Add((5,0),0)
923        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' position, mm'),0,
924            wx.ALIGN_CENTER_VERTICAL)
925        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' diameter, mm'),0,
926            wx.ALIGN_CENTER_VERTICAL)
927        littleSizer.Add((5,0),0)
928        for x,y,d in spots:
929            spotText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f,%.2f" % (x,y)),
930                style=wx.TE_READONLY)
931            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
932            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
933            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
934            spotDiameter = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (d)),
935                style=wx.TE_PROCESS_ENTER)
936            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
937            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
938            spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
939            spotIds.append(spotDiameter.GetId())
940            spotDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
941            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
942            delSpotId.append(spotDelete)
943            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
944        mainSizer.Add(littleSizer,0,)
945    ringIds = []
946    delRingId = []
947    if rings:
948        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
949        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Ring masks:'),0,
950            wx.ALIGN_CENTER_VERTICAL)
951        littleSizer.Add((5,0),0)
952        littleSizer.Add((5,0),0)
953        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
954            wx.ALIGN_CENTER_VERTICAL)
955        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
956            wx.ALIGN_CENTER_VERTICAL)
957        littleSizer.Add((5,0),0)
958        for tth,thick in rings:
959            ringText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
960                style=wx.TE_READONLY)
961            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
962            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
963            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
964            ringThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
965                style=wx.TE_PROCESS_ENTER)
966            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
967            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
968            ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
969            ringIds.append(ringThick.GetId())
970            ringDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
971            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
972            delRingId.append(ringDelete)
973            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
974        mainSizer.Add(littleSizer,0,)
975    arcIds = []
976    delArcId = []
977    if arcs:
978        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
979        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Arc masks:'),0,
980            wx.ALIGN_CENTER_VERTICAL)
981        littleSizer.Add((5,0),0)
982        littleSizer.Add((5,0),0)
983        littleSizer.Add((5,0),0)
984        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
985            wx.ALIGN_CENTER_VERTICAL)
986        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' azimuth, deg'),0,
987            wx.ALIGN_CENTER_VERTICAL)
988        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
989            wx.ALIGN_CENTER_VERTICAL)
990        littleSizer.Add((5,0),0)
991        for tth,azimuth,thick in arcs:
992            arcText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
993                style=wx.TE_READONLY)
994            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
995            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
996            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
997            azmText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
998                style=wx.TE_READONLY)
999            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
1000            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1001            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
1002            arcThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1003                style=wx.TE_PROCESS_ENTER)
1004            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
1005            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
1006            arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
1007            arcIds.append(arcThick.GetId())
1008            arcDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1009            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
1010            delArcId.append(arcDelete)
1011            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
1012        mainSizer.Add(littleSizer,0,)
1013    polyIds = []
1014    delPolyId = []
1015    if polygons:
1016        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
1017        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Polygon masks:'),0,
1018            wx.ALIGN_CENTER_VERTICAL)
1019        littleSizer.Add((5,0),0)
1020        for polygon in polygons:
1021            if polygon:
1022                polyList = []
1023                for x,y in polygon:
1024                    polyList.append("%.2f, %.2f"%(x,y))
1025                polyText = wx.ComboBox(G2frame.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
1026                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
1027                polyDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1028                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
1029                delPolyId.append(polyDelete)
1030                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
1031        mainSizer.Add(littleSizer,0,)
1032    mainSizer.Layout()   
1033    G2frame.dataDisplay.SetSizer(mainSizer)
1034    G2frame.dataDisplay.SetSize(mainSizer.Fit(G2frame.dataFrame))
1035    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))   
Note: See TracBrowser for help on using the repository browser.