Changeset 852


Ignore:
Timestamp:
Feb 18, 2013 10:49:45 AM (9 years ago)
Author:
vondreele
Message:

rigid body changes

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r851 r852  
    711711            ImportResidueRB()
    712712           
    713     def OnNewOrigin(event): #only for Residue RBs
    714         for res in resList:
    715             if res.IsSelection():
    716                 rbId = Indx[res.GetId()]
    717                 ind = res.GetSelectedRows()[0]
    718                 if data['Residue'][rbId]['useCount'] or data['Residue'][rbId]['rbSeq']:
    719                     return
    720                 rbXYZ = data['Residue'][rbId]['rbXYZ']
    721                 rbXYZ -= rbXYZ[ind]
    722                 data['Residue'][rbId]['rbRef'][0] = ind
    723                 res.ClearSelection()
    724                 resTable = res.GetTable()
    725                 for r in range(res.GetNumberRows()):
    726                     row = resTable.GetRowValues(r)
    727                     row[2:4] = rbXYZ[r]
    728                     resTable.SetRowValues(r,row)
    729                 res.ForceRefresh()
    730                        
    731     def OnNewRefAtoms(event):
    732         for res in resList:
    733             if res.IsSelection():
    734                 rbId = Indx[res.GetId()]
    735                 if data['Residue'][rbId]['useCount']:
    736                     return
    737                 rbRef = data['Residue'][rbId]['rbRef']
    738                 rbSeq = data['Residue'][rbId]['rbSeq']
    739                 atNames = data['Residue'][rbId]['atNames']
    740                 choices = [atNames[rbRef[1]],atNames[rbRef[2]]]
    741                 names = []
    742                 for i,name in enumerate(atNames):
    743                     ok = True
    744                     for seq in rbSeq:   #remove atom in flexible side chains
    745                         if i in seq[3]:
    746                             ok = False
    747                     if i == rbRef[0]:   #remove origin choice
    748                         ok = False
    749                     if ok:
    750                         names.append(atNames[i])
    751                 dlg = G2gd.PickTwoDialog(G2frame.dataDisplay,'Select reference atoms',
    752                     'Pick 2 atoms non-colinear with origin atom',names,choices)
    753                 if dlg.ShowModal() == wx.ID_OK:
    754                     sel = dlg.GetSelection()
    755                     rbRef[1:] = [atNames.index(sel[0]),atNames.index(sel[1])]
    756                 dlg.Destroy()
    757                        
    758713    def AddVectorRB():
    759714        AtInfo = data['Vector']['AtInfo']
     
    813768                        rbSeq.append([iBeg,iFin,angle,iMove])
    814769                data['Residue'][rbId] = {'RBname':rbName,'rbXYZ':rbXYZ,'rbTypes':rbTypes,
    815                     'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1],'rbSeq':rbSeq,
     770                    'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1,True],'rbSeq':rbSeq,
    816771                    'SelSeq':[0,0],'useCount':0}
    817772                print 'Rigid body '+rbName+' added'
     
    874829        rbXYZ = np.array(rbXYZ)-np.array(rbXYZ[0])
    875830        data['Residue'][rbId] = {'RBname':'UNKRB','rbXYZ':rbXYZ,'rbTypes':rbTypes,
    876             'atNames':atNames,'rbRef':[0,1,2],'rbSeq':[],'SelSeq':[0,0],'useCount':0}
     831            'atNames':atNames,'rbRef':[0,1,2,False],'rbSeq':[],'SelSeq':[0,0],'useCount':0}
    877832        print 'Rigid body UNKRB added'
    878833        text.close()
     
    961916       
    962917
    963     def UpdateVectorRB():
     918    def UpdateVectorRB(Scroll=0):
    964919        AtInfo = data['Vector']['AtInfo']
     920        refChoice = {}
    965921        SetStatusLine(' You may use e.g. "sind(60)", "cos(60)", "c60" or "s60" for a vector entry')
    966922        def rbNameSizer(rbId,rbData):
     
    1004960            return nameSizer
    1005961           
     962        def rbRefAtmSizer(rbId,rbData):
     963           
     964            def OnRefSel(event):
     965                Obj = event.GetEventObject()
     966                iref = Indx[Obj.GetId()]
     967                sel = Obj.GetValue()
     968                rbData['rbRef'][iref] = atNames.index(sel)
     969           
     970            refAtmSizer = wx.BoxSizer(wx.HORIZONTAL)
     971            atNames = [name+str(i) for i,name in enumerate(rbData['rbTypes'])]
     972            rbRef = rbData.get('rbRef',[0,1,2,False])
     973            rbData['rbRef'] = rbRef
     974            if rbData['useCount']:
     975                refAtmSizer.Add(wx.StaticText(VectorRBDisplay,-1,
     976                    'Orientation reference atoms A-B-C: %s, %s, %s'%(atNames[rbRef[0]], \
     977                     atNames[rbRef[1]],atNames[rbRef[2]])),0)
     978            else:
     979                refAtmSizer.Add(wx.StaticText(VectorRBDisplay,-1,
     980                    'Orientation reference atoms A-B-C: '),0,wx.ALIGN_CENTER_VERTICAL)
     981                for i in range(3):
     982                    choices = [atNames[j] for j in refChoice[rbId][i]]
     983                    refSel = wx.ComboBox(VectorRBDisplay,-1,value='',
     984                        choices=choices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     985                    refSel.SetValue(atNames[rbRef[i]])
     986                    refSel.Bind(wx.EVT_COMBOBOX, OnRefSel)
     987                    Indx[refSel.GetId()] = i
     988                    refAtmSizer.Add(refSel,0,wx.ALIGN_CENTER_VERTICAL)
     989            return refAtmSizer
     990                       
    1006991        def rbVectMag(rbId,imag,rbData):
    1007992           
     
    10171002                    pass
    10181003                Obj.SetValue('%8.3f'%(val))
    1019                 UpdateVectorRB()
     1004                wx.CallAfter(UpdateVectorRB,VectorRB.GetScrollPos(wx.VERTICAL))
    10201005                G2plt.PlotRigidBody(G2frame,'Vector',AtInfo,data['Vector'][rbId],plotDefaults)
    10211006               
     
    10571042                            vecGrid.SetCellValue(r,c,El)
    10581043                    PE.Destroy()
    1059                 wx.CallAfter(UpdateVectorRB)
     1044                wx.CallAfter(UpdateVectorRB,VectorRB.GetScrollPos(wx.VERTICAL))
    10601045
    10611046            def ChangeCell(event):
     
    10671052                    except ValueError:
    10681053                        pass
    1069                 wx.CallAfter(UpdateVectorRB)
     1054                G2plt.PlotRigidBody(G2frame,'Vector',AtInfo,data['Vector'][rbId],plotDefaults)
     1055                wx.CallAfter(UpdateVectorRB,VectorRB.GetScrollPos(wx.VERTICAL))
    10701056
    10711057            vecSizer = wx.BoxSizer()
     
    10971083            return vecSizer
    10981084       
     1085        def FillRefChoice(rbId,rbData):
     1086            choiceIds = [i for i in range(len(rbData['rbTypes']))]
     1087           
     1088            rbRef = rbData.get('rbRef',[0,1,2,False])
     1089            for i in range(3):
     1090                choiceIds.remove(rbRef[i])
     1091            refChoice[rbId] = [choiceIds[:],choiceIds[:],choiceIds[:]]
     1092            for i in range(3):
     1093                refChoice[rbId][i].append(rbRef[i])
     1094                refChoice[rbId][i].sort()     
     1095           
    10991096        VectorRB.DestroyChildren()
    11001097        VectorRBDisplay = wx.Panel(VectorRB)
     
    11031100            if rbId != 'AtInfo':
    11041101                rbData = data['Vector'][rbId]
     1102                FillRefChoice(rbId,rbData)
    11051103                VectorRBSizer.Add(rbNameSizer(rbId,rbData),0)
     1104                VectorRBSizer.Add(rbRefAtmSizer(rbId,rbData),0)
    11061105                XYZ = np.array([[0.,0.,0.] for Ty in rbData['rbTypes']])
    11071106                for imag,mag in enumerate(rbData['VectMag']):
     
    11181117        VectorRBDisplay.SetSize(Size)
    11191118        VectorRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
     1119        VectorRB.SetScrollPos(wx.VERTICAL,Scroll)
    11201120        Size[1] = min(Size[1],450)
    11211121        G2frame.dataFrame.setSizePosLeft(Size)
     
    11231123    def UpdateResidueRB():
    11241124        AtInfo = data['Residue']['AtInfo']
     1125        refChoice = {}
    11251126
    11261127        def rbNameSizer(rbId,rbData):
     
    11641165            return nameSizer
    11651166           
    1166         def rbResidues(rbId,XYZ,rbData):
     1167        def rbResidues(rbId,rbData):
    11671168           
    11681169            def TypeSelect(event):
     
    11971198                    vecGrid.SelectRow(r,True)
    11981199
    1199             vecSizer = wx.BoxSizer()
     1200            def OnRefSel(event):
     1201                Obj = event.GetEventObject()
     1202                iref,res = Indx[Obj.GetId()]
     1203                sel = Obj.GetValue()
     1204                ind = atNames.index(sel)
     1205                rbData['rbRef'][iref] = ind
     1206                if not iref:     #origin change
     1207                    rbXYZ = rbData['rbXYZ']
     1208                    rbXYZ -= rbXYZ[ind]
     1209                    res.ClearSelection()
     1210                    resTable = res.GetTable()
     1211                    for r in range(res.GetNumberRows()):
     1212                        row = resTable.GetRowValues(r)
     1213                        row[2:4] = rbXYZ[r]
     1214                        resTable.SetRowValues(r,row)
     1215                    res.ForceRefresh()
     1216                    G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
     1217               
    12001218            Types = 2*[wg.GRID_VALUE_STRING,]+3*[wg.GRID_VALUE_FLOAT+':10,5',]
    12011219            colLabels = ['Name','Type','Cart x','Cart y','Cart z']
     
    12221240            vecGrid.SetMargins(0,0)
    12231241            vecGrid.AutoSizeColumns(False)
     1242            vecSizer = wx.BoxSizer()
    12241243            vecSizer.Add(vecGrid)
    1225             return vecSizer
     1244           
     1245            refAtmSizer = wx.BoxSizer(wx.HORIZONTAL)
     1246            atNames = rbData['atNames']
     1247            rbRef = rbData['rbRef']
     1248            if rbData['rbRef'][3] or rbData['useCount']:
     1249                refAtmSizer.Add(wx.StaticText(ResidueRBDisplay,-1,
     1250                    'Orientation reference atoms A-B-C: %s, %s, %s'%(atNames[rbRef[0]], \
     1251                     atNames[rbRef[1]],atNames[rbRef[2]])),0)
     1252            else:
     1253                refAtmSizer.Add(wx.StaticText(ResidueRBDisplay,-1,
     1254                    'Orientation reference atoms A-B-C: '),0,wx.ALIGN_CENTER_VERTICAL)
     1255                for i in range(3):
     1256                    choices = [atNames[j] for j in refChoice[rbId][i]]
     1257                    refSel = wx.ComboBox(ResidueRBDisplay,-1,value='',
     1258                        choices=choices,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1259                    refSel.SetValue(atNames[rbRef[i]])
     1260                    refSel.Bind(wx.EVT_COMBOBOX, OnRefSel)
     1261                    Indx[refSel.GetId()] = [i,vecGrid]
     1262                    refAtmSizer.Add(refSel,0,wx.ALIGN_CENTER_VERTICAL)
     1263           
     1264            mainSizer = wx.BoxSizer(wx.VERTICAL)
     1265            mainSizer.Add(refAtmSizer)
     1266            mainSizer.Add(vecSizer)
     1267            return mainSizer
    12261268           
    12271269        def SeqSizer(angSlide,rbId,iSeq,Seq,atNames):
     
    12591301            seqSizer.Add(bond,0,wx.ALIGN_CENTER_VERTICAL)
    12601302            Indx[radBt.GetId()] = [Seq,iSeq,ang.GetId()]
    1261             Indx[ang.GetId()] = [rbId,Seq,ang]
     1303            Indx[ang.GetId()] = [rbId,Seq]
    12621304            ang.Bind(wx.EVT_TEXT_ENTER,ChangeAngle)
    12631305            ang.Bind(wx.EVT_KILL_FOCUS,ChangeAngle)
     
    12901332            Indx[angSlide.GetId()] = rbData
    12911333            slideSizer.Add(angSlide,0)           
    1292             return slideSizer,angSlide           
     1334            return slideSizer,angSlide
     1335           
     1336        def FillRefChoice(rbId,rbData):
     1337            choiceIds = [i for i in range(len(rbData['atNames']))]
     1338            for seq in rbData['rbSeq']:
     1339                for i in seq[3]:
     1340                    choiceIds.remove(i)
     1341            rbRef = rbData['rbRef']
     1342            for i in range(3):
     1343                choiceIds.remove(rbRef[i])
     1344            refChoice[rbId] = [choiceIds[:],choiceIds[:],choiceIds[:]]
     1345            for i in range(3):
     1346                refChoice[rbId][i].append(rbRef[i])
     1347                refChoice[rbId][i].sort()     
    12931348           
    12941349        ResidueRB.DestroyChildren()
     
    13031358            rbId = rbIds[name]
    13041359            rbData = data['Residue'][rbId]
     1360            FillRefChoice(rbId,rbData)
    13051361            ResidueRBSizer.Add(rbNameSizer(rbId,rbData),0)
    1306             XYZ = np.array([[0.,0.,0.] for Ty in rbData['rbTypes']])
    1307             ResidueRBSizer.Add(rbResidues(rbId,XYZ,rbData),0)
     1362            ResidueRBSizer.Add(rbResidues(rbId,rbData),0)
    13081363            ResidueRBSizer.Add((5,5),0)
    13091364            if rbData['rbSeq']:
     
    13241379        Size = ResidueRBSizer.GetMinSize()
    13251380        Size[0] += 40
    1326         Size[1] = max(Size[1],250) + 20
     1381        Size[1] = max(Size[1],450) + 20
    13271382        ResidueRBDisplay.SetSize(Size)
    13281383        ResidueRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
     
    13441399    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddRigidBody, id=G2gd.wxID_RIGIDBODYADD)   
    13451400    G2frame.dataFrame.Bind(wx.EVT_MENU, OnImportRigidBody, id=G2gd.wxID_RIGIDBODYIMPORT)
    1346     G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewOrigin, id=G2gd.wxID_RBNEWORIGIN)
    1347     G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewRefAtoms, id=G2gd.wxID_RBREFATMS)
    13481401    G2frame.dataFrame.Bind(wx.EVT_MENU, OnDefineTorsSeq, id=G2gd.wxID_RESIDUETORSSEQ)
    13491402    G2frame.dataDisplay = G2gd.GSNoteBook(parent=G2frame.dataFrame,size=G2frame.dataFrame.GetClientSize())
  • trunk/GSASIIgrid.py

    r851 r852  
    113113[ wxID_RIGIDBODYADD,wxID_DRAWDEFINERB,wxID_RIGIDBODYIMPORT,wxID_RESIDUETORSSEQ,
    114114    wxID_AUTOFINDRESRB,wxID_GLOBALRESREFINE,wxID_RBREMOVEALL,
    115     wxID_RBNEWORIGIN,wxID_RBREFATMS
    116 ] = [wx.NewId() for item in range(9)]
     115] = [wx.NewId() for item in range(7)]
    117116
    118117[ wxID_SAVESEQSEL,
     
    840839        self.VectorRBEdit = wx.Menu(title='')
    841840        self.VectorRBEdit.Append(id=wxID_RIGIDBODYADD, kind=wx.ITEM_NORMAL,text='Add rigid body',
    842             help='Add rigid body')
     841            help='Add vector rigid body')
    843842        self.ResidueRBMenu = wx.Menu(title='')
    844         self.ResidueRBMenu.Append(id=wxID_RIGIDBODYADD, kind=wx.ITEM_NORMAL,text='Import rigid bodies',
    845             help='Import residue rigid bodies from macro file')
    846         self.ResidueRBMenu.Append(id=wxID_RIGIDBODYIMPORT, kind=wx.ITEM_NORMAL,text='Import XYZ from txt file',
    847             help='Import rigid body XYZ from txt file')
    848         self.ResidueRBMenu.Append(id=wxID_RBNEWORIGIN, kind=wx.ITEM_NORMAL,text='Set origin',
    849             help='Select atom to be origin in RB to be edited')
    850         self.ResidueRBMenu.Append(id=wxID_RBREFATMS, kind=wx.ITEM_NORMAL,text='Set reference atoms',
    851             help='Select any atom in RB to be edited')
     843        self.ResidueRBMenu.Append(id=wxID_RIGIDBODYIMPORT, kind=wx.ITEM_NORMAL,text='Import XYZ',
     844            help='Import rigid body XYZ from file')
    852845        self.ResidueRBMenu.Append(id=wxID_RESIDUETORSSEQ, kind=wx.ITEM_NORMAL,text='Define sequence',
    853846            help='Define torsion sequence')
     847        self.ResidueRBMenu.Append(id=wxID_RIGIDBODYADD, kind=wx.ITEM_NORMAL,text='Import residues',
     848            help='Import residue rigid bodies from macro file')
    854849           
    855850        self.RigidBodyMenu = wx.MenuBar()
Note: See TracChangeset for help on using the changeset viewer.