source: trunk/GSASIIgrid.py @ 195

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

add a dummy GetSelection? to class GSGrid

File size: 34.5 KB
Line 
1#GSASII - data display routines
2import wx
3import wx.grid as wg
4import time
5import cPickle
6import GSASIIpath
7import GSASIIplot as G2plt
8import GSASIIpwdGUI as G2pdG
9import GSASIIimgGUI as G2imG
10import GSASIIphsGUI as G2phG
11
12[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
13    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
14] = [wx.NewId() for _init_coll_Atom_Items in range(8)]
15
16[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
17] = [wx.NewId() for _init_coll_Data_Items in range(3)]
18
19[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
20    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
21    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
22] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
23
24[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG, 
25    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
26] = [wx.NewId() for _init_coll_IMAGE_Items in range(8)]
27
28[ wxID_MASKCOPY,
29] = [wx.NewId() for _init_coll_MASK_Items in range(1)]
30
31[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT,
32] = [wx.NewId() for _init_coll_PAWLEY_Items in range(2)]
33
34[ wxID_INSTPRMRESET,
35] = [wx.NewId() for _init_coll_INST_Items in range(1)]
36
37[ wxID_INDXRELOAD,
38] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
39
40[ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT,
41] = [wx.NewId() for _init_coll_PEAK_Items in range(3)]
42
43[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
44] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
45
46VERY_LIGHT_GREY = wx.Colour(235,235,235)
47
48class DataFrame(wx.Frame):
49    def _init_coll_BlankMenu(self,parent):
50        parent.Append(menu=self.Blank,title='')
51       
52    def _init_coll_AtomsMenu(self,parent):
53        parent.Append(menu=self.AtomEdit, title='Edit')
54       
55    def _init_coll_DataMenu(self,parent):
56        parent.Append(menu=self.DataEdit, title='Edit')
57       
58    def _init_coll_DrawAtomsMenu(self,parent):
59        parent.Append(menu=self.DrawAtomEdit, title='Edit')
60
61    def _init_coll_PawleyMenu(self,parent):
62        parent.Append(menu=self.PawleyEdit,title='Pawley Reflections Operations')
63     
64    def _init_coll_IndPeaksMenu(self,parent):
65        parent.Append(menu=self.IndPeaksEdit,title='Index Peaks Operations')
66                   
67    def _init_coll_ImageMenu(self,parent):
68        parent.Append(menu=self.ImageEdit, title='Image Operations')
69       
70    def _init_coll_InstMenu(self,parent):
71        parent.Append(menu=self.InstEdit, title='Inst. Parm. Operations')
72       
73    def _init_coll_MaskMenu(self,parent):
74        parent.Append(menu=self.MaskEdit, title='Mask Operations')
75       
76    def _init_coll_PeakMenu(self,parent):
77        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
78
79    def _init_coll_IndexMenu(self,parent):
80        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
81       
82    def _init_coll_Atom_Items(self,parent):
83        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
84            help='Inserted as an H atom')
85        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
86            help='Inserted as an H atom')
87        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
88            help='Select atom row to insert before; inserted as an H atom')
89        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
90            help='Select atom row to insert before; inserted as an H atom')
91        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
92            help='Select atoms to delete first')
93        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
94            help='Select atoms to refine first')
95        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
96            help='Select atoms to modify first')
97        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
98            help='Select atoms to transform first')
99           
100    def _init_coll_Data_Items(self,parent):
101        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
102            help='Select new powder histograms to be used for this phase')
103        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
104            help='Select new single crystal histograms to be used for this phase')
105        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
106            help='Delete histograms from use for this phase')
107           
108    def _init_coll_DrawAtom_Items(self,parent):
109        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
110            help='Select atoms first')
111        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
112            help='Select atoms first')
113        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
114            help='Select atoms first')
115        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
116            help='Resets all atom colors to defaults')
117        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
118            help='View point is 1st atom selected')
119        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
120            help='Add symmetry & cell equivalents to drawing set from selected atoms')
121        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
122            help='Transform selected atoms by symmetry & cell translations')
123        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
124            help='Fill coordination sphere for selected atoms')           
125        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
126            help='Fill unit cell with selected atoms')
127        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
128            help='Delete atoms from drawing set')
129
130    def _init_coll_Pawley_Items(self,parent):
131        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
132            help='Initialize Pawley reflection list')
133        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
134            help='Import Pawley reflection list')
135
136    def _init_coll_IndPeaks_Items(self,parent):
137        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
138            kind=wx.ITEM_NORMAL,text='Load/Reload')
139           
140    def _init_coll_Image_Items(self,parent):
141        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
142            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
143        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
144            kind=wx.ITEM_NORMAL,text='Clear calibration')
145        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
146            kind=wx.ITEM_NORMAL,text='Integrate')
147        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
148            kind=wx.ITEM_NORMAL,text='Integrate all')
149        parent.Append(help='Save integration results as a series of 1-D powder patterns', 
150            id=wxID_SAVEINTG, kind=wx.ITEM_NORMAL,text='Save Integration')
151        parent.Append(help='Copy image controls to other images', 
152            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
153        parent.Append(help='Save image controls to file', 
154            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
155        parent.Append(help='Load image controls from file', 
156            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
157
158                   
159    def _init_coll_Mask_Items(self,parent):
160        parent.Append(help='Copy mask to other images', 
161            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
162
163    def _init_coll_Inst_Items(self,parent):
164        parent.Append(help='Reset instrument profile parameters to default', 
165            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
166
167    def _init_coll_Peak_Items(self,parent):
168        self.UnDo = parent.Append(help='Undo last least squares refinement', 
169            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
170        self.PeakFit = parent.Append(id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL,text='PeakFit', 
171            help='Do single cycle of peak fitting least-squares refinement' )
172        self.AutoPeakFit = parent.Append(id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL, 
173            text='AutoPeakFit',help='Do peak fitting least-squares to convergence' )
174           
175    def _init_coll_Index_Items(self,parent):
176        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
177            text='Index Cell')
178        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
179            help='Copy selected unit cell from indexing to cell refinement fields')
180        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
181            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
182        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
183            text='Make new phase',help='Make new phase from selected unit cell')
184
185    def _init_utils(self):
186        self.BlankMenu = wx.MenuBar()
187       
188        self.AtomsMenu = wx.MenuBar()
189        self.DataMenu = wx.MenuBar()
190        self.DrawAtomsMenu = wx.MenuBar()
191        self.PawleyMenu = wx.MenuBar()
192        self.ImageMenu = wx.MenuBar()
193        self.MaskMenu = wx.MenuBar()
194        self.InstMenu = wx.MenuBar()
195        self.PeakMenu = wx.MenuBar()
196        self.IndPeaksMenu = wx.MenuBar()
197        self.IndexMenu = wx.MenuBar()
198        self.AtomEdit = wx.Menu(title='')
199        self.DataEdit = wx.Menu(title='')
200        self.DrawAtomEdit = wx.Menu(title='')
201        self.PawleyEdit = wx.Menu(title='')
202        self.ImageEdit = wx.Menu(title='')
203        self.MaskEdit = wx.Menu(title='')
204        self.InstEdit = wx.Menu(title='')
205        self.PeakEdit = wx.Menu(title='')
206        self.IndPeaksEdit = wx.Menu(title='')
207        self.IndexEdit = wx.Menu(title='')
208        self._init_coll_AtomsMenu(self.AtomsMenu)
209        self._init_coll_Atom_Items(self.AtomEdit)
210        self._init_coll_DataMenu(self.DataMenu)
211        self._init_coll_Data_Items(self.DataEdit)
212        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
213        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
214        self._init_coll_PawleyMenu(self.PawleyMenu)
215        self._init_coll_Pawley_Items(self.PawleyEdit)
216        self._init_coll_ImageMenu(self.ImageMenu)
217        self._init_coll_Image_Items(self.ImageEdit)
218        self._init_coll_MaskMenu(self.MaskMenu)
219        self._init_coll_Mask_Items(self.MaskEdit)
220        self._init_coll_InstMenu(self.InstMenu)
221        self._init_coll_Inst_Items(self.InstEdit)
222        self._init_coll_PeakMenu(self.PeakMenu)
223        self._init_coll_Peak_Items(self.PeakEdit)
224        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
225        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
226        self._init_coll_IndexMenu(self.IndexMenu)
227        self._init_coll_Index_Items(self.IndexEdit)
228        self.UnDo.Enable(False)
229        self.PeakFit.Enable(False)
230        self.AutoPeakFit.Enable(False)
231        self.IndexPeaks.Enable(False)
232        self.CopyCell.Enable(False)
233        self.RefineCell.Enable(False)
234        self.MakeNewPhase.Enable(False)
235       
236    def _init_ctrls(self, parent,name=None,size=None,pos=None):
237        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
238            size=size,pos=pos,title='GSAS-II data display')
239        self._init_utils()
240        if name:
241            self.SetLabel(name)
242        self.Show()
243       
244    def __init__(self,parent,data=None,name=None, size=None,pos=None):
245        self._init_ctrls(parent,name,size,pos)
246        self.data = data
247        self.screenSize = wx.DisplaySize()
248        Size = self.GetSize()
249        xPos = self.screenSize[0]-Size[0]
250        self.SetPosition(wx.Point(xPos,250))
251        self.dirname = ''
252        self.AtomGrid = []
253        self.selectedRow = 0
254       
255    def setSizePosLeft(self,Width):
256        screenSize = wx.DisplaySize()
257        Width[1] = min(Width[1],screenSize[1]-300)
258        self.SetSize(Width)
259        self.SetPosition(wx.Point(screenSize[0]-Width[0],250))
260       
261    def Clear(self):
262        self.ClearBackground()
263        self.DestroyChildren()
264                   
265class GSNoteBook(wx.Notebook):
266    def __init__(self, parent, name='',size = None):
267        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
268        if size: self.SetSize(size)
269                                                     
270    def Clear(self):       
271        GSNoteBook.DeleteAllPages(self)
272       
273    def FindPage(self,name):
274        numPage = self.GetPageCount()
275        for page in range(numPage):
276            if self.GetPageText(page) == name:
277                return page
278       
279class GSGrid(wg.Grid):
280    def __init__(self, parent, name=''):
281        wg.Grid.__init__(self,parent,-1,name=name)                   
282        self.SetSize(parent.GetClientSize())
283           
284    def Clear(self):
285        wg.Grid.ClearGrid(self)
286       
287    def SetCellStyle(self,r,c,color="white",readonly=True):
288        self.SetCellBackgroundColour(r,c,color)
289        self.SetReadOnly(r,c,isReadOnly=readonly)
290       
291    def GetSelection(self):
292        #this is to satisfy structure drawing stuff in G2plt when focus changes
293        return None
294                       
295class Table(wg.PyGridTableBase):
296    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
297        wg.PyGridTableBase.__init__(self)
298        self.colLabels = colLabels
299        self.rowLabels = rowLabels
300        self.dataTypes = types
301        self.data = data
302       
303    def AppendRows(self, numRows=1):
304        self.data.append([])
305        return True
306       
307    def CanGetValueAs(self, row, col, typeName):
308        if self.dataTypes:
309            colType = self.dataTypes[col].split(':')[0]
310            if typeName == colType:
311                return True
312            else:
313                return False
314        else:
315            return False
316
317    def CanSetValueAs(self, row, col, typeName):
318        return self.CanGetValueAs(row, col, typeName)
319
320    def DeleteRow(self,pos):
321        data = self.GetData()
322        self.SetData([])
323        new = []
324        for irow,row in enumerate(data):
325            if irow <> pos:
326                new.append(row)
327        self.SetData(new)
328       
329    def GetColLabelValue(self, col):
330        if self.colLabels:
331            return self.colLabels[col]
332           
333    def GetData(self):
334        data = []
335        for row in range(self.GetNumberRows()):
336            data.append(self.GetRowValues(row))
337        return data
338       
339    def GetNumberCols(self):
340        try:
341            return len(self.colLabels)
342        except TypeError:
343            return None
344       
345    def GetNumberRows(self):
346        return len(self.data)
347       
348    def GetRowLabelValue(self, row):
349        if self.rowLabels:
350            return self.rowLabels[row]
351       
352    def GetRowValues(self, row):
353        data = []
354        for col in range(self.GetNumberCols()):
355            data.append(self.GetValue(row, col))
356        return data
357       
358    def GetTypeName(self, row, col):
359        try:
360            return self.dataTypes[col]
361        except TypeError:
362            return None
363
364    def GetValue(self, row, col):
365        try:
366            return self.data[row][col]
367        except IndexError:
368            return None
369           
370    def InsertRows(self, pos, rows):
371        for row in range(rows):
372            self.data.insert(pos,[])
373            pos += 1
374       
375    def IsEmptyCell(self,row,col):
376        try:
377            return not self.data[row][col]
378        except IndexError:
379            return True
380       
381    def OnKeyPress(self, event):
382        dellist = self.GetSelectedRows()
383        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
384            grid = self.GetView()
385            for i in dellist: grid.DeleteRow(i)
386               
387    def SetColLabelValue(self, col, label):
388        numcols = self.GetNumberCols()
389        if col > numcols-1:
390            self.colLabels.append(label)
391        else:
392            self.colLabels[col]=label
393       
394    def SetData(self,data):
395        for row in range(len(data)):
396            self.SetRowValues(row,data[row])
397               
398    def SetRowLabelValue(self, row, label):
399        self.rowLabels[row]=label
400           
401    def SetRowValues(self,row,data):
402        self.data[row] = data
403           
404    def SetValue(self, row, col, value):
405        def innerSetValue(row, col, value):
406            try:
407                self.data[row][col] = value
408            except TypeError:
409                return
410            except IndexError:
411                print row,col,value
412                # add a new row
413                if row > self.GetNumberRows():
414                    self.data.append([''] * self.GetNumberCols())
415                elif col > self.GetNumberCols():
416                    for row in range(self.GetNumberRows):
417                        self.data[row].append('')
418                print self.data
419                self.data[row][col] = value
420        innerSetValue(row, col, value)
421       
422def UpdateNotebook(self,data):       
423    if data:
424        self.dataFrame.SetLabel('Notebook')
425        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
426            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
427        for line in data:
428            self.dataDisplay.AppendText(line+"\n")
429            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
430           
431def UpdateControls(self,data):
432    '''
433    #Fourier controls
434    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
435    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
436    #distance/angle controls
437    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
438    '''
439       
440    def SetStatusLine(text):
441        Status.SetStatusText(text)
442                                     
443    def OnNumCycles(event):
444        try:
445            value = max(0,min(200,int(Ncyc.GetValue())))
446        except ValueError:
447            value = 3
448        data['Ncycles'] = value
449        Ncyc.SetValue('%d'%(value))
450       
451    def OnConvergence(event):
452        try:
453            value = max(0.01,min(100.,float(Cnvrg.GetValue())))
454        except ValueError:
455            value = 0.01
456        data['minSumShftESD'] = value
457        Cnvrg.SetValue('%.2f'%(value))
458       
459    def OnAtomShift(event):
460        try:
461            value = max(0.1,min(5.,float(AtShft.GetValue())))
462        except ValueError:
463            value = 2.0
464        data['maxShift'] = value
465        AtShft.SetValue('%.1f'%(value))
466       
467    def OnMarquardt(event):
468        try:
469            value = max(1.0,min(10.0,float(Marq.GetValue())))
470        except ValueError:
471            value = 1.0
472        data['Marquardt'] = value
473        Marq.SetValue('%.2f'%(value))
474       
475    def OnBandWidth(event):
476        try:
477            value = max(0,min(200,int(Band.GetValue())))
478        except ValueError:
479            value = 0
480        data['bandWidth'] = value
481        Band.SetValue('%d'%(value))
482       
483    def OnRestraint(event):
484        data['restraintWeight'] = Restraint.GetValue()
485
486    if self.dataDisplay:
487        self.dataDisplay.Destroy()
488    if not self.dataFrame.GetStatusBar():
489        Status = self.dataFrame.CreateStatusBar()
490    SetStatusLine('')
491    self.dataFrame.SetLabel('Controls')
492    self.dataDisplay = wx.Panel(self.dataFrame)
493    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
494    mainSizer = wx.BoxSizer(wx.VERTICAL)
495    mainSizer.Add((5,5),0)
496    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
497    LSSizer = wx.FlexGridSizer(cols=4,vgap=5,hgap=5)
498    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Max cycles: '),0,wx.ALIGN_CENTER_VERTICAL)
499    Ncyc = wx.TextCtrl(self.dataDisplay,-1,value='%d'%(data['Ncycles']),style=wx.TE_PROCESS_ENTER)
500    Ncyc.Bind(wx.EVT_TEXT_ENTER,OnNumCycles)
501    Ncyc.Bind(wx.EVT_KILL_FOCUS,OnNumCycles)
502    LSSizer.Add(Ncyc,0,wx.ALIGN_CENTER_VERTICAL)
503    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min sum(shift/esd)^2: '),0,wx.ALIGN_CENTER_VERTICAL)
504    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2f'%(data['minSumShftESD']),style=wx.TE_PROCESS_ENTER)
505    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
506    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
507    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
508    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Max atom shift: '),0,wx.ALIGN_CENTER_VERTICAL)
509    AtShft = wx.TextCtrl(self.dataDisplay,-1,value='%.1f'%(data['maxShift']),style=wx.TE_PROCESS_ENTER)
510    AtShft.Bind(wx.EVT_TEXT_ENTER,OnAtomShift)
511    AtShft.Bind(wx.EVT_KILL_FOCUS,OnAtomShift)
512    LSSizer.Add(AtShft,0,wx.ALIGN_CENTER_VERTICAL)
513    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Marquardt factor: '),0,wx.ALIGN_CENTER_VERTICAL)
514    Marq = wx.TextCtrl(self.dataDisplay,-1,value='%.2f'%(data['Marquardt']),style=wx.TE_PROCESS_ENTER)
515    Marq.Bind(wx.EVT_TEXT_ENTER,OnMarquardt)
516    Marq.Bind(wx.EVT_KILL_FOCUS,OnMarquardt)
517    LSSizer.Add(Marq,0,wx.ALIGN_CENTER_VERTICAL)
518    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Matrix band width: '),0,wx.ALIGN_CENTER_VERTICAL)
519    Band = wx.TextCtrl(self.dataDisplay,-1,value='%d'%(data['bandWidth']),style=wx.TE_PROCESS_ENTER)
520    Band.Bind(wx.EVT_TEXT_ENTER,OnBandWidth)
521    Band.Bind(wx.EVT_KILL_FOCUS,OnBandWidth)
522    LSSizer.Add(Band,0,wx.ALIGN_CENTER_VERTICAL)
523    Restraint = wx.CheckBox(self.dataDisplay,-1,label='Modify restraint weights?')
524    Restraint.Bind(wx.EVT_CHECKBOX, OnRestraint)
525    Restraint.SetValue(data['restraintWeight'])
526    LSSizer.Add(Restraint,0,wx.ALIGN_CENTER_VERTICAL)
527   
528   
529    mainSizer.Add(LSSizer)
530    mainSizer.Add((5,5),0)
531    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
532
533    mainSizer.Add((5,5),0)
534    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
535       
536    mainSizer.Layout()   
537    self.dataDisplay.SetSizer(mainSizer)
538    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
539    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
540     
541def UpdateComments(self,data):                   
542    self.dataFrame.SetLabel('Comments')
543    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
544        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
545    for line in data:
546        self.dataDisplay.AppendText(line+"\n")
547             
548def UpdateHKLControls(self,data):
549   
550    def OnScaleSlider(event):
551        scale = int(scaleSel.GetValue())/1000.
552        scaleSel.SetValue(int(scale*1000.))
553        data['Scale'] = scale*10.
554        G2plt.PlotSngl(self)
555       
556    def OnLayerSlider(event):
557        layer = layerSel.GetValue()
558        data['Layer'] = layer
559        G2plt.PlotSngl(self)
560       
561    def OnSelZone(event):
562        data['Zone'] = zoneSel.GetValue()
563        G2plt.PlotSngl(self,newPlot=True)
564       
565    def OnSelType(event):
566        data['Type'] = typeSel.GetValue()
567        G2plt.PlotSngl(self)
568       
569    def SetStatusLine():
570        Status.SetStatusText("look at me!!!")
571                                     
572    if self.dataDisplay:
573        self.dataDisplay.Destroy()
574    if not self.dataFrame.GetStatusBar():
575        Status = self.dataFrame.CreateStatusBar()
576    SetStatusLine()
577    zones = ['100','010','001']
578    HKLmax = data['HKLmax']
579    HKLmin = data['HKLmin']
580    if data['ifFc']:
581        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
582    else:
583        typeChoices = ['Fosq','Fo']
584    self.dataDisplay = wx.Panel(self.dataFrame)
585    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
586    mainSizer = wx.BoxSizer(wx.VERTICAL)
587    mainSizer.Add((5,10),0)
588   
589    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
590    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
591        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
592    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
593        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
594    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
595    scaleSel.SetLineSize(100)
596    scaleSel.SetPageSize(900)
597    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
598    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
599   
600    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
601    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
602        wx.ALIGN_CENTER_VERTICAL)
603    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
604        style=wx.CB_READONLY|wx.CB_DROPDOWN)
605    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
606    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
607    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
608        wx.ALIGN_CENTER_VERTICAL)       
609    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
610        style=wx.CB_READONLY|wx.CB_DROPDOWN)
611    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
612    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
613    zoneSizer.Add((10,0),0)   
614    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
615       
616    izone = zones.index(data['Zone'])
617    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
618    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
619        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
620    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
621        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
622    layerSel.SetLineSize(1)
623    layerSel.SetLineSize(5)
624    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
625    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
626    layerSizer.Add((10,0),0)   
627    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
628
629       
630    mainSizer.Layout()   
631    self.dataDisplay.SetSizer(mainSizer)
632    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
633    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
634       
635                         
636def GetPatternTreeItemId(self, parentId, itemText):
637    item, cookie = self.PatternTree.GetFirstChild(parentId)
638    while item:
639        if self.PatternTree.GetItemText(item) == itemText:
640            return item
641        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
642    return 0               
643
644def MovePatternTreeToGrid(self,item):
645   
646    oldPage = 0
647    if self.dataFrame:
648        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
649        if self.dataFrame.GetLabel() == 'Comments':
650            data = [self.dataDisplay.GetValue()]
651            self.dataDisplay.Clear() 
652            Id = GetPatternTreeItemId(self,self.root, 'Comments')
653            if Id: self.PatternTree.SetItemPyData(Id,data)
654        if self.dataFrame.GetLabel() == 'Notebook':
655            data = [self.dataDisplay.GetValue()]
656            self.dataDisplay.Clear() 
657            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
658            if Id: self.PatternTree.SetItemPyData(Id,data)
659        if 'Phase Data for' in self.dataFrame.GetLabel():
660            if self.dataDisplay: 
661                oldPage = self.dataDisplay.GetSelection()
662        self.dataFrame.Clear()
663        self.dataFrame.SetLabel('')
664    else:
665       self.dataFrame = DataFrame(parent=self.mainPanel)
666
667    self.dataFrame.Raise()           
668    self.PickId = 0
669    parentID = self.root
670    self.ExportPattern.Enable(False)
671    if item != self.root:
672        parentID = self.PatternTree.GetItemParent(item)
673    if self.PatternTree.GetItemParent(item) == self.root:
674        self.PatternId = item
675        self.PickId = item
676        if self.PatternTree.GetItemText(item) == 'Notebook':
677            self.PatternId = 0
678            self.ExportPattern.Enable(False)
679            data = self.PatternTree.GetItemPyData(item)
680            UpdateNotebook(self,data)
681        elif self.PatternTree.GetItemText(item) == 'Controls':
682            self.PatternId = 0
683            self.ExportPattern.Enable(False)
684            data = self.PatternTree.GetItemPyData(item)
685            if data == [0] or data == {}:           #fill in defaults
686                data = {
687                    #least squares controls
688                    'Ncycles':3,'maxShift':2.0,'bandWidth':0,'Marquardt':1.0,'restraintWeight':False,
689                    'minSumShftESD':0.01,
690                    #Fourier controls
691                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
692                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
693                    #distance/angle controls
694                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
695                self.PatternTree.SetItemPyData(item,data)                             
696            self.Refine.Enable(True)
697            UpdateControls(self,data)
698        elif 'IMG' in self.PatternTree.GetItemText(item):
699            self.Image = item
700            G2plt.PlotImage(self,newPlot=True)
701        elif 'PKS' in self.PatternTree.GetItemText(item):
702            G2plt.PlotPowderLines(self)
703        elif 'PWDR' in self.PatternTree.GetItemText(item):           
704            self.ExportPattern.Enable(True)
705            G2plt.PlotPatterns(self,newPlot=True)
706        elif 'HKLF' in self.PatternTree.GetItemText(item):
707            self.Sngl = item
708            G2plt.PlotSngl(self,newPlot=True)
709           
710    elif self.PatternTree.GetItemText(parentID) == 'Phases':
711        self.PickId = item
712        data = self.PatternTree.GetItemPyData(item)           
713        G2phG.UpdatePhaseData(self,item,data,oldPage)
714    elif self.PatternTree.GetItemText(item) == 'Comments':
715        self.PatternId = self.PatternTree.GetItemParent(item)
716        self.PickId = item
717        data = self.PatternTree.GetItemPyData(item)
718        UpdateComments(self,data)
719    elif self.PatternTree.GetItemText(item) == 'Image Controls':
720        self.dataFrame.SetTitle('Image Controls')
721        self.PickId = item
722        self.Image = self.PatternTree.GetItemParent(item)
723        masks = self.PatternTree.GetItemPyData(
724            GetPatternTreeItemId(self,self.Image, 'Masks'))
725        data = self.PatternTree.GetItemPyData(item)
726        G2imG.UpdateImageControls(self,data,masks)
727        G2plt.PlotImage(self)
728    elif self.PatternTree.GetItemText(item) == 'Masks':
729        self.dataFrame.SetTitle('Masks')
730        self.PickId = item
731        self.Image = self.PatternTree.GetItemParent(item)
732        data = self.PatternTree.GetItemPyData(item)
733        G2imG.UpdateMasks(self,data)
734        G2plt.PlotImage(self)
735    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
736        self.PickId = item
737        self.Sngl = self.PatternTree.GetItemParent(item)
738        data = self.PatternTree.GetItemPyData(item)
739        UpdateHKLControls(self,data)
740        G2plt.PlotSngl(self)               
741    elif self.PatternTree.GetItemText(item) == 'Peak List':
742        self.PatternId = self.PatternTree.GetItemParent(item)
743        self.ExportPeakList.Enable(True)
744        self.PickId = item
745        data = self.PatternTree.GetItemPyData(item)
746        G2pdG.UpdatePeakGrid(self,data)
747        G2plt.PlotPatterns(self)
748    elif self.PatternTree.GetItemText(item) == 'Background':
749        self.PatternId = self.PatternTree.GetItemParent(item)
750        self.PickId = item
751        data = self.PatternTree.GetItemPyData(item)
752        G2pdG.UpdateBackgroundGrid(self,data)
753        G2plt.PlotPatterns(self)
754    elif self.PatternTree.GetItemText(item) == 'Limits':
755        self.PatternId = self.PatternTree.GetItemParent(item)
756        self.PickId = item
757        data = self.PatternTree.GetItemPyData(item)
758        G2pdG.UpdateLimitsGrid(self,data)
759        G2plt.PlotPatterns(self)
760    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
761        self.PatternId = self.PatternTree.GetItemParent(item)
762        self.PickId = item
763        data = self.PatternTree.GetItemPyData(item)
764        G2pdG.UpdateInstrumentGrid(self,data)
765        G2plt.PlotPeakWidths(self)
766    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
767        self.PatternId = self.PatternTree.GetItemParent(item)
768        self.PickId = item
769        data = self.PatternTree.GetItemPyData(item)
770
771        if 'Temperature' not in data:           #temp fix for old gpx files
772            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
773                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0}
774            self.PatternTree.SetItemPyData(item,data)
775   
776        G2pdG.UpdateSampleGrid(self,data)
777        G2plt.PlotPatterns(self)
778    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
779        self.PatternId = self.PatternTree.GetItemParent(item)
780        self.ExportPeakList.Enable(True)
781        self.PickId = item
782        data = self.PatternTree.GetItemPyData(item)
783        G2pdG.UpdateIndexPeaksGrid(self,data)
784        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
785            G2plt.PlotPowderLines(self)
786        else:
787            G2plt.PlotPatterns(self)
788    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
789        self.PatternId = self.PatternTree.GetItemParent(item)
790        self.PickId = item
791        data = self.PatternTree.GetItemPyData(item)
792        if not data:
793            data.append([0,0.1,4,25.0,0,'P1',1,1,1,90,90,90]) #zero error flag, max zero error, max Nc/No, start volume
794            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
795            data.append([])                                 #empty cell list
796            data.append([])                                 #empty dmin
797            self.PatternTree.SetItemPyData(item,data)                             
798        G2pdG.UpdateUnitCellsGrid(self,data)
799        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
800            G2plt.PlotPowderLines(self)
801        else:
802            G2plt.PlotPatterns(self)
Note: See TracBrowser for help on using the repository browser.