Ignore:
Timestamp:
Jan 21, 2013 10:59:15 AM (9 years ago)
Author:
vondreele
Message:

finish restraint rigid body input & display

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r835 r836  
    629629           
    630630    Indx = {}
    631     plotDefaults = {'oldxy':[0.,0.],'Quaternion':[1.,0.,0.,0.],'cameraPos':20.,'viewDir':[0,0,1],}
     631    plotDefaults = {'oldxy':[0.,0.],'Quaternion':[1.,0.,0.,0.],'cameraPos':30.,'viewDir':[0,0,1],}
    632632
    633633    def OnPageChanged(event):
     
    703703        while macStr:
    704704            items = macStr.split()
    705             print items
    706705            if 'I' == items[0]:
    707706                rbId = ran.randint(0,sys.maxint)
     
    715714                    macStr = macro.readline().split()
    716715                    atName = macStr[0]
     716                    atType = macStr[1]
    717717                    atNames.append(atName)
    718                     rbXYZ.append([float(macStr[i]) for i in [1,2,3]])
    719                     atNames.append(atName[0])          #might not always work
    720                     if atName[0] not in AtInfo:
    721                         Info = G2elem.GetAtomInfo(atName[0])
    722                         AtInfo[atName[0]] = [Info['Drad'],Info['Color']]
     718                    rbXYZ.append([float(macStr[i]) for i in [2,3,4]])
     719                    rbTypes.append(atType)
     720                    if atType not in AtInfo:
     721                        Info = G2elem.GetAtomInfo(atType)
     722                        AtInfo[atType] = [Info['Drad'],Info['Color']]
    723723                rbXYZ = np.array(rbXYZ)-np.array(rbXYZ[nOrig-1])
    724724                for iSeq in range(nSeq):
     
    730730                        iBeg = int(macStr[0])-1
    731731                        iFin = int(macStr[1])-1
     732                        angle = 0.0
    732733                        nMove = int(macStr[2])
    733                         iMove = [int(macStr[i]) for i in range(3,nMove+3)]
    734                         rbseq.append([iBeg,iFin,iMove])
     734                        iMove = [int(macStr[i])-1 for i in range(3,nMove+3)]
     735                        rbseq.append([iBeg,iFin,angle,iMove])
    735736                    rbSeq.append(rbseq)
    736737                data['Residue'][rbId] = {'RBname':rbName,'rbXYZ':rbXYZ,'rbTypes':rbTypes,
    737                     'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1],'rbSeq':rbSeq}
     738                    'atNames':atNames,'rbRef':[nOrig-1,mRef-1,nRef-1],'rbSeq':rbSeq,'SelSeq':[0,0,0]}
     739                print 'Residue '+rbName+' added'
    738740            macStr = macro.readline()
    739741        macro.close()
     742        UpdateResidueRB()
    740743       
    741744    def AddZMatrixRB():
     
    868871                for col in [4,5,6]:
    869872                    vecGrid.SetCellStyle(row,col,VERY_LIGHT_GREY,True)
     873            vecGrid.SetMargins(0,0)
     874            vecGrid.AutoSizeColumns(False)
    870875            vecSizer.Add(vecGrid)
    871876            return vecSizer
     
    895900       
    896901    def UpdateResidueRB():
     902        AtInfo = data['Residue']['AtInfo']
     903        Indx = {}
     904
     905        def rbNameSizer(rbId,rbData):
     906
     907            def OnRBName(event):
     908                Obj = event.GetEventObject()
     909                rbId = Indx[Obj.GetId()]
     910                rbData['RBname'] = Obj.GetValue()
     911               
     912            def OnDelRB(event):
     913                Obj = event.GetEventObject()
     914                rbId = Indx[Obj.GetId()]
     915                del data['Residue'][rbId]
     916                wx.CallAfter(UpdateResidueRB)
     917               
     918            def OnPlotRB(event):
     919                Obj = event.GetEventObject()
     920                rbId = Indx[Obj.GetId()]
     921                Obj.SetValue(False)
     922                G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
     923           
     924            nameSizer = wx.BoxSizer(wx.HORIZONTAL)
     925            nameSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Residue name: '),
     926                0,wx.ALIGN_CENTER_VERTICAL)
     927            RBname = wx.TextCtrl(ResidueRBDisplay,-1,rbData['RBname'])
     928            Indx[RBname.GetId()] = rbId
     929            RBname.Bind(wx.EVT_TEXT_ENTER,OnRBName)
     930            RBname.Bind(wx.EVT_KILL_FOCUS,OnRBName)
     931            nameSizer.Add(RBname,0,wx.ALIGN_CENTER_VERTICAL)
     932            nameSizer.Add((5,0),)
     933            plotRB = wx.CheckBox(ResidueRBDisplay,-1,'Plot?')
     934            Indx[plotRB.GetId()] = rbId
     935            plotRB.Bind(wx.EVT_CHECKBOX,OnPlotRB)
     936            nameSizer.Add(plotRB,0,wx.ALIGN_CENTER_VERTICAL)
     937            nameSizer.Add((5,0),)
     938            delRB = wx.CheckBox(ResidueRBDisplay,-1,'Delete?')
     939            Indx[delRB.GetId()] = rbId
     940            delRB.Bind(wx.EVT_CHECKBOX,OnDelRB)
     941            nameSizer.Add(delRB,0,wx.ALIGN_CENTER_VERTICAL)
     942            return nameSizer
     943           
     944        def rbResidues(rbId,XYZ,rbData):
     945           
     946            def TypeSelect(event):
     947                AtInfo = data['Residue']['AtInfo']
     948                r,c = event.GetRow(),event.GetCol()
     949                if vecGrid.GetColLabelValue(c) == 'Type':
     950                    PE = G2elemGUI.PickElement(G2frame,oneOnly=True)
     951                    if PE.ShowModal() == wx.ID_OK:
     952                        if PE.Elem != 'None':
     953                            El = PE.Elem.strip().lower().capitalize()
     954                            if El not in AtInfo:
     955                                Info = G2elem.GetAtomInfo(El)
     956                                AtInfo[El] = [Info['Drad']['Color']]
     957                            rbData['rbTypes'][r] = El
     958                            vecGrid.SetCellValue(r,c,El)
     959                    PE.Destroy()
     960
     961            def ChangeCell(event):
     962                r,c =  event.GetRow(),event.GetCol()
     963                if r >= 0 and (0 <= c < 3):
     964                    try:
     965                        val = float(vecGrid.GetCellValue(r,c))
     966                        rbData['rbVect'][imag][r][c] = val
     967                    except ValueError:
     968                        pass
     969
     970            vecSizer = wx.BoxSizer()
     971            Types = 2*[wg.GRID_VALUE_STRING,]+3*[wg.GRID_VALUE_FLOAT+':10,5',]
     972            colLabels = ['Name','Type','Cart x','Cart y','Cart z']
     973            table = []
     974            rowLabels = []
     975            for ivec,xyz in enumerate(rbData['rbXYZ']):
     976                table.append([rbData['atNames'][ivec],]+[rbData['rbTypes'][ivec],]+list(xyz))
     977                rowLabels.append(str(ivec))
     978            vecTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
     979            vecGrid = G2gd.GSGrid(ResidueRBDisplay)
     980            vecGrid.SetTable(vecTable, True)
     981            vecGrid.Bind(wg.EVT_GRID_CELL_CHANGE, ChangeCell)
     982            vecGrid.Bind(wg.EVT_GRID_CELL_LEFT_DCLICK, TypeSelect)
     983            attr = wx.grid.GridCellAttr()
     984            attr.SetEditor(G2phG.GridFractionEditor(vecGrid))
     985            for c in range(3):
     986                vecGrid.SetColAttr(c, attr)
     987            for row in range(vecTable.GetNumberRows()):
     988                for col in [4,5,6]:
     989                    vecGrid.SetCellStyle(row,col,VERY_LIGHT_GREY,True)
     990            vecGrid.SetMargins(0,0)
     991            vecGrid.AutoSizeColumns(False)
     992            vecSizer.Add(vecGrid)
     993            return vecSizer
     994           
     995        def SeqSizer(angSlide,rbId,iSeq,Seq,atNames):
     996           
     997            def ChangeAngle(event):
     998                Obj = event.GetEventObject()
     999                rbId,iSeq,iseq,Seq = Indx[Obj.GetId()]
     1000                val = Seq[iseq][2]
     1001                try:
     1002                    val = float(Obj.GetValue())
     1003                    Seq[iseq][2] = val
     1004                except ValueError:
     1005                    pass
     1006                Obj.SetValue('%8.2f'%(val))
     1007                G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,data['Residue'][rbId],plotDefaults)
     1008               
     1009            def OnRadBtn(event):
     1010                Obj = event.GetEventObject()
     1011                isel,Seq,iSeq,ang = Indx[Obj.GetId()]
     1012                data['Residue'][rbId]['SelSeq'] = [iSeq,isel,ang]
     1013                angSlide.SetValue(int(100*Seq[isel][2]))
     1014           
     1015            seqSizer = wx.FlexGridSizer(0,4,2,2)
     1016            seqSizer.AddGrowableCol(3,0)
     1017            for isel,sel in enumerate(Seq):
     1018                iBeg,iFin,angle,iMove = sel
     1019                ang = wx.TextCtrl(ResidueRBDisplay,-1,'%8.2f'%(angle),size=(50,20))
     1020                if not iSeq:
     1021                    radBt = wx.RadioButton(ResidueRBDisplay,-1,'',style=wx.RB_GROUP)
     1022                    data['Residue'][rbId]['SelSeq'] = [iSeq,isel,ang]
     1023                else:
     1024                    radBt = wx.RadioButton(ResidueRBDisplay,-1,'')
     1025                radBt.Bind(wx.EVT_RADIOBUTTON,OnRadBtn)                   
     1026                seqSizer.Add(radBt)
     1027                bond = wx.TextCtrl(ResidueRBDisplay,-1,'%s %s'%(atNames[iBeg],atNames[iFin]),size=(50,20))
     1028                seqSizer.Add(bond,0,wx.ALIGN_CENTER_VERTICAL)
     1029                Indx[radBt.GetId()] = [isel,Seq,iSeq,ang]
     1030                Indx[ang.GetId()] = [rbId,iSeq,isel,Seq]
     1031                ang.Bind(wx.EVT_TEXT_ENTER,ChangeAngle)
     1032                ang.Bind(wx.EVT_KILL_FOCUS,ChangeAngle)
     1033                seqSizer.Add(ang,0,wx.ALIGN_CENTER_VERTICAL)
     1034                atms = ''
     1035                for i in iMove:   
     1036                    atms += ' %s,'%(atNames[i])
     1037                moves = wx.TextCtrl(ResidueRBDisplay,-1,atms[:-1],size=(200,20))
     1038                seqSizer.Add(moves,1,wx.ALIGN_CENTER_VERTICAL|wx.EXPAND|wx.RIGHT)
     1039            return seqSizer
     1040           
     1041        def SlideSizer():
     1042           
     1043            def OnSlider(event):
     1044                Obj = event.GetEventObject()
     1045                rbData = Indx[Obj.GetId()]
     1046                iSeq,isel,ang = rbData['SelSeq']
     1047                val = float(Obj.GetValue())/100.
     1048                rbData['rbSeq'][iSeq][isel][2] = val
     1049                ang.SetValue('%8.2f'%(val))
     1050                G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
     1051           
     1052            slideSizer = wx.BoxSizer(wx.HORIZONTAL)
     1053            slideSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Selected torsion angle:'),0)
     1054            iSeq,isel,ang = rbData['SelSeq']
     1055            angSlide = wx.Slider(ResidueRBDisplay,-1,
     1056                int(100*rbData['rbSeq'][iSeq][isel][2]),0,36000,size=(200,20),
     1057                style=wx.SL_HORIZONTAL)
     1058            angSlide.Bind(wx.EVT_SLIDER, OnSlider)
     1059            Indx[angSlide.GetId()] = rbData
     1060            slideSizer.Add(angSlide,0)           
     1061            return slideSizer,angSlide           
     1062           
    8971063        ResidueRB.DestroyChildren()
    8981064        ResidueRBDisplay = wx.Panel(ResidueRB)
    8991065        ResidueRBSizer = wx.BoxSizer(wx.VERTICAL)
    900         ResidueRBSizer.Add((5,5),0)       
    901 #        VectorRBSizer.Add(ConstSizer('Phase',PhaseDisplay))
     1066        rbKeys = data['Residue'].keys()
     1067        rbKeys.remove('AtInfo')
     1068        rbNames = [data['Residue'][k]['RBname'] for k in rbKeys]
     1069        rbIds = dict(zip(rbNames,rbKeys))
     1070        rbNames.sort()
     1071        for name in rbNames:
     1072            rbId = rbIds[name]
     1073            rbData = data['Residue'][rbId]
     1074            ResidueRBSizer.Add(rbNameSizer(rbId,rbData),0)
     1075            XYZ = np.array([[0.,0.,0.] for Ty in rbData['rbTypes']])
     1076            ResidueRBSizer.Add(rbResidues(rbId,XYZ,rbData),0)
     1077            ResidueRBSizer.Add((5,5),0)
     1078            slideSizer,angSlide = SlideSizer()
     1079            for iSeq,Seq in enumerate(rbData['rbSeq']):
     1080                ResidueRBSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Seq: %d'%(iSeq)),
     1081                    0,wx.ALIGN_CENTER_VERTICAL)
     1082                ResidueRBSizer.Add(wx.StaticText(ResidueRBDisplay,-1,
     1083                    'Sel  Bond             Angle      Riding atoms'),
     1084                    0,wx.ALIGN_CENTER_VERTICAL)                       
     1085                ResidueRBSizer.Add(SeqSizer(angSlide,rbId,iSeq,Seq,rbData['atNames']))
     1086            ResidueRBSizer.Add(slideSizer,)
     1087        ResidueRBSizer.Add((5,25),)
    9021088        ResidueRBSizer.Layout()   
    9031089        ResidueRBDisplay.SetSizer(ResidueRBSizer,True)
     
    9071093        ResidueRBDisplay.SetSize(Size)
    9081094        ResidueRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
    909 #        Size[1] = min(Size[1],250)
    9101095        G2frame.dataFrame.setSizePosLeft(Size)
    9111096       
Note: See TracChangeset for help on using the changeset viewer.