source: trunk/GSASIIgrid.py @ 384

Last change on this file since 384 was 384, checked in by vondreele, 12 years ago

add constraint & restraint items to tree - now empty
fix noncentro calcs & special position position refinements

  • Property svn:keywords set to Date Author Revision URL Id
File size: 42.2 KB
Line 
1#GSASII - data display routines
2########### SVN repository information ###################
3# $Date: 2011-10-07 18:12:38 +0000 (Fri, 07 Oct 2011) $
4# $Author: vondreele $
5# $Revision: 384 $
6# $URL: trunk/GSASIIgrid.py $
7# $Id: GSASIIgrid.py 384 2011-10-07 18:12:38Z vondreele $
8########### SVN repository information ###################
9import wx
10import wx.grid as wg
11import time
12import cPickle
13import GSASIIpath
14import GSASIIplot as G2plt
15import GSASIIpwdGUI as G2pdG
16import GSASIIimgGUI as G2imG
17import GSASIIphsGUI as G2phG
18
19[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE, 
20    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
21    wxID_RELOADDRAWATOMS,
22] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
23
24[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
25] = [wx.NewId() for _init_coll_Data_Items in range(3)]
26
27[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR, 
28    wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM, wxID_DRAWDELETE, wxID_DRAWFILLCELL, 
29    wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
30] = [wx.NewId() for _init_coll_DrawAtom_Items in range(10)]
31
32[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, 
33    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL, wxID_IMSAVECONTROLS, wxID_IMLOADCONTROLS,
34] = [wx.NewId() for _init_coll_IMAGE_Items in range(7)]
35
36[ wxID_MASKCOPY, wxID_MASKSAVE, wxID_MASKLOAD,
37] = [wx.NewId() for _init_coll_MASK_Items in range(3)]
38
39[ wxID_PAWLEYLOAD, wxID_PAWLEYIMPORT, wxID_PAWLEYDELETE, wxID_PAWLEYESTIMATE,
40] = [wx.NewId() for _init_coll_PAWLEY_Items in range(4)]
41
42[ wxID_INSTPRMRESET,wxID_CHANGEWAVETYPE,
43] = [wx.NewId() for _init_coll_INST_Items in range(2)]
44
45[ wxID_INDXRELOAD,
46] = [wx.NewId() for _init_coll_IndPeaks_Items in range(1)]
47
48[ wxID_UNDO,wxID_LSQPEAKFIT,wxID_LSQONECYCLE,wxID_RESETSIGGAM,wxID_CLEARPEAKS,
49] = [wx.NewId() for _init_coll_PEAK_Items in range(5)]
50
51[  wxID_INDEXPEAKS, wxID_REFINECELL, wxID_COPYCELL, wxID_MAKENEWPHASE,
52] = [wx.NewId() for _init_coll_INDEX_Items in range(4)]
53
54[ wxID_CONSTRAINTADD,
55] = [wx.NewId() for _init_coll_Constraint_Items in range(1)]
56
57[ wxID_RESTRAINTADD,
58] = [wx.NewId() for _init_coll_Restraint_Items in range(1)]
59
60[ wxID_SELECTPHASE,
61] = [wx.NewId() for _init_coll_Refl_Items in range(1)]
62
63[ wxID_CLEARTEXTURE,
64] = [wx.NewId() for _init_coll_Texture_Items in range(1)]
65
66[ wxID_PDFCOPYCONTROLS, wxID_PDFSAVECONTROLS, wxID_PDFLOADCONTROLS, 
67    wxID_PDFCOMPUTE, wxID_PDFCOMPUTEALL, wxID_PDFADDELEMENT, wxID_PDFDELELEMENT,
68] = [wx.NewId() for _init_coll_PDF_Items in range(7)]
69
70VERY_LIGHT_GREY = wx.Colour(235,235,235)
71
72class DataFrame(wx.Frame):
73    def _init_coll_BlankMenu(self,parent):
74        parent.Append(menu=self.Blank,title='')
75       
76    def _init_coll_AtomsMenu(self,parent):
77        parent.Append(menu=self.AtomEdit, title='Edit')
78       
79    def _init_coll_ConstraintMenu(self,parent):
80        parent.Append(menu=self.ConstraintEdit, title='Edit')
81       
82    def _init_coll_RestraintMenu(self,parent):
83        parent.Append(menu=self.RestraintEdit, title='Edit')
84       
85    def _init_coll_DataMenu(self,parent):
86        parent.Append(menu=self.DataEdit, title='Edit')
87       
88    def _init_coll_DrawAtomsMenu(self,parent):
89        parent.Append(menu=self.DrawAtomEdit, title='Edit')
90
91    def _init_coll_PawleyMenu(self,parent):
92        parent.Append(menu=self.PawleyEdit,title='Pawley Reflections Operations')
93     
94    def _init_coll_IndPeaksMenu(self,parent):
95        parent.Append(menu=self.IndPeaksEdit,title='Index Peaks Operations')
96                   
97    def _init_coll_ImageMenu(self,parent):
98        parent.Append(menu=self.ImageEdit, title='Image Operations')
99       
100    def _init_coll_InstMenu(self,parent):
101        parent.Append(menu=self.InstEdit, title='Inst. Parm. Operations')
102       
103    def _init_coll_MaskMenu(self,parent):
104        parent.Append(menu=self.MaskEdit, title='Mask Operations')
105       
106    def _init_coll_PeakMenu(self,parent):
107        parent.Append(menu=self.PeakEdit, title='Peak Fitting')
108
109    def _init_coll_IndexMenu(self,parent):
110        parent.Append(menu=self.IndexEdit, title='Cell Index/Refine')
111       
112    def _init_coll_ReflMenu(self,parent):
113        parent.Append(menu=self.ReflEdit, title='Reflection List')
114
115    def _init_coll_TextureMenu(self,parent):
116        parent.Append(menu=self.TextureEdit, title='Texture')
117
118    def _init_coll_PDFMenu(self,parent):
119        parent.Append(menu=self.PDFEdit, title='PDF Controls')
120
121    def _init_coll_Atom_Items(self,parent):
122        parent.Append(id=wxID_ATOMSEDITADD, kind=wx.ITEM_NORMAL,text='Append atom',
123            help='Inserted as an H atom')
124        parent.Append(id=wxID_ATOMSTESTADD, kind=wx.ITEM_NORMAL,text='Append test point',
125            help='Inserted as an H atom')
126        parent.Append(id=wxID_ATOMSEDITINSERT, kind=wx.ITEM_NORMAL,text='Insert atom',
127            help='Select atom row to insert before; inserted as an H atom')
128        parent.Append(id=wxID_ATONTESTINSERT, kind=wx.ITEM_NORMAL,text='Insert test point',
129            help='Select atom row to insert before; inserted as an H atom')
130        parent.Append(id=wxID_ATOMSEDITDELETE, kind=wx.ITEM_NORMAL,text='Delete atom',
131            help='Select atoms to delete first')
132        parent.Append(id=wxID_ATOMSREFINE, kind=wx.ITEM_NORMAL,text='Set atom refinement flags',
133            help='Select atoms to refine first')
134        parent.Append(id=wxID_ATOMSMODIFY, kind=wx.ITEM_NORMAL,text='Modify atom parameters',
135            help='Select atoms to modify first')
136        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
137            help='Select atoms to transform first')
138        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
139            help='Reload atom drawing list')
140           
141    def _init_coll_Constraint_Items(self,parent):
142        parent.Append(id=wxID_CONSTRAINTADD, kind=wx.ITEM_NORMAL,text='Add constraint',
143            help='constraint dummy menu item')
144       
145    def _init_coll_Restraint_Items(self,parent):
146        parent.Append(id=wxID_RESTRAINTADD, kind=wx.ITEM_NORMAL,text='Add restraint',
147            help='restraint dummy menu item')
148                   
149    def _init_coll_Data_Items(self,parent):
150        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
151            help='Select new powder histograms to be used for this phase')
152        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
153            help='Select new single crystal histograms to be used for this phase')
154        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
155            help='Delete histograms from use for this phase')
156
157    def _init_coll_Texture_Items(self,parent):
158        self.ClearPeaks = parent.Append(id=wxID_CLEARTEXTURE, kind=wx.ITEM_NORMAL,text='Clear texture', 
159            help='Clear the texture coefficients' )
160           
161    def _init_coll_DrawAtom_Items(self,parent):
162        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
163            help='Select atoms first')
164        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
165            help='Select atoms first')
166        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
167            help='Select atoms first')
168        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
169            help='Resets all atom colors to defaults')
170        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
171            help='View point is 1st atom selected')
172        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
173            help='Add symmetry & cell equivalents to drawing set from selected atoms')
174        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
175            help='Transform selected atoms by symmetry & cell translations')
176        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
177            help='Fill coordination sphere for selected atoms')           
178        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
179            help='Fill unit cell with selected atoms')
180        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
181            help='Delete atoms from drawing set')
182
183    def _init_coll_Pawley_Items(self,parent):
184        parent.Append(id=wxID_PAWLEYLOAD, kind=wx.ITEM_NORMAL,text='Pawley create',
185            help='Initialize Pawley reflection list')
186#        parent.Append(id=wxID_PAWLEYIMPORT, kind=wx.ITEM_NORMAL,text='Pawley import',
187#            help='Import Pawley reflection list')
188        parent.Append(id=wxID_PAWLEYESTIMATE, kind=wx.ITEM_NORMAL,text='Pawley estimate',
189            help='Estimate initial Pawley intensities')
190        parent.Append(id=wxID_PAWLEYDELETE, kind=wx.ITEM_NORMAL,text='Pawley delete',
191            help='Delete Pawley reflection list')
192
193    def _init_coll_IndPeaks_Items(self,parent):
194        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD, 
195            kind=wx.ITEM_NORMAL,text='Load/Reload')
196           
197    def _init_coll_Refl_Items(self,parent):
198        self.SelectPhase = parent.Append(help='Select phase for reflection list',id=wxID_SELECTPHASE, 
199            kind=wx.ITEM_NORMAL,text='Select phase')
200           
201    def _init_coll_Image_Items(self,parent):
202        parent.Append(help='Calibrate detector by fitting to calibrant lines', 
203            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
204        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, 
205            kind=wx.ITEM_NORMAL,text='Clear calibration')
206        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE, 
207            kind=wx.ITEM_NORMAL,text='Integrate')
208        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
209            kind=wx.ITEM_NORMAL,text='Integrate all')
210        parent.Append(help='Copy image controls to other images', 
211            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
212        parent.Append(help='Save image controls to file', 
213            id=wxID_IMSAVECONTROLS, kind=wx.ITEM_NORMAL,text='Save Controls')
214        parent.Append(help='Load image controls from file', 
215            id=wxID_IMLOADCONTROLS, kind=wx.ITEM_NORMAL,text='Load Controls')
216
217                   
218    def _init_coll_Mask_Items(self,parent):
219        parent.Append(help='Copy mask to other images', 
220            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
221        parent.Append(help='Save mask to file', 
222            id=wxID_MASKSAVE, kind=wx.ITEM_NORMAL,text='Save mask')
223        parent.Append(help='Load mask from file', 
224            id=wxID_MASKLOAD, kind=wx.ITEM_NORMAL,text='Load mask')
225
226    def _init_coll_Inst_Items(self,parent):
227        parent.Append(help='Reset instrument profile parameters to default', 
228            id=wxID_INSTPRMRESET, kind=wx.ITEM_NORMAL,text='Reset profile')
229        parent.Append(help='Change radiation type (Ka12 - synch)', 
230            id=wxID_CHANGEWAVETYPE, kind=wx.ITEM_NORMAL,text='Change radiation')
231
232    def _init_coll_Peak_Items(self,parent):
233        self.UnDo = parent.Append(help='Undo last least squares refinement', 
234            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
235        self.PeakFit = parent.Append(id=wxID_LSQPEAKFIT, kind=wx.ITEM_NORMAL,text='LSQ PeakFit', 
236            help='Peak fitting via least-squares' )
237        self.PFOneCycle = parent.Append(id=wxID_LSQONECYCLE, kind=wx.ITEM_NORMAL,text='LSQ one cycle', 
238            help='One cycle of Peak fitting via least-squares' )
239        self.ResetSigGam = parent.Append(id=wxID_RESETSIGGAM, kind=wx.ITEM_NORMAL, 
240            text='Reset sig and gam',help='Reset sigma and gamma to global fit' )
241        self.ClearPeaks = parent.Append(id=wxID_CLEARPEAKS, kind=wx.ITEM_NORMAL,text='Clear peaks', 
242            help='Clear the peak list' )
243           
244    def _init_coll_Index_Items(self,parent):
245        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
246            text='Index Cell')
247        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', 
248            help='Copy selected unit cell from indexing to cell refinement fields')
249        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, 
250            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
251        self.MakeNewPhase = parent.Append( id=wxID_MAKENEWPHASE, kind=wx.ITEM_NORMAL,
252            text='Make new phase',help='Make new phase from selected unit cell')
253           
254    def _init_coll_PDF_Items(self,parent):
255        parent.Append(help='Add element to sample composition',id=wxID_PDFADDELEMENT, kind=wx.ITEM_NORMAL,
256            text='Add element')
257        parent.Append(help='Delete element from sample composition',id=wxID_PDFDELELEMENT, kind=wx.ITEM_NORMAL,
258            text='Delete element')
259        parent.Append(help='Copy PDF controls', id=wxID_PDFCOPYCONTROLS, kind=wx.ITEM_NORMAL,
260            text='Copy controls')
261#        parent.Append(help='Load PDF controls from file',id=wxID_PDFLOADCONTROLS, kind=wx.ITEM_NORMAL,
262#            text='Load Controls')
263#        parent.Append(help='Save PDF controls to file', id=wxID_PDFSAVECONTROLS, kind=wx.ITEM_NORMAL,
264#            text='Save controls')
265        self.PDFCompute = parent.Append(help='Compute PDF', id=wxID_PDFCOMPUTE, kind=wx.ITEM_NORMAL,
266            text='Compute PDF')
267        self.PDFCompute = parent.Append(help='Compute all PDFs', id=wxID_PDFCOMPUTEALL, kind=wx.ITEM_NORMAL,
268            text='Compute all PDFs')
269       
270
271    def _init_utils(self):
272        self.BlankMenu = wx.MenuBar()
273       
274        self.AtomsMenu = wx.MenuBar()
275        self.ConstraintMenu = wx.MenuBar()
276        self.RestraintMenu = wx.MenuBar()
277        self.DataMenu = wx.MenuBar()
278        self.TextureMenu = wx.MenuBar()
279        self.DrawAtomsMenu = wx.MenuBar()
280        self.PawleyMenu = wx.MenuBar()
281        self.ImageMenu = wx.MenuBar()
282        self.MaskMenu = wx.MenuBar()
283        self.InstMenu = wx.MenuBar()
284        self.PeakMenu = wx.MenuBar()
285        self.IndPeaksMenu = wx.MenuBar()
286        self.IndexMenu = wx.MenuBar()
287        self.ReflMenu = wx.MenuBar()
288        self.PDFMenu = wx.MenuBar()
289        self.AtomEdit = wx.Menu(title='')
290        self.ConstraintEdit = wx.Menu(title='')
291        self.RestraintEdit = wx.Menu(title='')
292        self.DataEdit = wx.Menu(title='')
293        self.TextureEdit = wx.Menu(title='')
294        self.DrawAtomEdit = wx.Menu(title='')
295        self.PawleyEdit = wx.Menu(title='')
296        self.ImageEdit = wx.Menu(title='')
297        self.MaskEdit = wx.Menu(title='')
298        self.InstEdit = wx.Menu(title='')
299        self.PeakEdit = wx.Menu(title='')
300        self.IndPeaksEdit = wx.Menu(title='')
301        self.IndexEdit = wx.Menu(title='')
302        self.ReflEdit = wx.Menu(title='')
303        self.PDFEdit = wx.Menu(title='')
304        self._init_coll_AtomsMenu(self.AtomsMenu)
305        self._init_coll_Atom_Items(self.AtomEdit)
306        self._init_coll_ConstraintMenu(self.ConstraintMenu)
307        self._init_coll_Constraint_Items(self.ConstraintEdit)
308        self._init_coll_RestraintMenu(self.RestraintMenu)
309        self._init_coll_Restraint_Items(self.RestraintEdit)
310        self._init_coll_DataMenu(self.DataMenu)
311        self._init_coll_Data_Items(self.DataEdit)
312        self._init_coll_TextureMenu(self.TextureMenu)
313        self._init_coll_Texture_Items(self.TextureEdit)
314        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
315        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
316        self._init_coll_PawleyMenu(self.PawleyMenu)
317        self._init_coll_Pawley_Items(self.PawleyEdit)
318        self._init_coll_ImageMenu(self.ImageMenu)
319        self._init_coll_Image_Items(self.ImageEdit)
320        self._init_coll_MaskMenu(self.MaskMenu)
321        self._init_coll_Mask_Items(self.MaskEdit)
322        self._init_coll_InstMenu(self.InstMenu)
323        self._init_coll_Inst_Items(self.InstEdit)
324        self._init_coll_PeakMenu(self.PeakMenu)
325        self._init_coll_Peak_Items(self.PeakEdit)
326        self._init_coll_IndPeaksMenu(self.IndPeaksMenu)
327        self._init_coll_IndPeaks_Items(self.IndPeaksEdit)
328        self._init_coll_IndexMenu(self.IndexMenu)
329        self._init_coll_Index_Items(self.IndexEdit)
330        self._init_coll_ReflMenu(self.ReflMenu)
331        self._init_coll_Refl_Items(self.ReflEdit)
332        self._init_coll_PDFMenu(self.PDFMenu)
333        self._init_coll_PDF_Items(self.PDFEdit)
334        self.UnDo.Enable(False)
335        self.PeakFit.Enable(False)
336        self.PFOneCycle.Enable(False)
337        self.IndexPeaks.Enable(False)
338        self.CopyCell.Enable(False)
339        self.RefineCell.Enable(False)
340        self.MakeNewPhase.Enable(False)
341       
342    def _init_ctrls(self, parent,name=None,size=None,pos=None):
343        wx.Frame.__init__(self,parent=parent,style=wx.DEFAULT_FRAME_STYLE ^ wx.CLOSE_BOX,
344            size=size,pos=pos,title='GSAS-II data display')
345        self._init_utils()
346        if name:
347            self.SetLabel(name)
348        self.Show()
349       
350    def __init__(self,parent,data=None,name=None, size=None,pos=None):
351        self._init_ctrls(parent,name,size,pos)
352        self.data = data
353        clientSize = wx.ClientDisplayRect()
354        Size = self.GetSize()
355        xPos = clientSize[2]-Size[0]
356        self.SetPosition(wx.Point(xPos,clientSize[1]+250))
357        self.dirname = ''
358        self.AtomGrid = []
359        self.selectedRow = 0
360       
361    def setSizePosLeft(self,Width):
362        clientSize = wx.ClientDisplayRect()
363        Width[1] = min(Width[1],clientSize[2]-300)
364        Width[0] = max(Width[0],300)
365        self.SetSize(Width)
366        self.SetPosition(wx.Point(clientSize[2]-Width[0],clientSize[1]+250))
367       
368    def Clear(self):
369        self.ClearBackground()
370        self.DestroyChildren()
371                   
372class GSNoteBook(wx.Notebook):
373    def __init__(self, parent, name='',size = None):
374        wx.Notebook.__init__(self, parent, -1, name=name, style= wx.BK_TOP)
375        if size: self.SetSize(size)
376                                                     
377    def Clear(self):       
378        GSNoteBook.DeleteAllPages(self)
379       
380    def FindPage(self,name):
381        numPage = self.GetPageCount()
382        for page in range(numPage):
383            if self.GetPageText(page) == name:
384                return page
385       
386class GSGrid(wg.Grid):
387    def __init__(self, parent, name=''):
388        wg.Grid.__init__(self,parent,-1,name=name)                   
389        self.SetSize(parent.GetClientSize())
390           
391    def Clear(self):
392        wg.Grid.ClearGrid(self)
393       
394    def SetCellStyle(self,r,c,color="white",readonly=True):
395        self.SetCellBackgroundColour(r,c,color)
396        self.SetReadOnly(r,c,isReadOnly=readonly)
397       
398    def GetSelection(self):
399        #this is to satisfy structure drawing stuff in G2plt when focus changes
400        return None
401                       
402class Table(wg.PyGridTableBase):
403    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
404        wg.PyGridTableBase.__init__(self)
405        self.colLabels = colLabels
406        self.rowLabels = rowLabels
407        self.dataTypes = types
408        self.data = data
409       
410    def AppendRows(self, numRows=1):
411        self.data.append([])
412        return True
413       
414    def CanGetValueAs(self, row, col, typeName):
415        if self.dataTypes:
416            colType = self.dataTypes[col].split(':')[0]
417            if typeName == colType:
418                return True
419            else:
420                return False
421        else:
422            return False
423
424    def CanSetValueAs(self, row, col, typeName):
425        return self.CanGetValueAs(row, col, typeName)
426
427    def DeleteRow(self,pos):
428        data = self.GetData()
429        self.SetData([])
430        new = []
431        for irow,row in enumerate(data):
432            if irow <> pos:
433                new.append(row)
434        self.SetData(new)
435       
436    def GetColLabelValue(self, col):
437        if self.colLabels:
438            return self.colLabels[col]
439           
440    def GetData(self):
441        data = []
442        for row in range(self.GetNumberRows()):
443            data.append(self.GetRowValues(row))
444        return data
445       
446    def GetNumberCols(self):
447        try:
448            return len(self.colLabels)
449        except TypeError:
450            return None
451       
452    def GetNumberRows(self):
453        return len(self.data)
454       
455    def GetRowLabelValue(self, row):
456        if self.rowLabels:
457            return self.rowLabels[row]
458       
459    def GetRowValues(self, row):
460        data = []
461        for col in range(self.GetNumberCols()):
462            data.append(self.GetValue(row, col))
463        return data
464       
465    def GetTypeName(self, row, col):
466        try:
467            return self.dataTypes[col]
468        except TypeError:
469            return None
470
471    def GetValue(self, row, col):
472        try:
473            return self.data[row][col]
474        except IndexError:
475            return None
476           
477    def InsertRows(self, pos, rows):
478        for row in range(rows):
479            self.data.insert(pos,[])
480            pos += 1
481       
482    def IsEmptyCell(self,row,col):
483        try:
484            return not self.data[row][col]
485        except IndexError:
486            return True
487       
488    def OnKeyPress(self, event):
489        dellist = self.GetSelectedRows()
490        if event.GetKeyCode() == wx.WXK_DELETE and dellist:
491            grid = self.GetView()
492            for i in dellist: grid.DeleteRow(i)
493               
494    def SetColLabelValue(self, col, label):
495        numcols = self.GetNumberCols()
496        if col > numcols-1:
497            self.colLabels.append(label)
498        else:
499            self.colLabels[col]=label
500       
501    def SetData(self,data):
502        for row in range(len(data)):
503            self.SetRowValues(row,data[row])
504               
505    def SetRowLabelValue(self, row, label):
506        self.rowLabels[row]=label
507           
508    def SetRowValues(self,row,data):
509        self.data[row] = data
510           
511    def SetValue(self, row, col, value):
512        def innerSetValue(row, col, value):
513            try:
514                self.data[row][col] = value
515            except TypeError:
516                return
517            except IndexError:
518                print row,col,value
519                # add a new row
520                if row > self.GetNumberRows():
521                    self.data.append([''] * self.GetNumberCols())
522                elif col > self.GetNumberCols():
523                    for row in range(self.GetNumberRows):
524                        self.data[row].append('')
525                print self.data
526                self.data[row][col] = value
527        innerSetValue(row, col, value)
528               
529def UpdateNotebook(self,data):       
530    if data:
531        self.dataFrame.SetLabel('Notebook')
532        self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
533            style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
534        for line in data:
535            self.dataDisplay.AppendText(line+"\n")
536            self.dataDisplay.AppendText('Notebook entry @ '+time.ctime()+"\n")
537           
538def UpdateControls(self,data):
539    #patch
540    if 'deriv type' not in data:
541        data = {}
542        data['deriv type'] = 'analytical'
543        data['min dM/M'] = 0.0001
544        data['shift factor'] = 1.
545    if 'shift factor' not in data:
546        data['shift factor'] = 1.       
547    #end patch
548    '''
549    #Fourier controls
550    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
551    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
552    #distance/angle controls
553    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
554    '''
555       
556    def SetStatusLine(text):
557        Status.SetStatusText(text)                                     
558       
559    def OnConvergence(event):
560        try:
561            value = max(1.e-9,min(1.0,float(Cnvrg.GetValue())))
562        except ValueError:
563            value = 0.0001
564        data['min dM/M'] = value
565        Cnvrg.SetValue('%.2g'%(value))
566       
567    def OnDerivType(event):
568        data['deriv type'] = derivSel.GetValue()
569        derivSel.SetValue(data['deriv type'])
570       
571    def OnFactor(event):
572        try:
573            value = min(max(float(Factr.GetValue()),0.00001),100.)
574        except ValueError:
575            value = 1.0
576        data['shift factor'] = value
577        Factr.SetValue('%.5f'%(value))
578       
579    if self.dataDisplay:
580        self.dataDisplay.Destroy()
581    if not self.dataFrame.GetStatusBar():
582        Status = self.dataFrame.CreateStatusBar()
583    SetStatusLine('')
584    self.dataFrame.SetLabel('Controls')
585    self.dataDisplay = wx.Panel(self.dataFrame)
586    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
587    mainSizer = wx.BoxSizer(wx.VERTICAL)
588    mainSizer.Add((5,5),0)
589    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
590    LSSizer = wx.FlexGridSizer(cols=6,vgap=5,hgap=5)
591    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement derivatives: '),0,wx.ALIGN_CENTER_VERTICAL)
592    Choice=['analytic','numeric']
593    derivSel = wx.ComboBox(parent=self.dataDisplay,value=data['deriv type'],choices=Choice,
594        style=wx.CB_READONLY|wx.CB_DROPDOWN)
595    derivSel.SetValue(data['deriv type'])
596    derivSel.Bind(wx.EVT_COMBOBOX, OnDerivType)   
597    LSSizer.Add(derivSel,0,wx.ALIGN_CENTER_VERTICAL)
598    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Min delta-M/M: '),0,wx.ALIGN_CENTER_VERTICAL)
599    Cnvrg = wx.TextCtrl(self.dataDisplay,-1,value='%.2g'%(data['min dM/M']),style=wx.TE_PROCESS_ENTER)
600    Cnvrg.Bind(wx.EVT_TEXT_ENTER,OnConvergence)
601    Cnvrg.Bind(wx.EVT_KILL_FOCUS,OnConvergence)
602    LSSizer.Add(Cnvrg,0,wx.ALIGN_CENTER_VERTICAL)
603    LSSizer.Add(wx.StaticText(self.dataDisplay,label=' Initial shift factor: '),0,wx.ALIGN_CENTER_VERTICAL)
604    Factr = wx.TextCtrl(self.dataDisplay,-1,value='%.5f'%(data['shift factor']),style=wx.TE_PROCESS_ENTER)
605    Factr.Bind(wx.EVT_TEXT_ENTER,OnFactor)
606    Factr.Bind(wx.EVT_KILL_FOCUS,OnFactor)
607    LSSizer.Add(Factr,0,wx.ALIGN_CENTER_VERTICAL)
608       
609    mainSizer.Add(LSSizer)
610    mainSizer.Add((5,5),0)
611    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Density Map Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
612
613    mainSizer.Add((5,5),0)
614    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Distance/angle Controls:'),0,wx.ALIGN_CENTER_VERTICAL)
615       
616    mainSizer.Layout()   
617    self.dataDisplay.SetSizer(mainSizer)
618    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
619    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
620     
621def UpdateComments(self,data):                   
622    self.dataFrame.SetLabel('Comments')
623    self.dataDisplay = wx.TextCtrl(parent=self.dataFrame,size=self.dataFrame.GetClientSize(),
624        style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
625    for line in data:
626        if line[-1] == '\n':
627            self.dataDisplay.AppendText(line)
628        else:
629            self.dataDisplay.AppendText(line+'\n')
630           
631def UpdateConstraints(self,data):
632   
633   
634    if self.dataDisplay:
635        self.dataDisplay.Destroy()
636    self.dataFrame.SetLabel('Constraints')
637    self.dataDisplay = wx.Panel(self.dataFrame)
638    self.dataFrame.SetMenuBar(self.dataFrame.ConstraintMenu)
639    mainSizer = wx.BoxSizer(wx.VERTICAL)
640    mainSizer.Add((5,5),0)
641    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement constraints:'),0,wx.ALIGN_CENTER_VERTICAL)
642   
643   
644    mainSizer.Layout()   
645    self.dataDisplay.SetSizer(mainSizer)
646    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
647    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
648   
649   
650def UpdateRestraints(self,data):
651
652
653    if self.dataDisplay:
654        self.dataDisplay.Destroy()
655    self.dataFrame.SetLabel('Restraints')
656    self.dataDisplay = wx.Panel(self.dataFrame)
657    self.dataFrame.SetMenuBar(self.dataFrame.RestraintMenu)
658    mainSizer = wx.BoxSizer(wx.VERTICAL)
659    mainSizer.Add((5,5),0)
660    mainSizer.Add(wx.StaticText(self.dataDisplay,label=' Refinement restraints:'),0,wx.ALIGN_CENTER_VERTICAL)
661   
662   
663    mainSizer.Layout()   
664    self.dataDisplay.SetSizer(mainSizer)
665    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
666    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
667             
668def UpdateHKLControls(self,data):
669   
670    def OnScaleSlider(event):
671        scale = int(scaleSel.GetValue())/1000.
672        scaleSel.SetValue(int(scale*1000.))
673        data['Scale'] = scale*10.
674        G2plt.PlotSngl(self)
675       
676    def OnLayerSlider(event):
677        layer = layerSel.GetValue()
678        data['Layer'] = layer
679        G2plt.PlotSngl(self)
680       
681    def OnSelZone(event):
682        data['Zone'] = zoneSel.GetValue()
683        G2plt.PlotSngl(self,newPlot=True)
684       
685    def OnSelType(event):
686        data['Type'] = typeSel.GetValue()
687        G2plt.PlotSngl(self)
688       
689    def SetStatusLine():
690        Status.SetStatusText("look at me!!!")
691                                     
692    if self.dataDisplay:
693        self.dataDisplay.Destroy()
694    if not self.dataFrame.GetStatusBar():
695        Status = self.dataFrame.CreateStatusBar()
696    SetStatusLine()
697    zones = ['100','010','001']
698    HKLmax = data['HKLmax']
699    HKLmin = data['HKLmin']
700    if data['ifFc']:
701        typeChoices = ['Fosq','Fo','|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']
702    else:
703        typeChoices = ['Fosq','Fo']
704    self.dataDisplay = wx.Panel(self.dataFrame)
705    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
706    mainSizer = wx.BoxSizer(wx.VERTICAL)
707    mainSizer.Add((5,10),0)
708   
709    scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
710    scaleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Scale'),0,
711        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
712    scaleSel = wx.Slider(parent=self.dataDisplay,maxValue=1000,minValue=100,
713        style=wx.SL_HORIZONTAL,value=int(data['Scale']*100))
714    scaleSizer.Add(scaleSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
715    scaleSel.SetLineSize(100)
716    scaleSel.SetPageSize(900)
717    scaleSel.Bind(wx.EVT_SLIDER, OnScaleSlider)
718    mainSizer.Add(scaleSizer,1,wx.EXPAND|wx.RIGHT)
719   
720    zoneSizer = wx.BoxSizer(wx.HORIZONTAL)
721    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Zone  '),0,
722        wx.ALIGN_CENTER_VERTICAL)
723    zoneSel = wx.ComboBox(parent=self.dataDisplay,value=data['Zone'],choices=['100','010','001'],
724        style=wx.CB_READONLY|wx.CB_DROPDOWN)
725    zoneSel.Bind(wx.EVT_COMBOBOX, OnSelZone)
726    zoneSizer.Add(zoneSel,0,wx.ALIGN_CENTER_VERTICAL)
727    zoneSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Plot type  '),0,
728        wx.ALIGN_CENTER_VERTICAL)       
729    typeSel = wx.ComboBox(parent=self.dataDisplay,value=data['Type'],choices=typeChoices,
730        style=wx.CB_READONLY|wx.CB_DROPDOWN)
731    typeSel.Bind(wx.EVT_COMBOBOX, OnSelType)
732    zoneSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
733    zoneSizer.Add((10,0),0)   
734    mainSizer.Add(zoneSizer,1,wx.EXPAND|wx.RIGHT)
735       
736    izone = zones.index(data['Zone'])
737    layerSizer = wx.BoxSizer(wx.HORIZONTAL)
738    layerSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Layer'),0,
739        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
740    layerSel = wx.Slider(parent=self.dataDisplay,maxValue=HKLmax[izone],minValue=HKLmin[izone],
741        style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS,value=0)
742    layerSel.SetLineSize(1)
743    layerSel.SetLineSize(5)
744    layerSel.Bind(wx.EVT_SLIDER, OnLayerSlider)   
745    layerSizer.Add(layerSel,1,wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
746    layerSizer.Add((10,0),0)   
747    mainSizer.Add(layerSizer,1,wx.EXPAND|wx.RIGHT)
748
749       
750    mainSizer.Layout()   
751    self.dataDisplay.SetSizer(mainSizer)
752    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
753    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
754       
755                         
756def GetPatternTreeItemId(self, parentId, itemText):
757    item, cookie = self.PatternTree.GetFirstChild(parentId)
758    while item:
759        if self.PatternTree.GetItemText(item) == itemText:
760            return item
761        item, cookie = self.PatternTree.GetNextChild(parentId, cookie)
762    return 0               
763
764def MovePatternTreeToGrid(self,item):
765   
766#    print self.PatternTree.GetItemText(item)
767   
768    oldPage = 0
769    if self.dataFrame:
770        self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
771        if self.dataFrame.GetLabel() == 'Comments':
772            data = [self.dataDisplay.GetValue()]
773            self.dataDisplay.Clear() 
774            Id = GetPatternTreeItemId(self,self.root, 'Comments')
775            if Id: self.PatternTree.SetItemPyData(Id,data)
776        if self.dataFrame.GetLabel() == 'Notebook':
777            data = [self.dataDisplay.GetValue()]
778            self.dataDisplay.Clear() 
779            Id = GetPatternTreeItemId(self,self.root, 'Notebook')
780            if Id: self.PatternTree.SetItemPyData(Id,data)
781        if 'Phase Data for' in self.dataFrame.GetLabel():
782            if self.dataDisplay: 
783                oldPage = self.dataDisplay.GetSelection()
784        self.dataFrame.Clear()
785        self.dataFrame.SetLabel('')
786    else:
787        self.dataFrame = DataFrame(parent=self.mainPanel)
788
789    self.dataFrame.Raise()           
790    self.PickId = 0
791    parentID = self.root
792    self.ExportPattern.Enable(False)
793    if item != self.root:
794        parentID = self.PatternTree.GetItemParent(item)
795    if self.PatternTree.GetItemParent(item) == self.root:
796        self.PatternId = item
797        self.PickId = item
798        if self.PatternTree.GetItemText(item) == 'Notebook':
799            self.PatternId = 0
800            self.ExportPattern.Enable(False)
801            data = self.PatternTree.GetItemPyData(item)
802            UpdateNotebook(self,data)
803        elif self.PatternTree.GetItemText(item) == 'Controls':
804            self.PatternId = 0
805            self.ExportPattern.Enable(False)
806            data = self.PatternTree.GetItemPyData(item)
807            if not data:           #fill in defaults
808                data = {
809                    #least squares controls
810                    'deriv type':'analytic','min dM/M':0.0001,'shift factor':1.0,
811                    #Fourier controls
812                    'mapType':'Fobs','d-max':100.,'d-min':0.2,'histograms':[],
813                    'stepSize':[0.5,0.5,0.5],'minX':[0.,0.,0.],'maxX':[1.0,1.0,1.0],
814                    #distance/angle controls
815                    'distMax':0.0,'angleMax':0.0,'useMapPeaks':False}
816                self.PatternTree.SetItemPyData(item,data)                             
817            self.Refine.Enable(True)
818            UpdateControls(self,data)
819        elif self.PatternTree.GetItemText(item) == 'Covariance':
820            data = self.PatternTree.GetItemPyData(item)
821            G2plt.PlotCovariance(self)
822        elif self.PatternTree.GetItemText(item) == 'Constraints':
823            data = self.PatternTree.GetItemPyData(item)
824            UpdateConstraints(self,data)
825        elif self.PatternTree.GetItemText(item) == 'Restraints':
826            data = self.PatternTree.GetItemPyData(item)
827            UpdateRestraints(self,data)
828        elif 'IMG' in self.PatternTree.GetItemText(item):
829            self.Image = item
830            G2plt.PlotImage(self,newPlot=True)
831        elif 'PKS' in self.PatternTree.GetItemText(item):
832            G2plt.PlotPowderLines(self)
833        elif 'PWDR' in self.PatternTree.GetItemText(item):
834            self.ExportPattern.Enable(True)
835            G2plt.PlotPatterns(self,newPlot=True)
836        elif 'HKLF' in self.PatternTree.GetItemText(item):
837            self.Sngl = item
838            G2plt.PlotSngl(self,newPlot=True)
839        elif 'PDF' in self.PatternTree.GetItemText(item):
840            self.PatternId = item
841            self.ExportPDF.Enable(True)
842            G2plt.PlotISFG(self,type='S(Q)')
843           
844    elif 'I(Q)' in self.PatternTree.GetItemText(item):
845        self.PickId = item
846        self.PatternId = self.PatternTree.GetItemParent(item)
847        G2plt.PlotISFG(self,type='I(Q)',newPlot=True)
848    elif 'S(Q)' in self.PatternTree.GetItemText(item):
849        self.PickId = item
850        self.PatternId = self.PatternTree.GetItemParent(item)
851        G2plt.PlotISFG(self,type='S(Q)',newPlot=True)
852    elif 'F(Q)' in self.PatternTree.GetItemText(item):
853        self.PickId = item
854        self.PatternId = self.PatternTree.GetItemParent(item)
855        G2plt.PlotISFG(self,type='F(Q)',newPlot=True)
856    elif 'G(R)' in self.PatternTree.GetItemText(item):
857        self.PickId = item
858        self.PatternId = self.PatternTree.GetItemParent(item)
859        G2plt.PlotISFG(self,type='G(R)',newPlot=True)           
860    elif self.PatternTree.GetItemText(parentID) == 'Phases':
861        self.PickId = item
862        data = self.PatternTree.GetItemPyData(item)           
863        G2phG.UpdatePhaseData(self,item,data,oldPage)
864    elif self.PatternTree.GetItemText(item) == 'Comments':
865        self.PatternId = self.PatternTree.GetItemParent(item)
866        self.PickId = item
867        data = self.PatternTree.GetItemPyData(item)
868        UpdateComments(self,data)
869    elif self.PatternTree.GetItemText(item) == 'Image Controls':
870        self.dataFrame.SetTitle('Image Controls')
871        self.PickId = item
872        self.Image = self.PatternTree.GetItemParent(item)
873        masks = self.PatternTree.GetItemPyData(
874            GetPatternTreeItemId(self,self.Image, 'Masks'))
875        data = self.PatternTree.GetItemPyData(item)
876        G2imG.UpdateImageControls(self,data,masks)
877        G2plt.PlotImage(self)
878    elif self.PatternTree.GetItemText(item) == 'Masks':
879        self.dataFrame.SetTitle('Masks')
880        self.PickId = item
881        self.Image = self.PatternTree.GetItemParent(item)
882        data = self.PatternTree.GetItemPyData(item)
883        G2imG.UpdateMasks(self,data)
884        G2plt.PlotImage(self)
885    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
886        self.PickId = item
887        self.Sngl = self.PatternTree.GetItemParent(item)
888        data = self.PatternTree.GetItemPyData(item)
889        UpdateHKLControls(self,data)
890        G2plt.PlotSngl(self)
891    elif self.PatternTree.GetItemText(item) == 'PDF Controls':
892        self.PatternId = self.PatternTree.GetItemParent(item)
893        self.ExportPDF.Enable(True)
894        self.PickId = item
895        data = self.PatternTree.GetItemPyData(item)
896        G2pdG.UpdatePDFGrid(self,data)
897        G2plt.PlotISFG(self,type='I(Q)')
898        G2plt.PlotISFG(self,type='S(Q)')
899        G2plt.PlotISFG(self,type='F(Q)')
900        G2plt.PlotISFG(self,type='G(R)')
901    elif self.PatternTree.GetItemText(item) == 'Peak List':
902        self.PatternId = self.PatternTree.GetItemParent(item)
903        self.ExportPeakList.Enable(True)
904        self.PickId = item
905        data = self.PatternTree.GetItemPyData(item)
906        G2pdG.UpdatePeakGrid(self,data)
907        G2plt.PlotPatterns(self)
908    elif self.PatternTree.GetItemText(item) == 'Background':
909        self.PatternId = self.PatternTree.GetItemParent(item)
910        self.PickId = item
911        data = self.PatternTree.GetItemPyData(item)
912        G2pdG.UpdateBackgroundGrid(self,data)
913        G2plt.PlotPatterns(self)
914    elif self.PatternTree.GetItemText(item) == 'Limits':
915        self.PatternId = self.PatternTree.GetItemParent(item)
916        self.PickId = item
917        data = self.PatternTree.GetItemPyData(item)
918        G2pdG.UpdateLimitsGrid(self,data)
919        G2plt.PlotPatterns(self)
920    elif self.PatternTree.GetItemText(item) == 'Instrument Parameters':
921        self.PatternId = self.PatternTree.GetItemParent(item)
922        self.PickId = item
923        data = self.PatternTree.GetItemPyData(item)
924        G2pdG.UpdateInstrumentGrid(self,data)
925        G2plt.PlotPeakWidths(self)
926    elif self.PatternTree.GetItemText(item) == 'Sample Parameters':
927        self.PatternId = self.PatternTree.GetItemParent(item)
928        self.PickId = item
929        data = self.PatternTree.GetItemPyData(item)
930
931        if 'Temperature' not in data:           #temp fix for old gpx files
932            data = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
933                'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,
934                'Force':0.0,'Gonio. radius':200.0}
935            self.PatternTree.SetItemPyData(item,data)
936   
937        G2pdG.UpdateSampleGrid(self,data)
938        G2plt.PlotPatterns(self)
939    elif self.PatternTree.GetItemText(item) == 'Index Peak List':
940        self.PatternId = self.PatternTree.GetItemParent(item)
941        self.ExportPeakList.Enable(True)
942        self.PickId = item
943        data = self.PatternTree.GetItemPyData(item)
944        G2pdG.UpdateIndexPeaksGrid(self,data)
945        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
946            G2plt.PlotPowderLines(self)
947        else:
948            G2plt.PlotPatterns(self)
949    elif self.PatternTree.GetItemText(item) == 'Unit Cells List':
950        self.PatternId = self.PatternTree.GetItemParent(item)
951        self.PickId = item
952        data = self.PatternTree.GetItemPyData(item)
953        if not data:
954            data.append([0,0.0,4,25.0,0,'P1',1,1,1,90,90,90]) #zero error flag, zero value, max Nc/No, start volume
955            data.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0])      #Bravais lattice flags
956            data.append([])                                 #empty cell list
957            data.append([])                                 #empty dmin
958            self.PatternTree.SetItemPyData(item,data)                             
959        G2pdG.UpdateUnitCellsGrid(self,data)
960        if 'PKS' in self.PatternTree.GetItemText(self.PatternId):
961            G2plt.PlotPowderLines(self)
962        else:
963            G2plt.PlotPatterns(self)
964    elif self.PatternTree.GetItemText(item) == 'Reflection Lists':
965        self.PatternId = self.PatternTree.GetItemParent(item)
966        self.PickId = item
967        data = self.PatternTree.GetItemPyData(item)
968        self.RefList = ''
969        if len(data):
970            self.RefList = data.keys()[0]
971        G2pdG.UpdateReflectionGrid(self,data)
972        G2plt.PlotPatterns(self)
973     
Note: See TracBrowser for help on using the repository browser.