Changeset 163


Ignore:
Timestamp:
Oct 13, 2010 10:17:22 AM (12 years ago)
Author:
vondreele
Message:

new versions

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r161 r163  
    1717import GSASIIplot as G2plt
    1818import GSASIIpwdGUI as G2pdG
     19import GSASIIspc as G2spc
    1920import OpenGL as ogl
    2021
     
    807808        dlg.Destroy()
    808809        sub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
    809         SGData = {'SpGrp':'P 1'}
     810        E,SGData = G2spc.SpcGroup('P 1')
    810811        self.PatternTree.SetItemPyData(sub, \
    811             {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
    812             'Scale':[False,1.0],'Pawley dmin':0.25},'Atoms':[],'Drawing':{}})
    813 
     812            {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,
     813            'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
     814            'Pawley dmin':1.0},'Atoms':[],'Drawing':{},'Histograms':{}})
    814815       
    815816    def OnDeletePhase(self,event):
  • trunk/GSASIIIO.py

    r155 r163  
    928928                Atoms.append(Atom)
    929929    Volume = G2lat.calc_V(G2lat.cell2A(abc+angles))
    930     Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,'Cell':[False,]+abc+angles+[Volume,],'Scale':[False,1.0]}
     930    Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,
     931        'Cell':[False,]+abc+angles+[Volume,]}
    931932    Phase['Atoms'] = Atoms
    932933    Phase['Drawing'] = {}
     934    Phase['Histograms'] = {}
    933935    return Phase
    934936       
     
    996998    else:
    997999        PhaseName = 'None'
    998     Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,'Cell':[False,]+cell+[Volume,],'Scale':[False,1.0]}
     1000    Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,
     1001        'Cell':[False,]+cell+[Volume,]}
    9991002    Phase['Atoms'] = Atoms
    10001003    Phase['Drawing'] = {}
     1004    Phase['Histograms'] = {}
    10011005   
    10021006    return Phase
  • trunk/GSASIIgrid.py

    r158 r163  
    1414] = [wx.NewId() for _init_coll_Atom_Items in range(8)]
    1515
    16 [ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM,
    17     wxID_DRAWDELETE, wxID_DRAWFILLCELL, wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
    18 ] = [wx.NewId() for _init_coll_DrawAtom_Items in range(8)]
     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)]
    1923
    2024[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG,
     
    4549    def _init_coll_AtomsMenu(self,parent):
    4650        parent.Append(menu=self.AtomEdit, title='Edit')
     51       
     52    def _init_coll_DataMenu(self,parent):
     53        parent.Append(menu=self.DataEdit, title='Edit')
    4754       
    4855    def _init_coll_DrawAtomsMenu(self,parent):
     
    8592            help='Select atoms to transform first')
    8693           
     94    def _init_coll_Data_Items(self,parent):
     95        parent.Append(id=wxID_PWDRADD, kind=wx.ITEM_NORMAL,text='Add powder histograms',
     96            help='Select new powder histograms to be used for this phase')
     97        parent.Append(id=wxID_HKLFADD, kind=wx.ITEM_NORMAL,text='Add single crystal histograms',
     98            help='Select new single crystal histograms to be used for this phase')
     99        parent.Append(id=wxID_DATADELETE, kind=wx.ITEM_NORMAL,text='Delete histograms',
     100            help='Delete histograms from use for this phase')
     101           
    87102    def _init_coll_DrawAtom_Items(self,parent):
    88103        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
     
    90105        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
    91106            help='Select atoms first')
     107        parent.Append(id=wxID_DRAWATOMCOLOR, kind=wx.ITEM_NORMAL,text='Atom color',
     108            help='Select atoms first')
     109        parent.Append(id=wxID_DRAWATOMRESETCOLOR, kind=wx.ITEM_NORMAL,text='Reset atom colors',
     110            help='Resets all atom colors to defaults')
    92111        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
    93112            help='View point is 1st atom selected')
     
    151170       
    152171        self.AtomsMenu = wx.MenuBar()
     172        self.DataMenu = wx.MenuBar()
    153173        self.DrawAtomsMenu = wx.MenuBar()
    154174        self.ImageMenu = wx.MenuBar()
     
    159179        self.IndexMenu = wx.MenuBar()
    160180        self.AtomEdit = wx.Menu(title='')
     181        self.DataEdit = wx.Menu(title='')
    161182        self.DrawAtomEdit = wx.Menu(title='')
    162183        self.ImageEdit = wx.Menu(title='')
     
    168189        self._init_coll_AtomsMenu(self.AtomsMenu)
    169190        self._init_coll_Atom_Items(self.AtomEdit)
     191        self._init_coll_DataMenu(self.DataMenu)
     192        self._init_coll_Data_Items(self.DataEdit)
    170193        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
    171194        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
     
    218241        self.DestroyChildren()
    219242                   
    220 class GSGrid(wg.Grid):
    221     def __init__(self, parent, name=''):
    222         wg.Grid.__init__(self,parent,-1,name=name)                   
    223         self.SetSize(parent.GetClientSize())
    224            
    225     def Clear(self):
    226         wg.Grid.ClearGrid(self)
    227        
    228     def SetCellStyle(self,r,c,color="white",readonly=True):
    229         self.SetCellBackgroundColour(r,c,color)
    230         self.SetReadOnly(r,c,isReadOnly=readonly)
    231                        
    232243class GSNoteBook(wx.Notebook):
    233244    def __init__(self, parent, name='',size = None):
     
    238249        GSNoteBook.DeleteAllPages(self)
    239250       
     251    def FindPage(self,name):
     252        numPage = self.GetPageCount()
     253        for page in range(numPage):
     254            if self.GetPageText(page) == name:
     255                return page
     256       
     257class GSGrid(wg.Grid):
     258    def __init__(self, parent, name=''):
     259        wg.Grid.__init__(self,parent,-1,name=name)                   
     260        self.SetSize(parent.GetClientSize())
     261           
     262    def Clear(self):
     263        wg.Grid.ClearGrid(self)
     264       
     265    def SetCellStyle(self,r,c,color="white",readonly=True):
     266        self.SetCellBackgroundColour(r,c,color)
     267        self.SetReadOnly(r,c,isReadOnly=readonly)
     268                       
    240269class Table(wg.PyGridTableBase):
    241270    def __init__(self, data=[], rowLabels=None, colLabels=None, types = None):
  • trunk/GSASIIphsGUI.py

    r161 r163  
    125125
    126126    Atoms = []
    127     self.SelectedRow = 0
    128 
    129 #    def BookResize(event):
    130 #        w,h = self.GetSize()
    131 #        self.dataDisplay.SetSize(wx.Size(w,h))
    132 #       
    133     def UpdateGeneral():
     127    if self.dataDisplay:
     128        self.dataDisplay.Destroy()
     129    PhaseName = self.PatternTree.GetItemText(item)
     130    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     131    self.dataFrame.SetLabel('Phase Data for '+PhaseName)
     132    self.dataFrame.CreateStatusBar()
     133    self.dataDisplay = G2gd.GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
     134
     135    def SetupGeneral():
    134136        generalData = data['General']
    135137        atomData = data['Atoms']
     
    141143        generalData['AtomMass'] = []
    142144        generalData['Color'] = []
    143         generalData['Myself'] = self
     145        generalData['Mydir'] = self.dirname
    144146        colType = 1
    145147        colSS = 7
     
    161163                generalData['Color'].append(Info['Color'])
    162164
    163     def FillGeneralGrid():
    164         rowLabels = ['Phase name','Phase type','Space group',
    165             'Lattice ',' parameters','Scale factor','Density','Elements','No. per cell',
    166             'Atom weight','Bond radii','Angle radii','vdw radii','Color']
    167         def SetLatticeParametersStyle(SGData,table):
    168             clist = [1,2,3,4,5,6]
    169             if SGData['SGLaue'] in ['m3','m3m']:
    170                 table[4][2] = table[4][3] = table[4][1]
    171                 table[4][4] = table[4][5] = table[4][6] = 90.
    172                 clist = [2,3,4,5,6]
    173             elif SGData['SGLaue'] in ['3R','3mR']:
    174                 table[4][2] = table[4][3] = table[4][1]
    175                 table[4][5] = table[4][6] = table[4][4]
    176                 clist = [2,3,5,6]
    177             elif SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:
    178                 table[4][2] = table[4][1]
    179                 table[4][4] = table[4][5] = 90.
    180                 table[4][6] = 120.
    181                 clist = [2,4,5,6]
    182             elif SGData['SGLaue'] in ['4/m','4/mmm']:
    183                 table[4][2] = table[4][1]
    184                 table[4][4] = table[4][5] = table[4][6] = 90.
    185                 clist = [2,4,5,6]
    186             elif SGData['SGLaue'] in ['mmm']:
    187                 table[4][4] = table[4][5] = table[4][6] = 90.
    188                 clist = [4,5,6]
    189             elif SGData['SGLaue'] in ['2/m']:
    190                 if SGData['SGUniq'] == 'a':
    191                     table[4][5]= table[4][6] = 90.
    192                     clist = [5,6]
    193                 if SGData['SGUniq'] == 'b':
    194                     table[4][4]= table[4][6] = 90.
    195                     clist = [4,6]
    196                 if SGData['SGUniq'] == 'c':
    197                     table[4][4]= table[4][5] = 90.
    198                     clist = [4,5]
    199             for c in clist:
    200                 General.SetCellStyle(4,c,VERY_LIGHT_GREY,True)
    201 
    202         def RefreshGeneralGrid(event):
    203 
    204             r,c =  event.GetRow(),event.GetCol()
    205             generalData['Name'] = table[0][0]
     165    def UpdateGeneral():
     166       
     167        ''' default dictionary structure for "General" phase item: (taken from GSASII.py)
     168        'General':{
     169            'Name':PhaseName
     170            'Type':'nuclear'
     171            'SGData':SGData
     172            'Cell':[False,10.,10.,10.,90.,90.,90,1000.]
     173            'Histogram list':['',]
     174            'Pawley dmin':1.0}
     175            'Atoms':[]
     176            'Drawing':{}
     177        })
     178        '''
     179        phaseTypes = ['nuclear','modulated','magnetic','macromolecular','Pawley']
     180        SetupGeneral()
     181        generalData = data['General']
     182       
     183        def OnPhaseName(event):
     184            oldName = generalData['Name']
     185            generalData['Name'] = NameTxt.GetValue()
     186            self.G2plotNB.Rename(oldName,generalData['Name'])
     187            self.dataFrame.SetLabel('Phase Data for '+generalData['Name'])
    206188            self.PatternTree.SetItemText(item,generalData['Name'])
    207             generalData['Type'] = table[1][0]
    208             SpcGp = table[2][0]
     189                       
     190        def OnPhaseType(event):
     191            if not generalData['AtomTypes']:             #can change only if no atoms!
     192                generalData['Type'] = TypeTxt.GetValue()
     193                dataDisplay.Destroy()           #needed to clear away bad cellSizer, etc.
     194                UpdateGeneral()
     195                if generalData['Type'] == 'Pawley':
     196                    if self.dataDisplay.FindPage('Atoms'):
     197                        self.dataDisplay.DeletePage(self.dataDisplay.FindPage('Atoms'))
     198                        self.dataDisplay.DeletePage(self.dataDisplay.FindPage('Draw Options'))
     199                        self.dataDisplay.DeletePage(self.dataDisplay.FindPage('Draw Atoms'))
     200                        self.dataDisplay.AdvanceSelection()
     201                    if not self.dataDisplay.FindPage('Pawley reflections'):     
     202                        self.dataDisplay.AddPage(G2gd.GSGrid(self.dataDisplay),'Pawley reflections')
     203            else:
     204                TypeTxt.SetValue(generalData['Type'])
     205               
     206               
     207        def OnSpaceGroup(event):
     208            SpcGp = SGTxt.GetValue()
    209209            SGErr,SGData = G2spc.SpcGroup(SpcGp)
    210             if r == 0:
    211                 self.G2plotNB.Rename(oldName,generalData['Name'])
    212             elif r == 2 and c == 0:
    213                 if SGErr:
    214                     text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
    215                     table[2][0] = generalData['SGData']['SpGrp']
    216                     msg = 'Space Group Error'
    217                     Style = wx.ICON_EXCLAMATION
     210            if SGErr:
     211                text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
     212                SGTxt.SetValue(generalData['SGData']['SpGrp'])
     213                msg = 'Space Group Error'
     214                Style = wx.ICON_EXCLAMATION
     215            else:
     216                text = G2spc.SGPrint(SGData)
     217                generalData['SGData'] = SGData
     218                msg = 'Space Group Information'
     219                Style = wx.ICON_INFORMATION
     220            Text = ''
     221            for line in text:
     222                Text += line+'\n'
     223            wx.MessageBox(Text,caption=msg,style=Style)
     224            dataDisplay.Destroy()           #needed to clear away bad cellSizer, etc.
     225            UpdateGeneral()
     226           
     227        def OnCellRef(event):
     228            generalData['Cell'][0] = cellRef.GetValue()
     229           
     230        def OnCellChange(event):
     231            SGData = generalData['SGData']
     232            laue = SGData['SGLaue']
     233            if laue == '2/m':
     234                laue += SGData['SGUniq']
     235            cell = generalData['Cell']
     236            Obj = event.GetEventObject()
     237            ObjId = cellList.index(Obj.GetId())
     238            try:
     239                value = max(1.0,float(Obj.GetValue()))
     240            except ValueError:
     241                if ObjId < 3:               #bad cell edge - reset
     242                    value = controls[6+ObjId]
     243                else:                       #bad angle
     244                    value = 90.
     245            if laue in ['m3','m3m']:
     246                cell[1] = cell[2] = cell[3] = value
     247                cell[4] = cell[5] = cell[6] = 90.0
     248                Obj.SetValue("%.5f"%(cell[1]))
     249            elif laue in ['3R','3mR']:
     250                if ObjId == 0:
     251                    cell[1] = cell[2] = cell[3] = value
     252                    Obj.SetValue("%.5f"%(cell[1]))
    218253                else:
    219                     text = G2spc.SGPrint(SGData)
    220                     generalData['SGData'] = SGData
    221                     msg = 'Space Group Information'
    222                     Style = wx.ICON_INFORMATION
    223                 Text = ''
    224                 for line in text:
    225                     Text += line+'\n'
    226                 wx.MessageBox(Text,caption=msg,style=Style)
    227             General.SetCellValue(4,0,str(generalData['Cell'][0]))
    228             for c in range(1,7):
    229                 General.SetCellStyle(4,c,"white",False)
    230                 generalData['Cell'][c] = float(General.GetCellValue(4,c))
    231             generalData['Cell'][7] = G2lat.calc_V(G2lat.cell2A(generalData['Cell'][1:7]))
    232             SetLatticeParametersStyle(SGData,table)
    233             generalData['Scale'][1] = float(General.GetCellValue(5,1))
    234             General.ForceRefresh()
    235 
    236         UpdateGeneral()
    237         generalData = data['General']
    238         self.dataFrame.setSizePosLeft([750,340])
    239         colLabels = []
    240         colLabels += ['' for i in range(max(8,len(generalData['AtomTypes'])))]
    241         table = []
    242         table.append([generalData['Name'],'','','','','','','',''])      #phase name
    243         table.append([generalData['Type'],'','','','','','','',''])      #phase type
    244         E,SGData = G2spc.SpcGroup(generalData['SGData']['SpGrp'])
    245         table.append([SGData['SpGrp'],'','','','','','','',''])     #space group symbol
    246         table.append(['refine','a    ','b    ','c    ','alpha ','beta ','gamma','volume  '])
    247         table.append(generalData['Cell'])                      #lattice parameters
    248         table.append([generalData['Scale'][0],generalData['Scale'][1],'','','','','',''])   #scale factor
    249         line = []
    250         if generalData['Type'] == 'Pawley':
    251             table.append(max(0.25,generalData['Pawley dmin']))
    252             rowLabels[6] = 'd min'
    253         else:
     254                    cell[4] = cell[5] = cell[6] = value
     255                    Obj.SetValue("%.5f"%(cell[4]))
     256            elif laue in ['3','3m1','31m','6/m','6/mmm','4/m','4/mmm']:                   
     257                if ObjId == 0:
     258                    cell[1] = cell[2] = value
     259                    Obj.SetValue("%.5f"%(cell[1]))
     260                else:
     261                    cell[3] = value
     262                    Obj.SetValue("%.5f"%(cell[3]))
     263            elif laue in ['mmm']:
     264                cell[ObjId+1] = value
     265                Obj.SetValue("%.5f"%(cell[ObjId+1]))
     266            elif laue in ['2/m'+'a']:
     267                if ObjId != 3:
     268                    cell[ObjId+1] = value
     269                    Obj.SetValue("%.5f"%(cell[ObjId+1]))
     270                else:
     271                    cell[4] = value
     272                    Obj.SetValue("%.3f"%(cell[4]))
     273            elif laue in ['2/m'+'b']:
     274                if ObjId != 3:
     275                    cell[ObjId+1] = value
     276                    Obj.SetValue("%.5f"%(cell[ObjId+1]))
     277                else:
     278                    cell[5] = value
     279                    Obj.SetValue("%.3f"%(cell[5]))
     280            elif laue in ['2/m'+'c']:
     281                if ObjId != 3:
     282                    cell[ObjId+1] = value
     283                    Obj.SetValue("%.5f"%(cell[ObjId+1]))
     284                else:
     285                    cell[6] = value
     286                    Obj.SetValue("%.3f"%(cell[6]))
     287            else:
     288                cell[ObjId+1] = value
     289                if ObjId < 3:
     290                    Obj.SetValue("%.5f"%(cell[1+ObjId]))
     291                else:
     292                    Obj.SetValue("%.3f"%(cell[1+ObjId]))
     293            cell[7] = G2lat.calc_V(G2lat.cell2A(cell[1:7]))
     294            volVal.SetValue("%.3f"%(cell[7]))
     295            generalData['Cell'] = cell
     296            dataDisplay.Destroy()           #needed to clear away bad cellSizer, etc.
     297            UpdateGeneral()
     298                       
     299        def OnPawleyVal(event):
     300            try:
     301                dmin = float(pawlVal.GetValue())
     302                if 0.25 <= dmin <= 10.:
     303                    generalData['Pawley dmin'] = dmin
     304            except ValueError:
     305                pass
     306            pawlVal.SetValue("%.2f"%(generalData['Pawley dmin']))          #reset in case of error           
     307                                   
     308        cellGUIlist = [[['m3','m3m'],4,zip([" Unit cell: a = "," Vol = "],["%.5f","%.3f"],[True,False],[0,0])],
     309        [['3R','3mR'],6,zip([" a = "," alpha = "," Vol = "],["%.5f","%.3f","%.3f"],[True,True,False],[0,2,0])],
     310        [['3','3m1','31m','6/m','6/mmm','4/m','4/mmm'],6,zip([" a = "," c = "," Vol = "],["%.5f","%.5f","%.3f"],[True,True,False],[0,2,0])],
     311        [['mmm'],8,zip([" a = "," b = "," c = "," Vol = "],["%.5f","%.5f","%.5f","%.3f"],
     312            [True,True,True,False],[0,1,2,0])],
     313        [['2/m'+'a'],10,zip([" a = "," b = "," c = "," alpha = "," Vol = "],
     314            ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
     315        [['2/m'+'b'],10,zip([" a = "," b = "," c = "," beta = "," Vol = "],
     316            ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
     317        [['2/m'+'c'],10,zip([" a = "," b = "," c = "," gamma = "," Vol = "],
     318            ["%.5f","%.5f","%.5f","%.3f","%.3f"],[True,True,True,True,False],[0,1,2,4,0])],
     319        [['-1'],8,zip([" a = "," b = "," c = "," Vol = "," alpha = "," beta = "," gamma = "],
     320            ["%.5f","%.5f","%.5f","%.3f","%.3f","%.3f","%.3f"],
     321            [True,True,True,False,True,True,True],[0,1,2,0,3,4,5])]]
     322       
     323        General.DestroyChildren()
     324        dataDisplay = wx.Panel(General)
     325        mainSizer = wx.BoxSizer(wx.VERTICAL)
     326        mainSizer.Add((5,5),0)
     327        mainSizer.Add(wx.StaticText(dataDisplay,-1,'General phase data:'),0,wx.ALIGN_CENTER_VERTICAL)
     328        mainSizer.Add((5,5),0)
     329        nameSizer = wx.BoxSizer(wx.HORIZONTAL)
     330        nameSizer.Add(wx.StaticText(dataDisplay,-1,' Phase name: '),0,wx.ALIGN_CENTER_VERTICAL)
     331        NameTxt = wx.TextCtrl(dataDisplay,-1,value=generalData['Name'],style=wx.TE_PROCESS_ENTER)
     332        NameTxt.Bind(wx.EVT_TEXT_ENTER,OnPhaseName)
     333        NameTxt.Bind(wx.EVT_KILL_FOCUS,OnPhaseName)
     334        nameSizer.Add(NameTxt,0,wx.ALIGN_CENTER_VERTICAL)
     335        nameSizer.Add(wx.StaticText(dataDisplay,-1,'  Phase type: '),0,wx.ALIGN_CENTER_VERTICAL)
     336        TypeTxt = wx.ComboBox(dataDisplay,-1,value=generalData['Type'],choices=phaseTypes,
     337            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     338        TypeTxt.Bind(wx.EVT_COMBOBOX, OnPhaseType)
     339        nameSizer.Add(TypeTxt,0,wx.ALIGN_CENTER_VERTICAL)
     340        nameSizer.Add(wx.StaticText(dataDisplay,-1,'  Space group: '),0,wx.ALIGN_CENTER_VERTICAL)
     341        SGTxt = wx.TextCtrl(dataDisplay,-1,value=generalData['SGData']['SpGrp'],style=wx.TE_PROCESS_ENTER)
     342        SGTxt.Bind(wx.EVT_TEXT_ENTER,OnSpaceGroup)
     343        nameSizer.Add(SGTxt,0,wx.ALIGN_CENTER_VERTICAL)
     344        mainSizer.Add(nameSizer,0)
     345        mainSizer.Add((5,5),0)
     346        cell = generalData['Cell']
     347        laue = generalData['SGData']['SGLaue']
     348        if laue == '2/m':
     349            laue += generalData['SGData']['SGUniq']
     350        for cellGUI in cellGUIlist:
     351            if laue in cellGUI[0]:
     352                useGUI = cellGUI
     353        cellList = []
     354        cellSizer = wx.FlexGridSizer(2,useGUI[1]+1,5,5)
     355        cellRef = wx.CheckBox(dataDisplay,label='Refine unit cell:')
     356        cellSizer.Add(cellRef,0,wx.ALIGN_CENTER_VERTICAL)
     357        cellRef.Bind(wx.EVT_CHECKBOX, OnCellRef)
     358        cellRef.SetValue(cell[0])
     359        for txt,fmt,ifEdit,Id in useGUI[2]:
     360            cellSizer.Add(wx.StaticText(dataDisplay,label=txt),0,wx.ALIGN_CENTER_VERTICAL)
     361            if ifEdit:          #a,b,c,etc.
     362                cellVal = wx.TextCtrl(dataDisplay,value=(fmt%(cell[Id+1])),
     363                    style=wx.TE_PROCESS_ENTER)
     364                cellVal.Bind(wx.EVT_TEXT_ENTER,OnCellChange)       
     365                cellVal.Bind(wx.EVT_KILL_FOCUS,OnCellChange)
     366                cellSizer.Add(cellVal,0,wx.ALIGN_CENTER_VERTICAL)
     367                cellList.append(cellVal.GetId())
     368            else:               #volume
     369                volVal = wx.TextCtrl(dataDisplay,value=(fmt%(cell[7])),style=wx.TE_READONLY)
     370                volVal.SetBackgroundColour(VERY_LIGHT_GREY)
     371                cellSizer.Add(volVal,0,wx.ALIGN_CENTER_VERTICAL)
     372        mainSizer.Add(cellSizer,0)
     373        mainSizer.Add((5,5),0)
     374       
     375        if len(generalData['AtomTypes']):
    254376            mass = 0.
    255377            for i,elem in enumerate(generalData['AtomTypes']):
    256378                mass += generalData['NoAtoms'][elem]*generalData['AtomMass'][i]
     379            denSizer = wx.BoxSizer(wx.HORIZONTAL)
     380            denSizer.Add(wx.StaticText(dataDisplay,-1,' Density: '),0,wx.ALIGN_CENTER_VERTICAL)
    257381            Volume = generalData['Cell'][7]
     382            density = mass/(0.6022137*Volume)
     383            denTxt = wx.TextCtrl(dataDisplay,-1,'%.3f'%(density),style=wx.TE_READONLY)
     384            denTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     385            denSizer.Add(denTxt,0,wx.ALIGN_CENTER_VERTICAL)       
    258386            if generalData['Type'] == 'macromolecular' and mass > 0.0:
    259                 table.append([mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','','',''])
    260             else:
    261                 table.append([mass/(0.6022137*Volume),'','','','','','','',''])
    262             for i,elem in enumerate(generalData['AtomTypes']):
    263                 line.append(generalData['NoAtoms'][elem])
    264             table.append(generalData['AtomTypes']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #element list
    265             table.append(line+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #No. per cell
    266             table.append(generalData['AtomMass']+['' for i in range(max(8,len(generalData['AtomTypes'])))])  #At. wt.
    267             table.append(generalData['BondRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
    268             table.append(generalData['AngleRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
    269             table.append(generalData['vdWRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
    270             table.append(['','','','','','','',''])                        #contains colors
    271         Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData['AtomTypes'])))]
    272         generalTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
    273         General.SetTable(generalTable, True)
    274         General.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshGeneralGrid)
    275         General.SetMargins(0,0)
    276         General.SetColSize(0,100)
    277         General.SetColLabelSize(0)
    278         attr = wg.GridCellAttr()
    279         for c in range(max(8,len(generalData['AtomTypes']))):
    280             if c > 0:
    281                 General.SetReadOnly(0,c,isReadOnly=True)
    282                 General.SetReadOnly(1,c,isReadOnly=True)
    283                 General.SetReadOnly(2,c,isReadOnly=True)
    284             General.SetReadOnly(3,c,isReadOnly=True)                         #unit cell labels
    285             General.SetCellAlignment(3,c,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
    286             if c < 4:
    287                 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))
    288                 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))
    289             else:
    290                 General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))
    291                 General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))
    292             for r in range(6,13):
    293                 General.SetReadOnly(r,c,isReadOnly=True)
    294         r = rowLabels.index('Color')
    295         for c in range(len(generalData['AtomTypes'])):
    296             General.SetCellBackgroundColour(r,c,generalData['Color'][c])
    297 
    298         General.SetReadOnly(4,7,isReadOnly=True)                            #cell volume - no edit
    299         General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type
    300             'magnetic','macromolecular','Pawley'],False))                           #- change only if no atoms
    301         if line:                                                    #no.of atoms not zero!
    302             General.SetReadOnly(1,0,isReadOnly=True)                #can't change phase type
    303         General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters
    304         General.SetCellEditor(4,0,wg.GridCellBoolEditor())
    305         SetLatticeParametersStyle(SGData,table)
    306         General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4))         #scale factor
    307         General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))
    308         General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())
    309         General.SetCellEditor(5,0,wg.GridCellBoolEditor())
    310         General.SetCellRenderer(6,0,wg.GridCellFloatRenderer(8,3))
    311         General.SetCellRenderer(6,2,wg.GridCellFloatRenderer(8,3))
     387                denSizer.Add(wx.StaticText(dataDisplay,-1,' Matthews coeff.: '),
     388                    0,wx.ALIGN_CENTER_VERTICAL)
     389                mattTxt = wx.TextCtrl(dataDisplay,-1,'%.3f'%(Volume/mass),style=wx.TE_READONLY)
     390                mattTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     391                denSizer.Add(mattTxt,0,wx.ALIGN_CENTER_VERTICAL)
     392            mainSizer.Add(denSizer)
     393            mainSizer.Add((5,5),0)
     394           
     395            elemSizer = wx.FlexGridSizer(7,len(generalData['AtomTypes'])+1,1,1)
     396            elemSizer.Add(wx.StaticText(dataDisplay,label='Elements'),0,wx.ALIGN_CENTER_VERTICAL)
     397            for elem in generalData['AtomTypes']:
     398                typTxt = wx.TextCtrl(dataDisplay,value=elem,style=wx.TE_READONLY)
     399                typTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     400                elemSizer.Add(typTxt,0,wx.ALIGN_CENTER_VERTICAL)
     401            elemSizer.Add(wx.StaticText(dataDisplay,label='No. per cell'),0,wx.ALIGN_CENTER_VERTICAL)
     402            for elem in generalData['AtomTypes']:
     403                numbTxt = wx.TextCtrl(dataDisplay,value='%.1f'%(generalData['NoAtoms'][elem]),
     404                    style=wx.TE_READONLY)
     405                numbTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     406                elemSizer.Add(numbTxt,0,wx.ALIGN_CENTER_VERTICAL)
     407            elemSizer.Add(wx.StaticText(dataDisplay,label='Atom weight'),0,wx.ALIGN_CENTER_VERTICAL)
     408            for wt in generalData['AtomMass']:
     409                wtTxt = wx.TextCtrl(dataDisplay,value='%.3f'%(wt),style=wx.TE_READONLY)
     410                wtTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     411                elemSizer.Add(wtTxt,0,wx.ALIGN_CENTER_VERTICAL)
     412            elemSizer.Add(wx.StaticText(dataDisplay,label='Bond radii'),0,wx.ALIGN_CENTER_VERTICAL)
     413            for rad in generalData['BondRadii']:
     414                bondRadii = wx.TextCtrl(dataDisplay,value='%.2f'%(rad),style=wx.TE_READONLY)
     415                bondRadii.SetBackgroundColour(VERY_LIGHT_GREY)
     416                elemSizer.Add(bondRadii,0,wx.ALIGN_CENTER_VERTICAL)
     417            elemSizer.Add(wx.StaticText(dataDisplay,label='Angle radii'),0,wx.ALIGN_CENTER_VERTICAL)
     418            for rad in generalData['AngleRadii']:
     419                elemTxt = wx.TextCtrl(dataDisplay,value='%.2f'%(rad),style=wx.TE_READONLY)
     420                elemTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     421                elemSizer.Add(elemTxt,0,wx.ALIGN_CENTER_VERTICAL)
     422            elemSizer.Add(wx.StaticText(dataDisplay,label='van der Waals radii'),0,wx.ALIGN_CENTER_VERTICAL)
     423            for rad in generalData['vdWRadii']:
     424                elemTxt = wx.TextCtrl(dataDisplay,value='%.2f'%(rad),style=wx.TE_READONLY)
     425                elemTxt.SetBackgroundColour(VERY_LIGHT_GREY)
     426                elemSizer.Add(elemTxt,0,wx.ALIGN_CENTER_VERTICAL)
     427            elemSizer.Add(wx.StaticText(dataDisplay,label='Default color'),0,wx.ALIGN_CENTER_VERTICAL)
     428            for color in generalData['Color']:
     429                colorTxt = wx.TextCtrl(dataDisplay,value='',style=wx.TE_READONLY)
     430                colorTxt.SetBackgroundColour(color)
     431                elemSizer.Add(colorTxt,0,wx.ALIGN_CENTER_VERTICAL)
     432            mainSizer.Add(elemSizer)
     433           
     434        elif generalData['Type'] == 'Pawley':
     435            pawlSizer = wx.BoxSizer(wx.HORIZONTAL)
     436            pawlSizer.Add(wx.StaticText(dataDisplay,label=' Pawley dmin: '),0,wx.ALIGN_CENTER_VERTICAL)
     437            pawlVal = wx.TextCtrl(dataDisplay,value='%.2f'%(generalData['Pawley dmin']),style=wx.TE_PROCESS_ENTER)
     438            pawlVal.Bind(wx.EVT_TEXT_ENTER,OnPawleyVal)       
     439            pawlVal.Bind(wx.EVT_KILL_FOCUS,OnPawleyVal)
     440            pawlSizer.Add(pawlVal,0,wx.ALIGN_CENTER_VERTICAL)
     441            mainSizer.Add(pawlSizer)
     442
     443        dataDisplay.SetSizer(mainSizer)
     444        Size = mainSizer.Fit(self.dataFrame)
     445        Size[1] += 26                           #compensate for status bar
     446        dataDisplay.SetSize(Size)
     447        self.dataFrame.setSizePosLeft(Size)
    312448
    313449    def FillAtomsGrid():
     
    484620                        if CSI[2][i]:
    485621                            Atoms.SetCellStyle(r,ci,WHITE,False)
    486                 UpdateGeneral()
     622                SetupGeneral()
    487623            elif Atoms.GetColLabelValue(c) == 'I/A':
    488624                atomData[r][c] = Atoms.GetCellValue(r,c)
     
    567703                        atomData[r][c-1] = name[:1]+'(%d)'%(r+1)
    568704                PE.Destroy()
    569                 UpdateGeneral()
     705                SetupGeneral()
    570706                FillAtomsGrid()
    571707            else:
     
    640776        elif generalData['Type'] == 'magnetic':
    641777            atomData.append(['UNK','H','',x,y,z,1,Sytsym,Mult,0,'I',0.01,0,0,0,0,0,0,0,0,0])
    642         UpdateGeneral()
     778        SetupGeneral()
    643779
    644780    def OnAtomInsert(event):
     
    672808            elif generalData['Type'] == 'magnetic':
    673809                atomData.insert(indx,['UNK','UNK','',x,y,z,1,Sytsym,Mult,0,'I',0.01,0,0,0,0,0,0,0,0,0])
    674             UpdateGeneral()
     810            SetupGeneral()
    675811
    676812    def AtomDelete(event):
     
    769905            'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' ']
    770906        defaultDrawing = {'viewPoint':[[0.5,0.5,0.5],[]],'showHydrogen':True,'backColor':[0,0,0],'depthFog':False,
    771             'Zclip':50.0,'cameraPos':50.,'pickItem':'Atoms','showBadContacts':False,
     907            'Zclip':50.0,'cameraPos':50.,'radiusFactor':0.85,'showBadContacts':False,
    772908            'bondRadius':0.1,'ballScale':0.33,'vdwScale':0.67,'ellipseProb':50,'sizeH':0.50,
    773909            'unitCellBox':False,'showABC':True,'showSymElem':False,'selectedAtoms':[],
     
    784920            for atom in atomData:
    785921                if generalData['Type'] == 'nuclear':
    786                     drawingData['Atoms'].append(atom[:2]+atom[3:6]+['1',]+['lines',]+
    787                         ['',]+atom[9:17]+[[]])
    788                     drawingData['atomPtrs'] = [2,1,6]         #x, type & style
     922                    atomInfo = [atom[:2]+atom[3:6]+['1',]+['vdW balls',]+
     923                        ['',]+[[255,255,255],]+atom[9:17]+[[]]][0]
     924                    cx,ct,cs = [2,1,6]         #x, type & style
    789925                elif generalData['Type'] == 'macromolecular':
    790926                    try:
     
    792928                    except ValueError:
    793929                        oneLetter = -1
    794                     drawingData['Atoms'].append([atom[1].strip()+atom[0],]+
     930                    atomInfo = [[atom[1].strip()+atom[0],]+
    795931                        [AA1letter[oneLetter]+atom[0],]+atom[2:5]+
    796                         atom[6:9]+['1',]+['lines',]+['',]+atom[12:20]+[[]])
    797                     drawingData['atomPtrs'] = [5,4,9]         #x, type & style
     932                        atom[6:9]+['1',]+['sticks',]+['',]+[[255,255,255],]+atom[12:20]+[[]]][0]
     933                    cx,ct,cs = [5,4,9]         #x, type & style
    798934                elif generalData['Type'] == 'magnetic':
    799                     drawingData['Atoms'].append(atom[:2]+atom[3:6]+['lines',]+['',]+atom[9:20]+[[]])
    800 #            elif generalData['Type'] == 'modulated':
    801 #                ?????   for future
     935                    atomData = [atom[:2]+atom[3:6]+['vdW balls',]+['',]+atom[9:20]+[[]]][0]
     936                    cx,ct,cs = [2,1,6]         #x, type & style
     937#                elif generalData['Type'] == 'modulated':
     938#                   ?????   for future
     939                atNum = generalData['AtomTypes'].index(atom[ct])
     940                atomInfo[cs+2] = list(generalData['Color'][atNum])
     941                drawingData['Atoms'].append(atomInfo)
     942            drawingData['atomPtrs'] = [cx,ct,cs]
    802943            data['Drawing'] = drawingData
    803944
     
    806947        SetupDrawingData()
    807948        drawingData = data['Drawing']
     949        cx,ct,cs = drawingData['atomPtrs']
    808950        atomData = drawingData['Atoms']
    809951        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,
    810952            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',    #x,y,z
    811953            wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,polyhedra",
    812             wg.GRID_VALUE_CHOICE+": ,type,name,number",wg.GRID_VALUE_STRING,]
     954            wg.GRID_VALUE_CHOICE+": ,type,name,number",wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,]
    813955        styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra']
    814956        labelChoice = [' ','type','name','number']
    815         colLabels = ['Name','Type','x','y','z','Sym Op','Style','Label','I/A']
     957        colLabels = ['Name','Type','x','y','z','Sym Op','Style','Label','Color','I/A']
    816958        if generalData['Type'] == 'macromolecular':
    817959            colLabels = ['Residue','1-letter','Chain'] + colLabels
     
    8891031                            drawAtoms.SetCellValue(r,c,parms)
    8901032                    dlg.Destroy()                   
     1033                elif drawAtoms.GetColLabelValue(c) == 'Color':
     1034                    dlg = wx.ColourDialog(self)
     1035                    if dlg.ShowModal() == wx.ID_OK:
     1036                        color = dlg.GetColourData().GetColour()
     1037                        attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     1038                        attr.SetReadOnly(True)
     1039                        attr.SetBackgroundColour(color)
     1040                        for r in range(len(atomData)):
     1041                            atomData[r][c] = color
     1042                            drawingData['Atoms'][r][c] = color
     1043                            drawAtoms.SetAttr(r,c,attr)
     1044                        UpdateDrawAtoms()
     1045                    dlg.Destroy()
    8911046                elif drawAtoms.GetColLabelValue(c) == 'Residue':
    8921047                    SetChoice('Residue',c,3)
     
    9071062                    atomData[r][c] = drawAtoms.GetCellValue(r,c)
    9081063                    FindBonds()
     1064                elif drawAtoms.GetColLabelValue(c) == 'Color':
     1065                    dlg = wx.ColourDialog(self)
     1066                    if dlg.ShowModal() == wx.ID_OK:
     1067                        color = dlg.GetColourData().GetColour()
     1068                        attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     1069                        attr.SetReadOnly(True)
     1070                        attr.SetBackgroundColour(color)
     1071                        atomData[r][c] = color
     1072                        drawingData['Atoms'][r][c] = color
     1073                        drawAtoms.SetAttr(i,cs+2,attr)
     1074                    dlg.Destroy()
     1075                    event.StopPropagation()
     1076                    UpdateDrawAtoms()
    9091077            G2plt.PlotStructure(self,data)
    9101078                   
     
    9411109        drawAtoms.AutoSizeColumns(True)
    9421110        drawAtoms.SetColSize(colLabels.index('Style'),80)
     1111        drawAtoms.SetColSize(colLabels.index('Color'),50)
    9431112        drawAtoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
    9441113        drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
     1114        drawAtoms.Bind(wg.EVT_GRID_CELL_LEFT_DCLICK, RefreshAtomGrid)
    9451115        drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect)
     1116        for i,atom in enumerate(drawingData['Atoms']):
     1117            attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     1118            attr.SetReadOnly(True)
     1119            attr.SetBackgroundColour(atom[cs+2])
     1120            drawAtoms.SetAttr(i,cs+2,attr)
     1121            drawAtoms.SetCellValue(i,cs+2,'')
    9461122        indx = drawingData['selectedAtoms']
    9471123        if indx:
     
    9501126                    drawAtoms.SelectRow(r)
    9511127        for c in range(len(colLabels)):
    952             if colLabels[c] not in ['Style','Label']:
    953                 attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
    954                 attr.SetReadOnly(True)
    955                 attr.SetBackgroundColour(VERY_LIGHT_GREY)
     1128           attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     1129           attr.SetReadOnly(True)
     1130           attr.SetBackgroundColour(VERY_LIGHT_GREY)
     1131           if colLabels[c] not in ['Style','Label','Color']:
    9561132                drawAtoms.SetColAttr(c,attr)
    9571133        self.dataFrame.setSizePosLeft([600,300])
     
    9981174            dlg.Destroy()
    9991175            G2plt.PlotStructure(self,data)
    1000 
     1176           
     1177    def DrawAtomColor(event):
     1178        indx = drawAtoms.GetSelectedRows()
     1179        if indx:
     1180            generalData = data['General']
     1181            atomData = data['Drawing']['Atoms']
     1182            cx,ct,cs = data['Drawing']['atomPtrs']
     1183            dlg = wx.ColourDialog(self)
     1184            if dlg.ShowModal() == wx.ID_OK:
     1185                color = dlg.GetColourData().GetColour()
     1186                for r in indx:
     1187                    atomData[r][cs+2] = color
     1188                    attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     1189                    attr.SetBackgroundColour(color)
     1190                    drawAtoms.SetAttr(r,cs+2,attr)
     1191                    data['Drawing']['Atoms'][r][cs+2] = color
     1192            dlg.Destroy()
     1193           
     1194    def ResetAtomColors(event):
     1195        generalData = data['General']
     1196        atomData = data['Drawing']['Atoms']
     1197        cx,ct,cs = data['Drawing']['atomPtrs']
     1198        for atom in atomData:           
     1199            atNum = generalData['AtomTypes'].index(atom[ct])
     1200            atom[cs+2] = list(generalData['Color'][atNum])
     1201        UpdateDrawAtoms()
     1202        G2plt.PlotStructure(self,data)       
     1203       
    10011204    def SetViewPoint(event):
    10021205        indx = drawAtoms.GetSelectedRows()
     
    11261329                    for xyz in cellArray+xyzB:
    11271330                        dist = np.sqrt(np.sum(np.inner(Amat,xyz-xyzA)**2))
    1128                         if 0 < dist <= 0.85*sumR:
     1331                        if 0 < dist <= data['Drawing']['radiusFactor']*sumR:
    11291332                            if noDuplicate(xyz,atomData):
    11301333                                newAtom = atomB[:]
     
    12431446                dist = ma.masked_less(np.sqrt(np.sum(np.inner(Amat,Dx)**2,axis=0)),0.5) #gets rid of self & disorder "bonds" < 0.5A
    12441447                sumR = atomA[3]+Radii
    1245                 IndB = ma.nonzero(ma.masked_greater(dist-0.85*sumR,0.))                 #get indices of bonded atoms
     1448                IndB = ma.nonzero(ma.masked_greater(dist-data['Drawing']['radiusFactor']*sumR,0.))                 #get indices of bonded atoms
    12461449                i = atomA[0]
    12471450                for j in IndB[0]:
     
    12691472        import copy
    12701473        import wx.lib.colourselect as wcs
    1271         self.dataFrame.setSizePosLeft([300,430])
    12721474        generalData = data['General']
    12731475        SetupDrawingData()
     
    12931495            G2plt.PlotStructure(self,data)
    12941496
    1295 
    12961497        def OnBallScale(event):
    12971498            drawingData['ballScale'] = ballScale.GetValue()/100.
     
    13401541            sizeH.SetValue("%.2f"%(value))
    13411542            G2plt.PlotStructure(self,data)
    1342 
    1343         def OnPickItem(event):
    1344             drawingData['pickItem'] = pickChoice[pickItem.GetSelection()]
     1543           
     1544        def OnRadFactor(event):
     1545            try:
     1546                value = max(0.1,min(1.2,float(radFactor.GetValue())))
     1547            except ValueError:
     1548                value = 0.85
     1549            drawingData['radiusFactor'] = value
     1550            radFactor.SetValue("%.2f"%(value))
     1551            FindBonds()
     1552            G2plt.PlotStructure(self,data)
     1553           
     1554       
     1555
    13451556
    13461557        dataDisplay = wx.Panel(drawOptions)
     
    13511562       
    13521563        slopSizer = wx.BoxSizer(wx.HORIZONTAL)
    1353         slideSizer = wx.FlexGridSizer(6,2,5,0)
     1564        slideSizer = wx.FlexGridSizer(6,2)
    13541565        slideSizer.AddGrowableCol(1,1)
    13551566
     
    13971608        slopSizer.Add(slideSizer,1,wx.EXPAND|wx.RIGHT)
    13981609        slopSizer.Add((10,5),0)
    1399         slopSizer.SetMinSize(wx.Size(300,180))
    1400         mainSizer.Add(slopSizer,1,wx.EXPAND)
     1610        slopSizer.SetMinSize(wx.Size(300,10))
     1611        mainSizer.Add(slopSizer,0)
     1612        mainSizer.Add((5,5),0)
    14011613
    14021614        flexSizer = wx.FlexGridSizer(6,2,5,0)
     
    14081620        flexSizer.Add(viewPoint,0,wx.ALIGN_CENTER_VERTICAL)
    14091621       
     1622        showABC = wx.CheckBox(dataDisplay,-1,label='Show test point?')
     1623        showABC.Bind(wx.EVT_CHECKBOX, OnShowABC)
     1624        showABC.SetValue(drawingData['showABC'])
     1625        flexSizer.Add(showABC,0,wx.ALIGN_CENTER_VERTICAL)
     1626
     1627        unitCellBox = wx.CheckBox(dataDisplay,-1,label='Show unit cell?')
     1628        unitCellBox.Bind(wx.EVT_CHECKBOX, OnShowUnitCell)
     1629        unitCellBox.SetValue(drawingData['unitCellBox'])
     1630        flexSizer.Add(unitCellBox,0,wx.ALIGN_CENTER_VERTICAL)
     1631
     1632        showBadContacts = wx.CheckBox(dataDisplay,-1,label='Show bad contacts?')
     1633        showBadContacts.Bind(wx.EVT_CHECKBOX, OnShowBadContacts)
     1634        showBadContacts.SetValue(drawingData['showBadContacts'])
     1635        flexSizer.Add(showBadContacts,0,wx.ALIGN_CENTER_VERTICAL)
     1636
     1637        showSymElem = wx.CheckBox(dataDisplay,-1,label='Show sym. elem.?')
     1638        showSymElem.Bind(wx.EVT_CHECKBOX, OnShowSymElem)
     1639        showSymElem.SetValue(drawingData['showSymElem'])
     1640        flexSizer.Add(showSymElem,0,wx.ALIGN_CENTER_VERTICAL)
     1641
     1642        showHydrogen = wx.CheckBox(dataDisplay,-1,label='Show hydrogens?')
     1643        showHydrogen.Bind(wx.EVT_CHECKBOX, OnShowHyd)
     1644        showHydrogen.SetValue(drawingData['showHydrogen'])
     1645        flexSizer.Add(showHydrogen,0,wx.ALIGN_CENTER_VERTICAL)
     1646
    14101647        lineSizer = wx.BoxSizer(wx.HORIZONTAL)
    14111648        lineSizer.Add(wx.StaticText(dataDisplay,-1,'Background color:'),0,wx.ALIGN_CENTER_VERTICAL)
     
    14151652        flexSizer.Add(lineSizer,0,)
    14161653
    1417         showABC = wx.CheckBox(dataDisplay,-1,label='Show test point?')
    1418         showABC.Bind(wx.EVT_CHECKBOX, OnShowABC)
    1419         showABC.SetValue(drawingData['showABC'])
    1420         flexSizer.Add(showABC,0,wx.ALIGN_CENTER_VERTICAL)
    1421 
    1422         unitCellBox = wx.CheckBox(dataDisplay,-1,label='Show unit cell?')
    1423         unitCellBox.Bind(wx.EVT_CHECKBOX, OnShowUnitCell)
    1424         unitCellBox.SetValue(drawingData['unitCellBox'])
    1425         flexSizer.Add(unitCellBox,0,wx.ALIGN_CENTER_VERTICAL)
    1426 
    1427         showBadContacts = wx.CheckBox(dataDisplay,-1,label='Show bad contacts?')
    1428         showBadContacts.Bind(wx.EVT_CHECKBOX, OnShowBadContacts)
    1429         showBadContacts.SetValue(drawingData['showBadContacts'])
    1430         flexSizer.Add(showBadContacts,0,wx.ALIGN_CENTER_VERTICAL)
    1431 
    1432         showSymElem = wx.CheckBox(dataDisplay,-1,label='Show sym. elem.?')
    1433         showSymElem.Bind(wx.EVT_CHECKBOX, OnShowSymElem)
    1434         showSymElem.SetValue(drawingData['showSymElem'])
    1435         flexSizer.Add(showSymElem,0,wx.ALIGN_CENTER_VERTICAL)
    1436 
    1437         showHydrogen = wx.CheckBox(dataDisplay,-1,label='Show hydrogens?')
    1438         showHydrogen.Bind(wx.EVT_CHECKBOX, OnShowHyd)
    1439         showHydrogen.SetValue(drawingData['showHydrogen'])
    1440         flexSizer.Add(showHydrogen,0,wx.ALIGN_CENTER_VERTICAL)
    1441 
    14421654        flexSizer.Add(wx.StaticText(dataDisplay,-1,'Hydrogen radius, A:  '),0,wx.ALIGN_CENTER_VERTICAL)
    14431655        sizeH = wx.TextCtrl(dataDisplay,-1,value='%.2f'%(drawingData['sizeH']),style=wx.TE_PROCESS_ENTER)
     
    14461658        flexSizer.Add(sizeH,0,wx.ALIGN_CENTER_VERTICAL)
    14471659
    1448         flexSizer.Add(wx.StaticText(dataDisplay,-1,'Pick items on drawing by:  '),0,wx.ALIGN_CENTER_VERTICAL)
    1449         pickItem = wx.Choice(dataDisplay,-1,choices=pickChoice)
    1450         pickItem.Bind(wx.EVT_CHOICE, OnPickItem)
    1451         pickItem.SetSelection(pickChoice.index(drawingData['pickItem']))
    1452         flexSizer.Add(pickItem,0,wx.ALIGN_CENTER_VERTICAL)
     1660        flexSizer.Add(wx.StaticText(dataDisplay,-1,'Bond search factor:  '),0,wx.ALIGN_CENTER_VERTICAL)
     1661        radFactor = wx.TextCtrl(dataDisplay,value='%.2f'%(drawingData['radiusFactor']),style=wx.TE_PROCESS_ENTER)
     1662        radFactor.Bind(wx.EVT_TEXT_ENTER,OnRadFactor)
     1663        radFactor.Bind(wx.EVT_KILL_FOCUS,OnRadFactor)
     1664        flexSizer.Add(radFactor,0,wx.ALIGN_CENTER_VERTICAL)
    14531665        mainSizer.Add(flexSizer,0,)
    1454 #        mainSizer.SetMinSize(wx.Size(300,340))          #to get sliders long enough
    14551666
    14561667        dataDisplay.SetSizer(mainSizer)
    1457         self.dataFrame.SetSize(dataDisplay.Fit())
     1668        Size = mainSizer.Fit(self.dataFrame)
     1669        Size[1] += 26                           #compensate for status bar
     1670        dataDisplay.SetSize(Size)
     1671        self.dataFrame.setSizePosLeft(Size)
     1672
     1673    def UpdateDData():
     1674        UseList = data['Histograms']
     1675        generalData = data['General']
     1676        SGData = generalData['SGData']
     1677        keyList = UseList.keys()
     1678        keyList.sort()
     1679        Indx = {}
     1680       
     1681        def OnScaleRef(event):
     1682            Obj = event.GetEventObject()
     1683            UseList[Indx[Obj.GetId()]]['Scale'][1] = Obj.GetValue()
     1684           
     1685        def OnScaleVal(event):
     1686            Obj = event.GetEventObject()
     1687            try:
     1688                scale = float(Obj.GetValue())
     1689                if scale > 0:
     1690                    UseList[Indx[Obj.GetId()]]['Scale'][0] = scale
     1691            except ValueError:
     1692                pass
     1693            Obj.SetValue("%.4f"%(UseList[Indx[Obj.GetId()]]['Scale'][0]))          #reset in case of error
     1694           
     1695        def OnSizeType(event):
     1696            Obj = event.GetEventObject()
     1697            UseList[Indx[Obj.GetId()]]['Size'][0] = Obj.GetValue()
     1698            dataDisplay.Destroy()
     1699            UpdateDData()
     1700           
     1701        def OnSizeRef(event):
     1702            Obj = event.GetEventObject()
     1703            hist,pid = Indx[Obj.GetId()]
     1704            UseList[hist]['Size'][2][pid] = Obj.GetValue()
     1705           
     1706        def OnSizeVal(event):
     1707            Obj = event.GetEventObject()
     1708            hist,pid = Indx[Obj.GetId()]
     1709            try:
     1710                size = float(Obj.GetValue())
     1711                if size > 0:
     1712                    UseList[hist]['Size'][1][pid] = size
     1713            except ValueError:
     1714                pass
     1715            Obj.SetValue("%.1f"%(UseList[hist]['Size'][1][pid]))          #reset in case of error
     1716           
     1717        def OnSizeAxis(event):
     1718            Obj = event.GetEventObject()
     1719            hist,pid = Indx[Obj.GetId()]
     1720            UseList[hist]['Size'][3][pid] = Obj.GetValue()
     1721           
     1722        def OnStrainType(event):
     1723            Obj = event.GetEventObject()
     1724            UseList[Indx[Obj.GetId()]]['Mustrain'][0] = Obj.GetValue()
     1725            dataDisplay.Destroy()
     1726            UpdateDData()
     1727           
     1728        def OnStrainRef(event):
     1729            Obj = event.GetEventObject()
     1730            hist,pid = Indx[Obj.GetId()]
     1731            UseList[hist]['Mustrain'][2][pid] = Obj.GetValue()
     1732           
     1733        def OnStrainVal(event):
     1734            Obj = event.GetEventObject()
     1735            hist,pid = Indx[Obj.GetId()]
     1736            try:
     1737                strain = float(Obj.GetValue())
     1738                if strain > 0:
     1739                    UseList[hist]['Mustrain'][1][pid] = strain
     1740            except ValueError:
     1741                pass
     1742            Obj.SetValue("%.1f"%(UseList[hist]['Mustrain'][1][pid]))          #reset in case of error
     1743           
     1744        def OnStrainAxis(event):
     1745            Obj = event.GetEventObject()
     1746            hist,pid = Indx[Obj.GetId()]
     1747            UseList[hist]['Mustrain'][3][pid] = Obj.GetValue()
     1748       
     1749        DData.DestroyChildren()
     1750        dataDisplay = wx.Panel(DData)
     1751        mainSizer = wx.BoxSizer(wx.VERTICAL)
     1752        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Histogram data for '+PhaseName+':'),0,wx.ALIGN_CENTER_VERTICAL)
     1753        for item in keyList:
     1754            histData = UseList[item]
     1755            mainSizer.Add(wx.StaticText(dataDisplay,-1,50*'_'))               
     1756            mainSizer.Add((5,5),0)
     1757            mainSizer.Add(wx.StaticText(dataDisplay,-1,'  '+item),0,wx.ALIGN_CENTER_VERTICAL)
     1758            mainSizer.Add((0,5),0)
     1759            scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
     1760            scaleRef = wx.CheckBox(dataDisplay,label=' Scale factor: ')
     1761            scaleRef.SetValue(UseList[item]['Scale'][1])
     1762            Indx[scaleRef.GetId()] = item
     1763            scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
     1764            scaleSizer.Add(scaleRef,0,wx.ALIGN_CENTER_VERTICAL)
     1765            scaleVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,
     1766                '%.4f'%(UseList[item]['Scale'][0]),style=wx.TE_PROCESS_ENTER)
     1767            Indx[scaleVal.GetId()] = item
     1768            scaleVal.Bind(wx.EVT_TEXT_ENTER,OnScaleVal)
     1769            scaleVal.Bind(wx.EVT_KILL_FOCUS,OnScaleVal)
     1770            scaleSizer.Add(scaleVal,0,wx.ALIGN_CENTER_VERTICAL)
     1771            mainSizer.Add(scaleSizer)
     1772            mainSizer.Add((0,5),0)
     1773               
     1774            if item[:4] == 'PWDR':
     1775                sizeSizer = wx.BoxSizer(wx.HORIZONTAL)
     1776                choices = ['isotropic','uniaxial',]
     1777                sizeType = wx.ComboBox(dataDisplay,wx.ID_ANY,value=UseList[item]['Size'][0],choices=choices,
     1778                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1779                sizeType.Bind(wx.EVT_COMBOBOX, OnSizeType)
     1780                Indx[sizeType.GetId()] = item
     1781                sizeSizer.Add(sizeType)
     1782                sizeSizer.Add((5,0),0)
     1783                if UseList[item]['Size'][0] == 'isotropic':
     1784                    sizeRef = wx.CheckBox(dataDisplay,label=' Cryst. size: ')
     1785                    sizeRef.SetValue(UseList[item]['Size'][2][0])
     1786                    Indx[sizeRef.GetId()] = [item,0]
     1787                    sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)
     1788                    sizeSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)
     1789                    sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,
     1790                        '%.1f'%(UseList[item]['Size'][1][0]),style=wx.TE_PROCESS_ENTER)
     1791                    Indx[sizeVal.GetId()] = [item,0]
     1792                    sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
     1793                    sizeVal.Bind(wx.EVT_KILL_FOCUS,OnSizeVal)
     1794                    sizeSizer.Add(sizeVal,0,wx.ALIGN_CENTER_VERTICAL)
     1795                    mainSizer.Add(sizeSizer)
     1796                    mainSizer.Add((0,5),0)
     1797                elif UseList[item]['Size'][0] == 'uniaxial':
     1798                    sizeSizer.Add(wx.StaticText(dataDisplay,-1,' Unique axis: '),0,wx.ALIGN_CENTER_VERTICAL)
     1799                    axes = zip(['H:','K:','L:'],UseList[item]['Size'][3],range(3))                   
     1800                    for ax,H,i in axes:                           
     1801                        Axis = wx.SpinCtrl(dataDisplay,wx.ID_ANY,ax,min=-3,max=3,size=wx.Size(40,20))
     1802                        Axis.SetValue(H)
     1803                        Indx[Axis.GetId()] = [item,i]
     1804                        sizeSizer.Add(Axis)
     1805                        Axis.Bind(wx.EVT_SPINCTRL, OnSizeAxis)
     1806                    mainSizer.Add(sizeSizer)
     1807                    mainSizer.Add((0,5),0)
     1808                    sizeSizer = wx.BoxSizer(wx.HORIZONTAL)
     1809                    parms = zip([' Equatorial size: ',' Axial size: '],UseList[item]['Size'][1],
     1810                        UseList[item]['Size'][2],range(2))
     1811                    for Pa,val,ref,id in parms:
     1812                        sizeRef = wx.CheckBox(dataDisplay,label=Pa)
     1813                        sizeRef.SetValue(ref)
     1814                        Indx[sizeRef.GetId()] = [item,id]
     1815                        sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)
     1816                        sizeSizer.Add(sizeRef,0,wx.ALIGN_CENTER_VERTICAL)
     1817                        sizeVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.1f'%(val),style=wx.TE_PROCESS_ENTER)
     1818                        Indx[sizeVal.GetId()] = [item,id]
     1819                        sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
     1820                        sizeVal.Bind(wx.EVT_KILL_FOCUS,OnSizeVal)
     1821                        sizeSizer.Add(sizeVal,0,wx.ALIGN_CENTER_VERTICAL)
     1822                        sizeSizer.Add((5,0),0)
     1823                    sizeSizer.Add((5,0),0)                   
     1824                    mainSizer.Add(sizeSizer)
     1825               
     1826                strainSizer = wx.BoxSizer(wx.HORIZONTAL)
     1827                choices = ['isotropic','uniaxial','generalized',]
     1828                strainType = wx.ComboBox(dataDisplay,wx.ID_ANY,value=UseList[item]['Mustrain'][0],choices=choices,
     1829                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1830                strainType.Bind(wx.EVT_COMBOBOX, OnStrainType)
     1831                Indx[strainType.GetId()] = item
     1832                strainSizer.Add(strainType)
     1833                strainSizer.Add((5,0),0)
     1834                if UseList[item]['Mustrain'][0] == 'isotropic':
     1835                    strainRef = wx.CheckBox(dataDisplay,label=' microstrain: ')
     1836                    strainRef.SetValue(UseList[item]['Mustrain'][2][0])
     1837                    Indx[strainRef.GetId()] = [item,0]
     1838                    strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)
     1839                    strainSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)
     1840                    strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,
     1841                        '%.4f'%(UseList[item]['Mustrain'][1][0]),style=wx.TE_PROCESS_ENTER)
     1842                    Indx[strainVal.GetId()] = [item,0]
     1843                    strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
     1844                    strainVal.Bind(wx.EVT_KILL_FOCUS,OnStrainVal)
     1845                    strainSizer.Add(strainVal,0,wx.ALIGN_CENTER_VERTICAL)
     1846                    mainSizer.Add(strainSizer)
     1847                    mainSizer.Add((0,5),0)
     1848                elif UseList[item]['Mustrain'][0] == 'uniaxial':
     1849                    strainSizer.Add(wx.StaticText(dataDisplay,-1,' Unique axis: '),0,wx.ALIGN_CENTER_VERTICAL)
     1850                    axes = zip(['H:','K:','L:'],UseList[item]['Mustrain'][3],range(3))                   
     1851                    for ax,H,i in axes:                           
     1852                        Axis = wx.SpinCtrl(dataDisplay,wx.ID_ANY,ax,min=-3,max=3,size=wx.Size(40,20))
     1853                        Axis.SetValue(H)
     1854                        Indx[Axis.GetId()] = [item,i]
     1855                        strainSizer.Add(Axis)
     1856                        Axis.Bind(wx.EVT_SPINCTRL, OnStrainAxis)
     1857                    mainSizer.Add(strainSizer)
     1858                    mainSizer.Add((0,5),0)
     1859                    strainSizer = wx.BoxSizer(wx.HORIZONTAL)
     1860                    parms = zip([' Equatorial mustrain: ',' Axial mustrain: '],
     1861                        UseList[item]['Mustrain'][1],UseList[item]['Mustrain'][2],range(2))
     1862                    for Pa,val,ref,id in parms:
     1863                        strainRef = wx.CheckBox(dataDisplay,label=Pa)
     1864                        strainRef.SetValue(ref)
     1865                        Indx[strainRef.GetId()] = [item,id]
     1866                        strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)
     1867                        strainSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)
     1868                        strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.4f'%(val),style=wx.TE_PROCESS_ENTER)
     1869                        Indx[strainVal.GetId()] = [item,id]
     1870                        strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
     1871                        strainVal.Bind(wx.EVT_KILL_FOCUS,OnStrainVal)
     1872                        strainSizer.Add(strainVal,0,wx.ALIGN_CENTER_VERTICAL)
     1873                        strainSizer.Add((5,0),0)
     1874                    strainSizer.Add((5,0),0)                   
     1875                    mainSizer.Add(strainSizer)
     1876                elif UseList[item]['Mustrain'][0] == 'generalized':
     1877                    strainSizer.Add(wx.StaticText(dataDisplay,-1,' Coefficients: '),0,wx.ALIGN_CENTER_VERTICAL)
     1878                    mainSizer.Add(strainSizer)
     1879                    mainSizer.Add((0,5),0)
     1880                    Snames = G2spc.MustrainNames(SGData)
     1881                    numb = len(Snames)
     1882                    if len(UseList[item]['Mustrain'][1]) < numb:
     1883                        UseList[item]['Mustrain'][1] = numb*[0.0,]
     1884                        UseList[item]['Mustrain'][2] = numb*[False,]
     1885                    parms = zip(Snames,UseList[item]['Mustrain'][1],UseList[item]['Mustrain'][2],range(numb))
     1886                    strainSizer = wx.FlexGridSizer(numb%3+1,6,5,5)
     1887                    for Pa,val,ref,id in parms:
     1888                        strainRef = wx.CheckBox(dataDisplay,label=Pa)
     1889                        strainRef.SetValue(ref)
     1890                        Indx[strainRef.GetId()] = [item,id]
     1891                        strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)
     1892                        strainSizer.Add(strainRef,0,wx.ALIGN_CENTER_VERTICAL)
     1893                        strainVal = wx.TextCtrl(dataDisplay,wx.ID_ANY,'%.4f'%(val),style=wx.TE_PROCESS_ENTER)
     1894                        Indx[strainVal.GetId()] = [item,id]
     1895                        strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
     1896                        strainVal.Bind(wx.EVT_KILL_FOCUS,OnStrainVal)
     1897                        strainSizer.Add(strainVal,0,wx.ALIGN_CENTER_VERTICAL)
     1898                    mainSizer.Add(strainSizer)
     1899            elif item[:4] == 'HKLF':
     1900                pass
     1901            else:
     1902                print 'error - unknown histogram type'      #place holder - never invoked
     1903        mainSizer.Add((5,5),0)
     1904
     1905
     1906        dataDisplay.SetSizer(mainSizer)
     1907        Size = mainSizer.Fit(self.dataFrame)
     1908        Size[0] = max(Size[0],300)
     1909        Size[1] += 26                           #compensate for status bar
     1910        DData.Fit()
     1911        dataDisplay.SetSize(Size)
     1912        self.dataFrame.setSizePosLeft(Size)
     1913       
     1914    def OnHklfAdd(event):
     1915        UseList = data['Histograms']
     1916        keyList = UseList.keys()
     1917        TextList = []
     1918        if self.PatternTree.GetCount():
     1919            item, cookie = self.PatternTree.GetFirstChild(self.root)
     1920            while item:
     1921                name = self.PatternTree.GetItemText(item)
     1922                if name not in keyList and 'HKLF' in name:
     1923                    TextList.append(name)
     1924                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                       
     1925            dlg = wx.MultiChoiceDialog(self, 'Which new data to use?', 'Use data', TextList, wx.CHOICEDLG_STYLE)
     1926            try:
     1927                if dlg.ShowModal() == wx.ID_OK:
     1928                    result = dlg.GetSelections()
     1929                    for i in result:
     1930                        histoName = TextList[i]
     1931                        UseList[histoName] = {'Histogram':histoName,'Scale':[1.0,True],
     1932                            'Extinction':['Lorentzian','Secondary Type I',{'Eg':[0.0,False]},]}                       
     1933                    data['Histograms'] = UseList
     1934                    UpdateDData()
     1935            finally:
     1936                dlg.Destroy()
     1937       
     1938    def OnPwdrAdd(event):
     1939        UseList = data['Histograms']
     1940        keyList = UseList.keys()
     1941        TextList = []
     1942        if self.PatternTree.GetCount():
     1943            item, cookie = self.PatternTree.GetFirstChild(self.root)
     1944            while item:
     1945                name = self.PatternTree.GetItemText(item)
     1946                if name not in keyList and 'PWDR' in name:
     1947                    TextList.append(name)
     1948                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     1949            dlg = wx.MultiChoiceDialog(self, 'Which new data to use?', 'Use data', TextList, wx.CHOICEDLG_STYLE)
     1950            try:
     1951                if dlg.ShowModal() == wx.ID_OK:
     1952                    result = dlg.GetSelections()
     1953                    for i in result:
     1954                        histoName = TextList[i]
     1955                        UseList[histoName] = {'Histogram':histoName,'Scale':[1.0,False],
     1956                            'Size':['isotropic',[10000.,0,],[False,False],[0,0,1]],
     1957                            'Mustrain':['isotropic',[0.0,0,],[False,False],[0,0,1]],
     1958                            'MDtexture':[[0,0,1],1.0,False],
     1959                            'Extinction':[0.0,False]}
     1960                    data['Histograms'] = UseList
     1961                    UpdateDData()
     1962            finally:
     1963                dlg.Destroy()
     1964       
     1965    def OnDataDelete(event):
     1966        UseList = data['Histograms']
     1967        keyList = UseList.keys()
     1968        keyList.sort()
     1969        DelList = []
     1970        if UseList:
     1971            DelList = []
     1972            dlg = wx.MultiChoiceDialog(self,
     1973                'Which histogram to delete from this phase?', 'Delete histogram',
     1974                keyList, wx.CHOICEDLG_STYLE)
     1975            try:
     1976                if dlg.ShowModal() == wx.ID_OK:
     1977                    result = dlg.GetSelections()
     1978                    for i in result: DelList.append(keyList[i])
     1979                    for i in DelList:
     1980                        del UseList[i]
     1981                    UpdateDData()
     1982            finally:
     1983                dlg.Destroy()
    14581984
    14591985    def FillPawleyReflectionsGrid():
    14601986        generalData = data['General']
    1461 
    14621987        print 'Pawley reflections'
    14631988
     
    14772002            FillAtomsGrid()
    14782003        elif text == 'General':
    1479             FillGeneralGrid()
     2004            UpdateGeneral()
    14802005            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     2006        elif text == 'Data':
     2007            self.dataFrame.SetMenuBar(self.dataFrame.DataMenu)
     2008            self.dataFrame.Bind(wx.EVT_MENU, OnPwdrAdd, id=G2gd.wxID_PWDRADD)
     2009            self.dataFrame.Bind(wx.EVT_MENU, OnHklfAdd, id=G2gd.wxID_HKLFADD)
     2010            self.dataFrame.Bind(wx.EVT_MENU, OnDataDelete, id=G2gd.wxID_DATADELETE)
     2011            UpdateDData()           
    14812012        elif text == 'Draw Options':
    14822013            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     
    14872018            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomStyle, id=G2gd.wxID_DRAWATOMSTYLE)
    14882019            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomLabel, id=G2gd.wxID_DRAWATOMLABEL)
     2020            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomColor, id=G2gd.wxID_DRAWATOMCOLOR)
     2021            self.dataFrame.Bind(wx.EVT_MENU, ResetAtomColors, id=G2gd.wxID_DRAWATOMRESETCOLOR)
    14892022            self.dataFrame.Bind(wx.EVT_MENU, SetViewPoint, id=G2gd.wxID_DRAWVIEWPOINT)
    14902023            self.dataFrame.Bind(wx.EVT_MENU, AddSymEquiv, id=G2gd.wxID_DRAWADDEQUIV)
     
    14982031            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
    14992032        event.Skip()
    1500 
    1501     if self.dataDisplay:
    1502         self.dataDisplay.Destroy()
    1503     PhaseName = self.PatternTree.GetItemText(item)
    1504     self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
    1505     self.dataFrame.SetLabel('Phase Data for '+PhaseName)
    1506     self.dataFrame.CreateStatusBar()
    1507     self.dataDisplay = G2gd.GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
    1508 
    1509     General = G2gd.GSGrid(self.dataDisplay)
    1510     FillGeneralGrid()
     2033       
     2034    General = wx.Window(self.dataDisplay)
    15112035    self.dataDisplay.AddPage(General,'General')
    1512 
     2036    SetupGeneral()
    15132037    GeneralData = data['General']
     2038    UpdateGeneral()
     2039
    15142040    if GeneralData['Type'] == 'Pawley':
    15152041        PawleyRefl = G2gd.GSGrid(self.dataDisplay)
    15162042        self.dataDisplay.AddPage(PawleyRefl,'Pawley reflections')
    15172043    else:
     2044        DData = wx.Window(self.dataDisplay)
     2045        self.dataDisplay.AddPage(DData,'Data')
    15182046        Atoms = G2gd.GSGrid(self.dataDisplay)
    15192047        self.dataDisplay.AddPage(Atoms,'Atoms')
  • trunk/GSASIIplot.py

    r161 r163  
    11221122def PlotStructure(self,data):
    11231123    generalData = data['General']
    1124     Myself = generalData['Myself']
     1124    Mydir = generalData['Mydir']
    11251125    atomData = data['Atoms']
    11261126    drawingData = data['Drawing']
     
    11391139    def OnKeyBox(event):
    11401140        import Image
    1141         Draw()
     1141        Draw()                          #make sure plot is fresh!!
    11421142        mode = cb.GetValue()
    1143         dirname = Myself.dirname
    1144         Fname = dirname+'\\'+generalData['Name']+'.'+mode
     1143        Fname = Mydir+'\\'+generalData['Name']+'.'+mode
    11451144        size = Page.canvas.GetSize()
    11461145        glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
     
    11531152        im.fromstring(Pix)
    11541153        im.save(Fname,mode)
    1155         cb.SetValue(' save as:')
    1156         Draw()
     1154        cb.SetValue(' Save as:')
     1155        self.G2plotNB.status.SetStatusText('Drawing saved to: '+Fname,1)
    11571156   
    11581157    def OnMouseDown(event):
     
    13141313        anglex,angley,anglez,oldxy = drawingData['Rotation']
    13151314        dxy = newxy-oldxy
    1316         anglez += dxy[0]+dxy[1]
     1315        anglez += (dxy[0]+dxy[1])*.25
    13171316        oldxy = newxy
    13181317        drawingData['Rotation'] = [anglex,angley,anglez,oldxy]
     
    14761475        glMatrixMode(GL_MODELVIEW)
    14771476        glLoadIdentity()
     1477        glRotate(anglez,0,0,1)
    14781478        glRotate(anglex,cosd(anglez),-sind(anglez),0)
    14791479        glRotate(angley,sind(anglez),cosd(anglez),0)
    1480         glRotate(anglez,0,0,1)
    14811480        glMultMatrixf(A4mat.T)
    14821481        glTranslate(-Tx,-Ty,-Tz)
     
    14931492            Bonds = atom[-1]
    14941493            atNum = generalData['AtomTypes'].index(atom[ct])
    1495             CL = list(generalData['Color'][atNum])
    1496             CL.extend([255,])
     1494            CL = atom[cs+2]
     1495#            CL = list(generalData['Color'][atNum])
     1496#            CL.extend([255,])
    14971497            color = np.array(CL)/255.
    14981498            if iat in Ind:
  • trunk/GSASIIspc.py

    r160 r163  
    518518    indx = GetNXUPQsym(siteSym)
    519519    return CSuinel[indx[1]]
     520   
     521def MustrainNames(SGData):
     522    laue = SGData['SGLaue']
     523    uniq = SGData['SGUniq']
     524    if laue in ['m3','m3m']:
     525        return ['S400','S220']
     526    elif laue in ['6/m','6/mmm','3m1']:
     527        return ['S400','S004','S202']
     528    elif laue in ['31m','3']:
     529        return ['S400','S004','S202','S211']
     530    elif laue in ['3R','3mR']:
     531        return ['S400','S220','S310','S211']
     532    elif laue in ['4/m','4/mmm']:
     533        return ['S400','S004','S220','S022']
     534    elif laue in ['mmm']:
     535        return ['S400','S040','S004','S220','S202','S022']
     536    elif laue in ['2/m']:
     537        SHKL = ['S400','S040','S004','S220','S202','S022']
     538        if uniq == 'a':
     539            SHKL += ['S013','S031','S211']
     540        elif uniq == 'b':
     541            SHKL += ['S301','S103','S121']
     542        elif uniq == 'c':
     543            SHKL += ['S130','S310','S112']
     544        return SHKL
     545    else:
     546        SHKL = ['S400','S040','S004','S220','S202','S022']
     547        SHKL += ['S310','S103','S031','S130','S301','S013']
     548        SHKL += ['S211','S121','S112']
     549        return SHKL
    520550       
    521551def SytSym(XYZ,SGData):
Note: See TracChangeset for help on using the changeset viewer.