source: trunk/GSASIIimgGUI.py @ 134

Last change on this file since 134 was 134, checked in by vondreel, 11 years ago

modify image intensity sliders

File size: 32.7 KB
Line 
1#GSASII - image data display routines
2import wx
3import wx.grid as wg
4import matplotlib as mpl
5import math
6import time
7import cPickle
8import GSASIIpath
9import GSASIIimage as G2img
10import GSASIIplot as G2plt
11import GSASIIIO as G2IO
12import GSASIIgrid as G2gd
13
14VERY_LIGHT_GREY = wx.Colour(235,235,235)
15
16# trig functions in degrees
17sind = lambda x: math.sin(x*math.pi/180.)
18tand = lambda x: math.tan(x*math.pi/180.)
19cosd = lambda x: math.cos(x*math.pi/180.)
20asind = lambda x: 180.*math.asin(x)/math.pi
21
22def UpdateImageControls(self,data,masks):
23    import ImageCalibrants as calFile
24   
25    def OnNewColorBar(event):
26        data['color'] = colSel.GetValue()
27        G2plt.PlotExposedImage(self,event=event)
28       
29    def OnNewCalibrant(event):
30        data['calibrant'] = calSel.GetValue()
31       
32    def OnPixLimit(event):
33        data['pixLimit'] = int(pixLimit.GetValue())
34       
35    def OnMaxSlider(event):
36        sqrtDeltZero = math.sqrt(data['range'][0][1]-data['range'][0][0])
37        imax = int(maxSel.GetValue())*sqrtDeltZero/100.
38        data['range'][1][1] = imax**2+data['range'][0][0]
39        data['range'][1][0] = min(data['range'][1][1]-1,data['range'][1][0])
40        DeltOne = data['range'][1][1]-data['range'][0][0]
41        minSel.SetValue(int(100*(data['range'][1][0]-data['range'][0][0])/DeltOne))
42        G2plt.PlotExposedImage(self,event=event)
43       
44    def OnMinSlider(event):
45        DeltOne = data['range'][1][1]-data['range'][0][0]
46        imin = int(minSel.GetValue())*DeltOne/100.
47        data['range'][1][0] = min(data['range'][1][1]-1,imin)+data['range'][0][0]
48        G2plt.PlotExposedImage(self,event=event)
49       
50    def OnNumOutChans(event):
51        try:
52            numChans = int(outChan.GetValue())
53            if numChans < 1:
54                raise ValueError
55            data['outChannels'] = numChans
56        except ValueError:
57            pass
58        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
59        outChan.SetValue(str(data['outChannels']))          #reset in case of error       
60       
61    def OnNumOutAzms(event):
62        try:
63            numAzms = int(outAzim.GetValue())
64            if numAzms < 1:
65                raise ValueError
66            data['outAzimuths'] = numAzms           
67        except ValueError:
68            pass
69        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
70        outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
71       
72    def OnWavelength(event):
73        try:
74            wave = float(waveSel.GetValue())
75            if wave < .01:
76                raise ValueError
77            data['wavelength'] = wave
78        except ValueError:
79            pass
80        waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
81       
82    def OnCutOff(event):
83        try:
84            cutoff = float(cutOff.GetValue())
85            data['cutoff'] = cutoff
86        except ValueError:
87            pass
88        cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
89       
90    def OnShowLines(event):
91        if data['showLines']:
92            data['showLines'] = False
93        else:
94            data['showLines'] = True
95        G2plt.PlotExposedImage(self,event=event)
96       
97    def OnFullIntegrate(event):
98        if data['fullIntegrate']:
99            data['fullIntegrate'] = False
100            self.Lazim.SetEditable(True)           
101            self.Razim.SetEditable(True)           
102        else:
103            data['fullIntegrate'] = True
104            self.Lazim.SetEditable(False)           
105            self.Razim.SetEditable(False)           
106        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
107        G2plt.PlotExposedImage(self,event=event)
108       
109    def OnSetDefault(event):
110        import copy
111        if data['setDefault']:
112            self.imageDefault = {}
113            data['setDefault'] = False
114        else:
115            self.imageDefault = copy.copy(data)
116            data['setDefault'] = True
117           
118    def OnIOtth(event):
119        Ltth = float(self.InnerTth.GetValue())
120        Utth = float(self.OuterTth.GetValue())
121        if Ltth > Utth:
122            Ltth,Utth = Utth,Ltth
123        data['IOtth'] = [Ltth,Utth]
124        self.InnerTth.SetValue("%8.2f" % (Ltth))
125        self.OuterTth.SetValue("%8.2f" % (Utth))
126        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)
127        G2plt.PlotExposedImage(self,event=event)
128       
129    def OnLRazim(event):
130        Lazm = int(self.Lazim.GetValue())
131        Razm = int(self.Razim.GetValue())
132        data['LRazimuth'] = [Lazm,Razm]
133        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)
134        G2plt.PlotExposedImage(self,event=event)
135           
136    def OnSetRings(event):
137        if data['setRings']:
138            data['setRings'] = False
139        else:
140            data['setRings'] = True
141        setRings.SetValue(data['setRings'])
142        G2plt.PlotExposedImage(self,event=event)
143           
144    def OnClearCalib(event):
145        data['ring'] = []
146        data['rings'] = []
147        data['ellipses'] = []
148        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
149        G2plt.PlotExposedImage(self,event=event)
150           
151    def OnCalibrate(event):       
152        data['setRings'] = False
153        setRings.SetValue(data['setRings'])
154        msg = \
155        '''Select > 4 points on 1st used ring of image pattern.
156        Click right mouse button to select point.
157          Use left mouse button to delete point.
158                 Press OK when done'''
159        dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK)
160        self.ifGetRing = True
161        dlg.ShowModal()
162        self.ifGetRing = False
163       
164        if G2img.ImageCalibrate(self,data):
165            Status.SetStatusText('Calibration successful')
166            cent = data['center']
167            centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1])))
168            distSel.SetValue("%8.3f"%(data['distance']))
169            tiltSel.SetValue("%9.3f"%(data['tilt']))           
170            rotSel.SetValue("%9.3f"%(data['rotation']))
171            self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=True)   
172        else:
173            Status.SetStatusText('Calibration failed')
174                   
175    def OnIntegrate(event):
176        self.Integrate = G2img.ImageIntegrate(self.ImageZ,data,masks)
177        G2plt.PlotIntegration(self,newPlot=True)
178        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=True)
179       
180    def OnIntegrateAll(event):
181        print 'integrate all'
182        TextList = []
183        Names = []
184        if self.PatternTree.GetCount():
185            id, cookie = self.PatternTree.GetFirstChild(self.root)
186            while id:
187                name = self.PatternTree.GetItemText(id)
188                Names.append(name)
189                if 'IMG' in name:
190                    TextList.append([False,name,id])
191                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
192            if not len(TextList):
193                self.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
194                return
195            dlg = self.CopyDialog(self,'Image integration controls','Select images to integrate:',TextList)
196            try:
197                if dlg.ShowModal() == wx.ID_OK:
198                    result = dlg.GetData()
199                    for item in result:
200                        ifintegrate,name,id = item
201                        if ifintegrate:
202                            id = G2gd.GetPatternTreeItemId(self, self.root, name)
203                            size,imagefile = self.PatternTree.GetItemPyData(id)
204                            image = G2IO.GetImageData(imagefile,imageOnly=True)
205                            Id = G2gd.GetPatternTreeItemId(self,id, 'Image Controls')
206                            Data = self.PatternTree.GetItemPyData(Id)
207                            try:
208                                Masks = self.PatternTree.GetItemPyData(
209                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'))
210                            except TypeError:       #missing Masks
211                                Imin,Imax = Data['Range']
212                                Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
213                                self.PatternTree.SetItemPyData(
214                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'),Masks)                               
215                            self.Integrate = G2img.ImageIntegrate(image,Data,Masks)
216#                            G2plt.PlotIntegration(self,newPlot=True,event=event)
217                            self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=True)
218                            G2IO.SaveIntegration(self,Id,Data)
219            finally:
220                dlg.Destroy()
221       
222    def OnSaveIntegrate(event):
223        print 'save integration'
224        G2IO.SaveIntegration(self,self.PickId,data)
225           
226    def OnCopyControls(event):
227        TextList = []
228        Names = []
229        if self.PatternTree.GetCount():
230            id, cookie = self.PatternTree.GetFirstChild(self.root)
231            while id:
232                name = self.PatternTree.GetItemText(id)
233                Names.append(name)
234                if 'IMG' in name:
235                    if id == self.Image:
236                        Source = name
237                        Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'))
238                        Data['showLines'] = True
239                        Data['ring'] = []
240                        Data['rings'] = []
241                        Data['cutoff'] = 10
242                        Data['pixLimit'] = 20
243                        Data['ellipses'] = []
244                        Data['calibrant'] = ''
245                        Data['setDefault'] = False
246                    else:
247                        TextList.append([False,name,id])
248                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
249            if not len(TextList):
250                self.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
251                return
252            dlg = self.CopyDialog(self,'Copy image controls','Copy controls from '+Source+' to:',TextList)
253            try:
254                if dlg.ShowModal() == wx.ID_OK:
255                    result = dlg.GetData()
256                    for i,item in enumerate(result):
257                        ifcopy,name,id = item
258                        if ifcopy:
259                            oldData = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'))
260                            Data['range'] = oldData['range']                               
261                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'),Data)
262            finally:
263                dlg.Destroy()
264                                       
265    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
266    calList = [m for m in calFile.Calibrants.keys()]
267    if self.dataDisplay:
268        self.dataDisplay.Destroy()
269    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
270    if not self.dataFrame.GetStatusBar():
271        Status = self.dataFrame.CreateStatusBar()
272    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
273    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
274    if not data['rings']:
275        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
276    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
277    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
278    self.dataFrame.Bind(wx.EVT_MENU, OnSaveIntegrate, id=G2gd.wxID_SAVEINTG)
279    self.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
280    self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
281    self.dataDisplay = wx.Panel(self.dataFrame)
282    mainSizer = wx.BoxSizer(wx.VERTICAL)
283    mainSizer.Add((5,10),0)
284   
285    maxSizer = wx.FlexGridSizer(2,2,0,5)
286    maxSizer.AddGrowableCol(1,1)
287    sqrtDeltZero = math.sqrt(data['range'][0][1]-data['range'][0][0])
288    DeltOne = data['range'][1][1]-data['range'][0][0]
289    sqrtDeltOne = math.sqrt(DeltOne)
290    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
291        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
292    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
293        value=int(100*sqrtDeltOne/sqrtDeltZero))
294    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
295    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
296    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
297        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
298    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
299        value=int(100*(data['range'][1][0]-data['range'][0][0])/DeltOne))
300    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
301    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
302    mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)
303   
304    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
305    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
306        wx.ALIGN_CENTER_VERTICAL)
307    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
308        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
309    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
310    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
311   
312    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
313        wx.ALIGN_CENTER_VERTICAL)
314    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
315        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
316    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
317    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
318    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
319        wx.ALIGN_CENTER_VERTICAL)
320    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
321        style=wx.CB_READONLY|wx.CB_DROPDOWN)
322    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
323    comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
324    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,
325        wx.ALIGN_CENTER_VERTICAL)
326    cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),
327        style=wx.TE_PROCESS_ENTER)
328    cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
329    cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
330    comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
331
332    mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)
333    mainSizer.Add((5,5),0)
334         
335    dataSizer = wx.FlexGridSizer(6,4,5,5)
336    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
337        wx.ALIGN_CENTER_VERTICAL)   
338    dataSizer.Add((5,0),0)
339    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
340        wx.ALIGN_CENTER_VERTICAL)   
341    dataSizer.Add((5,0),0)
342   
343    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
344        wx.ALIGN_CENTER_VERTICAL)
345    cent = data['center']
346    centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
347    centText.SetBackgroundColour(VERY_LIGHT_GREY)
348    dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
349   
350    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
351        wx.ALIGN_CENTER_VERTICAL)
352       
353    IOtth = data['IOtth']
354    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
355    self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,
356        value=("%8.2f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
357    self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
358    self.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
359    littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
360    self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,
361        value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
362    self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
363    self.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
364    littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
365    dataSizer.Add(littleSizer,0,)
366       
367    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
368        wx.ALIGN_CENTER_VERTICAL)
369    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
370        style=wx.TE_PROCESS_ENTER)
371    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
372    waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
373    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
374         
375    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
376        wx.ALIGN_CENTER_VERTICAL)
377    LRazim = data['LRazimuth']
378    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
379    self.Lazim = wx.TextCtrl(parent=self.dataDisplay,
380        value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
381    self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
382    self.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
383    littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
384    self.Razim = wx.TextCtrl(parent=self.dataDisplay,
385        value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
386    self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
387    self.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
388    littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)
389    dataSizer.Add(littleSizer,0,)
390       
391    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
392        wx.ALIGN_CENTER_VERTICAL)
393    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
394    distSel.SetBackgroundColour(VERY_LIGHT_GREY)
395    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
396
397    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
398        wx.ALIGN_CENTER_VERTICAL)
399    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
400    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
401    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
402    outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
403    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
404    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
405    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
406    outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
407    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
408    dataSizer.Add(littleSizer,0,)
409
410    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
411        wx.ALIGN_CENTER_VERTICAL)
412    tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
413    tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
414    dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
415    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
416    dataSizer.Add(showLines,0)
417    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
418    showLines.SetValue(data['showLines'])
419    fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')
420    dataSizer.Add(fullIntegrate,0)
421    fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
422    fullIntegrate.SetValue(data['fullIntegrate'])
423   
424    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
425        wx.ALIGN_CENTER_VERTICAL)
426    rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
427    rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
428    dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
429    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
430    dataSizer.Add(setDefault,0)
431    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
432    setDefault.SetValue(data['setDefault'])
433    setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')
434    dataSizer.Add(setRings,0)
435    setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
436    setRings.SetValue(data['setRings'])
437       
438    mainSizer.Add(dataSizer,0)
439   
440    mainSizer.Layout()   
441    self.dataDisplay.SetSizer(mainSizer)
442    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
443    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
444   
445def UpdateMasks(self,data):
446   
447    def OnTextMsg(event):
448        Obj = event.GetEventObject()
449        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
450       
451    def OnThreshold(event):
452        try:
453            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
454        except ValueError:
455            lower = thresh[0][0]
456        try:
457            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
458        except ValueError:
459            upper = thresh[0][1]
460        data['Thresholds'][1] = [lower,upper]
461        lowerThreshold.SetValue("%8d" % (lower))
462        upperThreshold.SetValue("%8d" % (upper))
463        G2plt.PlotExposedImage(self,event=event)
464       
465    def OnSpotDiameter(event):
466        Obj = event.GetEventObject()
467        try:
468            diameter = min(100.,max(0.1,float(Obj.GetValue())))
469        except ValueError:
470            diameter = 1.0
471        Obj.SetValue("%.2f"%(diameter))
472        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
473        G2plt.PlotExposedImage(self,event=event)
474       
475    def OnDeleteSpot(event):
476        Obj = event.GetEventObject()
477        del(data['Points'][delSpotId.index(Obj)])
478        UpdateMasks(self,data)           
479        G2plt.PlotExposedImage(self,event=event)
480       
481    def OnRingThickness(event):
482        Obj = event.GetEventObject()
483        try:
484            thick = min(1.0,max(0.001,float(Obj.GetValue())))
485        except ValueError:
486            thick = 0.1
487        Obj.SetValue("%.3f"%(thick))
488        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
489        G2plt.PlotExposedImage(self,event=event)
490       
491    def OnDeleteRing(event):
492        Obj = event.GetEventObject()
493        del(data['Rings'][delRingId.index(Obj)])
494        UpdateMasks(self,data)           
495        G2plt.PlotExposedImage(self,event=event)
496
497    def OnArcThickness(event):
498        Obj = event.GetEventObject()
499        try:
500            thick = min(20.0,max(0.001,float(Obj.GetValue())))
501        except ValueError:
502            thick = 0.1
503        Obj.SetValue("%.3f"%(thick))
504        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
505        G2plt.PlotExposedImage(self,event=event)
506       
507    def OnDeleteArc(event):
508        Obj = event.GetEventObject()
509        del(data['Arcs'][delArcId.index(Obj)])
510        UpdateMasks(self,data)           
511        G2plt.PlotExposedImage(self,event=event)
512
513    def OnDeletePoly(event):
514        Obj = event.GetEventObject()
515        del(data['Polygons'][delPolyId.index(Obj)])
516        UpdateMasks(self,data)           
517        G2plt.PlotExposedImage(self,event=event)
518
519    def OnCopyMask(event):
520        TextList = []
521        Names = []
522        if self.PatternTree.GetCount():
523            id, cookie = self.PatternTree.GetFirstChild(self.root)
524            while id:
525                name = self.PatternTree.GetItemText(id)
526                Names.append(name)
527                if 'IMG' in name:
528                    if id == self.Image:
529                        Source = name
530                        mask = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'))
531                    else:
532                        TextList.append([False,name,id])
533                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
534            if not len(TextList):
535                self.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
536                return
537            dlg = self.CopyDialog(self,'Copy mask information','Copy mask from '+Source+' to:',TextList)
538            try:
539                if dlg.ShowModal() == wx.ID_OK:
540                    result = dlg.GetData()
541                    for i,item in enumerate(result):
542                        ifcopy,name,id = item
543                        if ifcopy:                               
544                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'),mask)
545            finally:
546                dlg.Destroy()
547       
548    if self.dataDisplay:
549        self.dataDisplay.Destroy()
550    self.dataFrame.SetMenuBar(self.dataFrame.MaskMenu)
551    self.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
552    if not self.dataFrame.GetStatusBar():
553        Status = self.dataFrame.CreateStatusBar()
554        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
555    self.dataDisplay = wx.Panel(self.dataFrame)
556    mainSizer = wx.BoxSizer(wx.VERTICAL)
557    mainSizer.Add((5,10),0)
558
559    thresh = data['Thresholds']         #min/max intensity range
560    spots = data['Points']               #x,y,radius in mm
561    rings = data['Rings']               #radius, thickness
562    polygons = data['Polygons']         #3+ x,y pairs
563    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
564   
565    littleSizer = wx.FlexGridSizer(2,3,0,5)
566    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper limits '),0,
567        wx.ALIGN_CENTER_VERTICAL)
568    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
569    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
570    Text.SetBackgroundColour(VERY_LIGHT_GREY)
571    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
572    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
573    Text.SetBackgroundColour(VERY_LIGHT_GREY)
574    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper thresholds '),
575        0,wx.ALIGN_CENTER_VERTICAL)
576    lowerThreshold = wx.TextCtrl(parent=self.dataDisplay,
577        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
578    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
579    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
580    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
581    upperThreshold = wx.TextCtrl(parent=self.dataDisplay,
582        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
583    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
584    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
585    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
586    mainSizer.Add(littleSizer,0,)
587    spotIds = []
588    delSpotId = []
589    if spots:
590        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
591        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Spot masks:'),0,
592            wx.ALIGN_CENTER_VERTICAL)
593        littleSizer.Add((5,0),0)
594        littleSizer.Add((5,0),0)
595        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' position, mm'),0,
596            wx.ALIGN_CENTER_VERTICAL)
597        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' diameter, mm'),0,
598            wx.ALIGN_CENTER_VERTICAL)
599        littleSizer.Add((5,0),0)
600        for x,y,d in spots:
601            spotText = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f,%.2f" % (x,y)),
602                style=wx.TE_READONLY)
603            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
604            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
605            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
606            spotDiameter = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (d)),
607                style=wx.TE_PROCESS_ENTER)
608            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
609            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
610            spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
611            spotIds.append(spotDiameter.GetId())
612            spotDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
613            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
614            delSpotId.append(spotDelete)
615            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
616        mainSizer.Add(littleSizer,0,)
617    ringIds = []
618    delRingId = []
619    if rings:
620        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
621        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Ring masks:'),0,
622            wx.ALIGN_CENTER_VERTICAL)
623        littleSizer.Add((5,0),0)
624        littleSizer.Add((5,0),0)
625        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
626            wx.ALIGN_CENTER_VERTICAL)
627        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
628            wx.ALIGN_CENTER_VERTICAL)
629        littleSizer.Add((5,0),0)
630        for tth,thick in rings:
631            ringText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
632                style=wx.TE_READONLY)
633            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
634            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
635            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
636            ringThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
637                style=wx.TE_PROCESS_ENTER)
638            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
639            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
640            ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
641            ringIds.append(ringThick.GetId())
642            ringDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
643            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
644            delRingId.append(ringDelete)
645            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
646        mainSizer.Add(littleSizer,0,)
647    arcIds = []
648    delArcId = []
649    if arcs:
650        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
651        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Arc masks:'),0,
652            wx.ALIGN_CENTER_VERTICAL)
653        littleSizer.Add((5,0),0)
654        littleSizer.Add((5,0),0)
655        littleSizer.Add((5,0),0)
656        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
657            wx.ALIGN_CENTER_VERTICAL)
658        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' azimuth, deg'),0,
659            wx.ALIGN_CENTER_VERTICAL)
660        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
661            wx.ALIGN_CENTER_VERTICAL)
662        littleSizer.Add((5,0),0)
663        for tth,azimuth,thick in arcs:
664            arcText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
665                style=wx.TE_READONLY)
666            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
667            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
668            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
669            azmText = wx.TextCtrl(parent=self.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
670                style=wx.TE_READONLY)
671            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
672            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
673            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
674            arcThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
675                style=wx.TE_PROCESS_ENTER)
676            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
677            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
678            arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
679            arcIds.append(arcThick.GetId())
680            arcDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
681            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
682            delArcId.append(arcDelete)
683            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
684        mainSizer.Add(littleSizer,0,)
685    polyIds = []
686    delPolyId = []
687    if polygons:
688        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
689        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Polygon masks:'),0,
690            wx.ALIGN_CENTER_VERTICAL)
691        littleSizer.Add((5,0),0)
692        for polygon in polygons:
693            if polygon:
694                polyList = []
695                for x,y in polygon:
696                    polyList.append("%.2f, %.2f"%(x,y))
697                polyText = wx.ComboBox(self.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
698                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
699                polyDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
700                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
701                delPolyId.append(polyDelete)
702                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
703        mainSizer.Add(littleSizer,0,)
704    mainSizer.Layout()   
705    self.dataDisplay.SetSizer(mainSizer)
706    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
707    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))   
Note: See TracBrowser for help on using the repository browser.