Changeset 4608


Ignore:
Timestamp:
Oct 19, 2020 5:09:16 PM (3 years ago)
Author:
vondreele
Message:

split VectorRB listings up into separate views for each RB in both Rigid Bodies & RB Models displays.
Various bug fixes for Vector RBs

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r4606 r4608  
    15821582    UseList = newPhase['Histograms']
    15831583    detTrans = np.abs(nl.det(Trans))
    1584     invTrans = nl.inv(Trans)
    15851584    opId = oldPhase['pId']
    15861585    npId = newPhase['pId']
    15871586    cx,ct,cs,cia = newPhase['General']['AtomPtrs']
    15881587    nAtoms = newPhase['Atoms']
    1589     oSGData = oldPhase['General']['SGData']
    15901588    nSGData = newPhase['General']['SGData']
    15911589    #oAcof = G2lat.cell2A(oldPhase['General']['Cell'][1:7])
     
    16711669    # constraints on lattice parameters between phases
    16721670#    T = nl.inv(Trans).T
    1673     T = Trans.T
    1674     conMat = [
    1675         [T[0,0]**2,T[0,1]**2,T[0,2]**2,T[0,0]*T[0,1],T[0,0]*T[0,2],T[0,1]*T[0,2]],
    1676         [T[1,0]**2,T[1,1]**2,T[1,2]**2,T[1,0]*T[1,1],T[1,0]*T[1,2],T[1,1]*T[1,2]],
    1677         [T[2,0]**2,T[2,1]**2,T[2,2]**2,T[2,0]*T[2,1],T[2,0]*T[2,2],T[2,1]*T[2,2]],
    1678         [2.*T[0,0]*T[1,0],2.*T[0,1]*T[1,1],2.*T[0,2]*T[1,2],T[0,0]*T[1,1]+T[0,1]*T[1,0],T[0,0]*T[1,2]+T[0,2]*T[1,0],T[0,1]*T[1,2]+T[0,2]*T[1,1]],
    1679         [2.*T[0,0]*T[2,0],2.*T[0,1]*T[2,1],2.*T[0,2]*T[2,2],T[0,0]*T[2,1]+T[0,1]*T[2,0],T[0,0]*T[2,2]+T[0,2]*T[2,0],T[0,1]*T[2,2]+T[0,2]*T[2,1]],
    1680         [2.*T[1,0]*T[2,0],2.*T[1,1]*T[2,1],2.*T[1,2]*T[2,2],T[1,0]*T[2,1]+T[1,1]*T[2,0],T[1,0]*T[2,2]+T[1,2]*T[2,0],T[1,1]*T[2,2]+T[1,2]*T[2,1]]
    1681         ]
     1671    # T = Trans.T
     1672    # conMat = [
     1673    #     [T[0,0]**2,T[0,1]**2,T[0,2]**2,T[0,0]*T[0,1],T[0,0]*T[0,2],T[0,1]*T[0,2]],
     1674    #     [T[1,0]**2,T[1,1]**2,T[1,2]**2,T[1,0]*T[1,1],T[1,0]*T[1,2],T[1,1]*T[1,2]],
     1675    #     [T[2,0]**2,T[2,1]**2,T[2,2]**2,T[2,0]*T[2,1],T[2,0]*T[2,2],T[2,1]*T[2,2]],
     1676    #     [2.*T[0,0]*T[1,0],2.*T[0,1]*T[1,1],2.*T[0,2]*T[1,2],T[0,0]*T[1,1]+T[0,1]*T[1,0],T[0,0]*T[1,2]+T[0,2]*T[1,0],T[0,1]*T[1,2]+T[0,2]*T[1,1]],
     1677    #     [2.*T[0,0]*T[2,0],2.*T[0,1]*T[2,1],2.*T[0,2]*T[2,2],T[0,0]*T[2,1]+T[0,1]*T[2,0],T[0,0]*T[2,2]+T[0,2]*T[2,0],T[0,1]*T[2,2]+T[0,2]*T[2,1]],
     1678    #     [2.*T[1,0]*T[2,0],2.*T[1,1]*T[2,1],2.*T[1,2]*T[2,2],T[1,0]*T[2,1]+T[1,1]*T[2,0],T[1,0]*T[2,2]+T[1,2]*T[2,0],T[1,1]*T[2,2]+T[1,2]*T[2,1]]
     1679    #     ]
    16821680    # Gnew = conMat * A:
    16831681#         T00**2*a0  T01**2*a1 T02**2*a2 T00*T01*a3    T00*T02*a4    T01*T02*a5
     
    20402038                            generalData['Isotope'][atom[ct]] = isotope
    20412039                    generalData['Color'].append(Info['Color'])
    2042                     if generalData['Type'] == 'magnetic':
    2043                         if len(landeg) < len(generalData['AtomTypes']):
    2044                             landeg.append(2.0)
     2040                    # if generalData['Type'] == 'magnetic':
     2041                    #     if len(landeg) < len(generalData['AtomTypes']):
     2042                    #         landeg.append(2.0)
    20452043            atmData['Drawing']['Atoms'] = []
    20462044            for atom in atmData['Atoms']:
     
    23112309                if obj.ExportSelect():    # set export parameters; ask for file name
    23122310                    return
    2313                 fp = obj.OpenFile()
     2311                obj.OpenFile()
    23142312                obj.Write(str(count))
    23152313                obj.Write('')
     
    23382336                data['Vector'][rbid] = rb
    23392337                data['RBIds']['Vector'].append(rbid)
    2340                 AtInfo = data['Vector']['AtInfo']
    23412338                for t in rb['rbTypes']:
    23422339                    if t in data['Vector']['AtInfo']: continue
     
    23702367                    'rbSeq':[],'SelSeq':[0,0],'useCount':0}
    23712368                data['RBIds']['Residue'].append(rbid)
    2372                 AtInfo = data['Residue']['AtInfo']
    23732369                for t in rbTypes:
    23742370                    if t in data['Residue']['AtInfo']: continue
     
    23862382            G2frame.rbBook.AddPage(RBImp,pagename)
    23872383            G2frame.rbBook.SetSelection(G2frame.rbBook.FindPage(pagename))
    2388             generalData = rd.Phase['General']
    23892384            AtInfo = {}
    2390             ct = 1
    23912385            for t in rd.Phase['RBtypes']:
    23922386                if t in AtInfo: continue
     
    25122506            export and for plotting
    25132507            '''
    2514             nTrans = 1
    25152508            vecMag = [1.0]
    25162509            vecRef = [False]
     
    25672560        filename = filelist[0]
    25682561        rd = reader
    2569         with open(filename, 'Ur') as fp:
     2562        with open(filename, 'Ur'):
    25702563            rd.ReInitialize()
    25712564            rd.errors = ""
     
    25802573            rd.objname = os.path.basename(filename)
    25812574            try:
    2582                 flag = rd.Reader(filename)
     2575                rd.Reader(filename)
    25832576            except Exception as msg:
    25842577                G2fl.G2Print("Warning: read of file {} failed\n{}".format(
     
    29462939        '''Display & edit a selected Vector RB
    29472940        '''
     2941        global resRBsel
    29482942        def rbNameSizer(rbid,rbData):
    29492943
     
    29522946                Obj = event.GetEventObject()
    29532947                name = Obj.GetValue()
     2948                if name == rbData['RBname']: return # no change
    29542949                namelist = [data['Vector'][key]['RBname'] for key in
    29552950                        data['Vector'] if 'RBname' in data['Vector'][key]]
    29562951                name = G2obj.MakeUniqueLabel(name,namelist)
    29572952                rbData['RBname'] = name
     2953                wx.CallAfter(UpdateVectorRB)
    29582954               
    29592955            def OnDelRB(event):
     
    29652961                    rbData['useCount'] -= 1
    29662962                wx.CallAfter(UpdateVectorRB)
     2963               
    29672964            def OnPlotRB(event):
    2968                 Obj = event.GetEventObject()
    29692965                G2plt.PlotRigidBody(G2frame,'Vector',AtInfo,rbData,plotDefaults)
    29702966           
     2967            # start of rbNameSizer
    29712968            nameSizer = wx.BoxSizer(wx.HORIZONTAL)
    29722969            nameSizer.Add(wx.StaticText(VectorRBDisplay,-1,'Rigid body name: '),0,WACV)
    29732970            RBname = wx.TextCtrl(VectorRBDisplay,-1,rbData['RBname'])
    2974             Indx[RBname.GetId()] = rbid
    29752971            RBname.Bind(wx.EVT_LEAVE_WINDOW, OnRBName)
    29762972            RBname.Bind(wx.EVT_TEXT_ENTER,OnRBName)
     
    31383134                refChoice[rbid][i].sort()
    31393135               
     3136        def OnRBSelect(event):
     3137            global resRBsel
     3138            sel = rbSelect.GetSelection()
     3139            if sel == 0: return # 1st entry is blank
     3140            rbname = rbchoice[sel-1]
     3141            resRBsel = RBnames[rbname]
     3142            wx.CallLater(100,UpdateVectorRB)
     3143           
    31403144        # beginning of UpdateVectorRB
    31413145        AtInfo = data['Vector']['AtInfo']
    31423146        refChoice = {}
     3147        RefObjs = []
     3148
     3149        GS = VectorRBDisplay.GetSizer()
     3150        if GS:
     3151            try:        #get around a c++ error in wx 4.0; doing is again seems to be OK
     3152                GS.Clear(True)
     3153            except:
     3154                GS.Clear(True)
     3155       
     3156        RBnames = {}
     3157        for rbid in data['RBIds']['Vector']:
     3158            RBnames.update({data['Vector'][rbid]['RBname']:rbid,})
     3159        if not RBnames:
     3160            return
     3161        rbchoice = list(RBnames.keys())
     3162        rbchoice.sort()
     3163        if GS:
     3164            VectorRBSizer = GS
     3165        else:
     3166            VectorRBSizer = wx.BoxSizer(wx.VERTICAL)
     3167        if resRBsel not in data['RBIds']['Vector']:
     3168            resRBsel = RBnames[rbchoice[0]]
     3169        if len(RBnames) > 1:
     3170            selSizer = wx.BoxSizer(wx.HORIZONTAL)
     3171            selSizer.Add(wx.StaticText(VectorRBDisplay,label=' Select rigid body to view:'),0)
     3172            rbSelect = wx.ComboBox(VectorRBDisplay,choices=['']+rbchoice)
     3173            name = data['Vector'][resRBsel]['RBname']
     3174            rbSelect.SetSelection(1+rbchoice.index(name))
     3175            rbSelect.Bind(wx.EVT_COMBOBOX,OnRBSelect)
     3176            selSizer.Add(rbSelect,0)
     3177            VectorRBSizer.Add(selSizer,0)
     3178        rbData = data['Vector'][resRBsel]
    31433179        if 'DELETED' in str(G2frame.GetStatusBar()):   #seems to be no other way to do this (wx bug)
    31443180            if GSASIIpath.GetConfigValue('debug'):
     
    31463182            return
    31473183        SetStatusLine(' You may use e.g. "c60" or "s60" for a vector entry')
    3148         if VectorRB.GetSizer(): VectorRB.GetSizer().Clear(True)
    3149         VectorRBSizer = wx.BoxSizer(wx.VERTICAL)
    3150         first = True
    3151         for rbid in data['RBIds']['Vector']:
    3152             if rbid == 'AtInfo': continue
    3153             rbData = data['Vector'][rbid]
    3154             FillRefChoice(rbid,rbData)
    3155             if not first:
    3156                 G2G.HorizontalLine(VectorRBSizer,VectorRBDisplay)
    3157             VectorRBSizer.Add(rbNameSizer(rbid,rbData),0)
    3158             VectorRBSizer.Add(rbRefAtmSizer(rbid,rbData),0)
    3159             XYZ = np.array([[0.,0.,0.] for Ty in rbData['rbTypes']])
    3160             for imag,mag in enumerate(rbData['VectMag']):
    3161                 XYZ += mag*rbData['rbVect'][imag]
    3162                 VectorRBSizer.Add(rbVectMag(rbid,imag,rbData),0)
    3163                 VectorRBSizer.Add(rbVectors(rbid,imag,mag,XYZ,rbData),0)
    3164             VectorRBSizer.Add((5,5),0)
    3165             data['Vector'][rbid]['rbXYZ'] = XYZ       
    3166             first = False
     3184        FillRefChoice(resRBsel,rbData)
     3185        VectorRBSizer.Add(rbNameSizer(resRBsel,rbData),0)
     3186        VectorRBSizer.Add(rbRefAtmSizer(resRBsel,rbData),0)
     3187        XYZ = np.array([[0.,0.,0.] for Ty in rbData['rbTypes']])
     3188        for imag,mag in enumerate(rbData['VectMag']):
     3189            XYZ += mag*rbData['rbVect'][imag]
     3190            VectorRBSizer.Add(rbVectMag(rbid,imag,rbData),0)
     3191            VectorRBSizer.Add(rbVectors(rbid,imag,mag,XYZ,rbData),0)
     3192        VectorRBSizer.Add((5,5),0)
     3193        data['Vector'][rbid]['rbXYZ'] = XYZ       
     3194       
     3195        VectorRBSizer.Add((5,25),)
    31673196        VectorRBSizer.Layout()   
    31683197        VectorRBDisplay.SetSizer(VectorRBSizer,True)
     3198        VectorRBDisplay.SetAutoLayout(True)
    31693199        Size = VectorRBSizer.GetMinSize()
     3200        VectorRBDisplay.SetSize(Size)
     3201       
    31703202        Size[0] += 40
    31713203        Size[1] = max(Size[1],450) + 20
    3172         VectorRBDisplay.SetSize(Size)
     3204        VectorRB.SetSize(Size)
    31733205        VectorRB.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
    3174         VectorRB.Scroll(0,Scroll)
     3206        G2frame.dataWindow.SendSizeEvent()
     3207       
     3208        VectorRBDisplay.Show()
     3209       
    31753210       
    31763211    def UpdateResidueRB():
     
    31793214        global resRBsel
    31803215        def rbNameSizer(rbid,rbData):
     3216           
    31813217            def OnRBName(event):
    31823218                event.Skip()
     
    32173253
    32183254            def OnPlotRB(event):
    3219                 Obj = event.GetEventObject()
    32203255                G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
    32213256               
    32223257            # start of rbNameSizer
    32233258            nameSizer = wx.BoxSizer(wx.HORIZONTAL)
    3224             nameSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Residue name: '),
    3225                 0,WACV)
     3259            nameSizer.Add(wx.StaticText(ResidueRBDisplay,-1,'Residue name: '),0,WACV)
    32263260            RBname = wx.TextCtrl(ResidueRBDisplay,-1,rbData['RBname'])
    32273261            RBname.Bind(wx.EVT_LEAVE_WINDOW, OnRBName)
     
    32363270            nameSizer.Add((5,0),)
    32373271            if not rbData['useCount']:
    3238                 delRB = wx.Button(ResidueRBDisplay,wx.ID_ANY,"Delete",
    3239                                 style=wx.BU_EXACTFIT)
     3272                delRB = wx.Button(ResidueRBDisplay,wx.ID_ANY,"Delete",style=wx.BU_EXACTFIT)
    32403273                delRB.Bind(wx.EVT_BUTTON, OnDelRB)
    32413274                Indx[delRB.GetId()] = rbid
    32423275                nameSizer.Add(delRB,0,WACV)
    32433276                if 'H'  in rbData['rbTypes']:
    3244                     stripH = wx.Button(ResidueRBDisplay,wx.ID_ANY,
    3245                                 "Strip H-atoms",
    3246                                 style=wx.BU_EXACTFIT)
     3277                    stripH = wx.Button(ResidueRBDisplay,wx.ID_ANY,"Strip H-atoms",style=wx.BU_EXACTFIT)
    32473278                    stripH.Bind(wx.EVT_BUTTON, OnStripH)
    32483279                    Indx[stripH.GetId()] = rbid
     
    32773308                    except ValueError:
    32783309                        pass
     3310                G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
    32793311                       
    32803312            def OnRefSel(event):
     
    32933325                if not iref:     #origin change
    32943326                    rbXYZ -= rbXYZ[ind]
    3295                 #TODO - transform all atom XYZ by axis choices
    32963327                Xxyz = rbXYZ[rbData['rbRef'][1]]
    32973328                X = Xxyz/np.sqrt(np.sum(Xxyz**2))
     
    35103541            rbname = rbchoice[sel-1]
    35113542            resRBsel = RBnames[rbname]
     3543            G2plt.PlotRigidBody(G2frame,'Residue',AtInfo,rbData,plotDefaults)
    35123544            wx.CallLater(100,UpdateResidueRB)
    35133545           
  • trunk/GSASIIphsGUI.py

    r4605 r4608  
    1010610106            return vecrbSizer               
    1010710107       
    10108         def OnSelect(event):
     10108        def OnVecSelect(event):
    1010910109            rbId = select.GetSelection()
    10110             wx.CallLater(100,RepaintRBInfo,rbId)
     10110            wx.CallLater(100,RepaintRBInfo,'Vector',rbId)
    1011110111           
    10112         def RepaintRBInfo(rbId,Scroll=0):
     10112        def OnResSelect(event):
     10113            rbId = select.GetSelection()
     10114            wx.CallLater(100,RepaintRBInfo,'Residue',rbId)
     10115           
     10116        def RepaintRBInfo(rbType,rbId,Scroll=0):
    1011310117            oldFocus = wx.Window.FindFocus()
    1011410118            if 'phoenix' in wx.version():
     
    1011710121                G2frame.bottomSizer.DeleteWindows()
    1011810122            Indx.clear()
    10119             rbObj = data['RBModels']['Residue'][rbId]
     10123            rbObj = data['RBModels'][rbType][rbId]
    1012010124            data['Drawing']['viewPoint'][0] = rbObj['Orig'][0]
    1012110125            Quad = rbObj['Orient'][0]
     
    1016110165            RBnames = []
    1016210166            for RBObj in data['RBModels']['Residue']:
    10163 #                RBnames.append(RBObj['RBname'].split(':')[0]+RBObj['numChain'])
    1016410167                RBnames.append(RBObj['RBname']+RBObj['numChain'])
    1016510168            rbName = RBnames[0]
     
    1017010173            select.SetSelection(RBnames.index(rbName))
    1017110174            select.SetFirstItem(RBnames.index(rbName))
    10172             select.Bind(wx.EVT_LISTBOX,OnSelect)
     10175            select.Bind(wx.EVT_LISTBOX,OnResSelect)
    1017310176            mainSizer.Add(select,0)
    1017410177            G2frame.bottomSizer = wx.BoxSizer(wx.VERTICAL)
     
    1018210185            mainSizer.Add(wx.StaticText(RigidBodies,-1,'Vector rigid bodies:'),0,WACV)
    1018310186            mainSizer.Add((5,5),0)
     10187            RBnames = []
    1018410188            for RBObj in data['RBModels']['Vector']:
    10185                 mainSizer.Add(VecrbSizer(RBObj))
     10189                RBnames.append(RBObj['RBname'])
     10190            rbName = RBnames[0]
     10191            rbObj = data['RBModels']['Vector'][0]
     10192            data['Drawing']['viewPoint'][0] = rbObj['Orig'][0]
     10193            data['Drawing']['Quaternion'] = rbObj['Orient'][0]
     10194            select = wx.ListBox(RigidBodies,choices=RBnames,style=wx.LB_SINGLE,size=(-1,120))
     10195            select.SetSelection(RBnames.index(rbName))
     10196            select.SetFirstItem(RBnames.index(rbName))
     10197            select.Bind(wx.EVT_LISTBOX,OnVecSelect)
     10198            mainSizer.Add(select,0)           
     10199            G2frame.bottomSizer = wx.BoxSizer(wx.VERTICAL)
     10200            G2frame.bottomSizer.Add(VecrbSizer(rbObj))
     10201            mainSizer.Add(G2frame.bottomSizer)
     10202            G2plt.PlotStructure(G2frame,data)
     10203            G2plt.PlotStructure(G2frame,data) # draw twice initially for mac
    1018610204        if nobody:
    1018710205            mainSizer.Add((5,5),0)
     
    1024710265
    1024810266        newXYZ = G2mth.UpdateRBXYZ(Bmat,rbObj,RBData,rbType)[0]
     10267        rbUsedIds = []   # Ids of atoms in current phase used inside RBs
     10268        for i in data['RBModels']:
     10269            for j in data['RBModels'][i]:
     10270                rbUsedIds += j['Ids']
    1024910271        # categorize atoms by type, omitting any that are already assigned
    1025010272        # in a rigid body
    10251         atmTypes = [None if atomData[i][-1] in rbUsedIds
    10252                         else atomData[i][ct]
    10253                         for i in range(len(atomData))]
     10273        atmTypes = [None if atomData[i][-1] in rbUsedIds else atomData[i][ct] for i in range(len(atomData))]
    1025410274        # remove assigned atoms from search groups
    1025510275        for i in selDict:
     
    1052910549                    return
    1053010550                selDict = getSelectedAtoms()
    10531                 if len(selDict) < 1:
     10551                if selDict and len(selDict) < 1:
    1053210552                    wx.MessageBox('No existing atoms were selected',caption='Select Atom(s)',
    1053310553                                      style=wx.ICON_EXCLAMATION)
     
    1092110941        data['testRBObj']['rbAtTypes'] = RBData[rbType][rbId]['rbTypes']
    1092210942        data['testRBObj']['AtInfo'] = RBData[rbType]['AtInfo']
    10923         data['testRBObj']['NameLookup'] = RBData[rbType][rbId]['atNames']
     10943        data['testRBObj']['NameLookup'] = RBData[rbType][rbId].get('atNames',[])    #only for residues
    1092410944        data['testRBObj']['rbType'] = rbType
    1092510945        data['testRBObj']['rbData'] = RBData
  • trunk/GSASIIplot.py

    r4595 r4608  
    93509350            for ind,[x,y,z] in enumerate(XYZ):
    93519351                aType = testRBObj['rbAtTypes'][ind]
    9352                 if testRBObj['NameLookup'][ind]:
     9352                if ind in testRBObj['NameLookup']:
    93539353                    name = testRBObj['NameLookup'][ind]+' '
    93549354                else:
Note: See TracChangeset for help on using the changeset viewer.