Changeset 2326


Ignore:
Timestamp:
Jun 15, 2016 9:21:13 PM (7 years ago)
Author:
vondreele
Message:

add more to angle calc

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIexprGUI.py

    r2321 r2326  
    830830        dlg.Destroy()
    831831        self.Oatom = ''
    832         self.Tatoms = ['','']
     832        self.Tatoms = ''
    833833        self.Draw()
    834834
     
    851851            wx.CallAfter(self.Draw)           
    852852
    853         def OnTargAtom(event):
     853        def OnTargAtoms(event):
    854854            Obj = event.GetEventObject()
    855             self.Tatom = Obj.GetValue()
     855            self.Tatoms = Obj.GetValue()
    856856            wx.CallAfter(self.Draw)
    857857
     
    880880        atomSizer.Add(origAtom,0,WACV)       
    881881        mainSizer.Add(atomSizer)
    882         mainSizer.Add(wx.StaticText(self.panel,label=' A-O-B angle for A,B: '),0,WACV)
    883882        neigh = []
    884883        if self.Oatom:
    885 #            GSASIIpath.IPyBreak()
    886             neigh = G2mth.FindAllNeighbors(Phase,self.Oatom,aNames)
    887         bNames = ['',]
    888         if neigh:
    889             bNames = [item[0]+' d=%.3f'%(item[1]) for item in neigh[0]]
     884            neigh = G2mth.FindAllNeighbors(Phase,self.Oatom,aNames)[0]
     885            mainSizer.Add(wx.StaticText(self.panel,label=' A-O-B angle for A,B: '),0,WACV)
     886            bNames = ['',]
     887            if neigh:
     888#                GSASIIpath.IPyBreak()
     889                for iA,aName in enumerate(neigh):
     890                    for cName in neigh[iA+1:]:
     891                        bNames.append('%s;%s'%(aName[0].replace(' ',''),cName[0].replace(' ','')))
     892                targAtoms = wx.ComboBox(self.panel,value=self.Tatoms,choices=bNames,
     893                    style=wx.CB_READONLY|wx.CB_DROPDOWN)
     894                targAtoms.Bind(wx.EVT_COMBOBOX,OnTargAtoms)
     895                mainSizer.Add(targAtoms,0,WACV)
    890896
    891897
     
    907913
    908914    def GetSelection(self):
    909         return []
     915        return self.pName,self.Oatom,self.Tatoms
    910916
    911917    def OnOk(self,event):
  • trunk/GSASIIgrid.py

    r2323 r2326  
    28072807
    28082808    def AddNewAnglePseudoVar(event):
    2809         print 'Add bond angle pseudo-variable here - TBD'
    28102809        dlg = G2exG.AngleDialog(
    28112810            G2frame.dataDisplay,Phases,PSvarDict,
     
    28132812            VarLabel = "New Angle")
    28142813        if dlg.ShowModal() == wx.ID_OK:
    2815             obj = dlg.GetSelection()
     2814            pName,Oatom,Tatoms = dlg.GetSelection()
     2815            if Tatoms:
     2816                Phase = Phases[pName]
     2817                General = Phase['General']
     2818                cx,ct = General['AtomPtrs'][:2]
     2819                pId = Phase['pId']
     2820                SGData = General['SGData']
     2821                Atoms = Phase['Atoms']
     2822                aNames = [atom[ct-1] for atom in Atoms]
     2823                tIds = []
     2824                symNos = []
     2825                cellNos = []
     2826                oId = aNames.index(Oatom)
     2827                Tatoms = Tatoms.split(';')
     2828                for Tatom in Tatoms:
     2829                    sB = Tatom.find('(')+1
     2830                    symNo = 0
     2831                    if sB:
     2832                        sF = Tatom.find(')')
     2833                        symNo = int(Tatom[sB:sF])
     2834                    symNos.append(symNo)
     2835                    cellNo = [0,0,0]
     2836                    cB = Tatom.find('[')
     2837                    if cB>0:
     2838                        cF = Tatom.find(']')+1
     2839                        cellNo = eval(Tatom[cB:cF])
     2840                    cellNos.append(cellNo)
     2841                    tIds.append(aNames.index(Tatom.split('+')[0]))
     2842                # create an expression object
     2843                obj = G2obj.ExpressionObj()
     2844                obj.expression = 'Angle(%s,%s,\n%s)'%(Tatoms[0],Oatom,Tatoms[1])
     2845                obj.angle_dict = {'pId':pId,'SGData':SGData,'symNo':symNos,'cellNo':cellNos}
     2846                obj.angle_atoms = [oId,tIds]
    28162847        else:
    28172848            dlg.Destroy()
     
    28192850        dlg.Destroy()
    28202851        if obj:
    2821             calcobj = G2obj.ExpressionCalcObj(obj)
    2822             Controls['SeqPseudoVars'][calcobj.eObj.expression] = obj
     2852            Controls['SeqPseudoVars'][obj.expression] = obj
    28232853            UpdateSeqResults(G2frame,data,G2frame.dataDisplay.GetSize()) # redisplay variables
    28242854           
  • trunk/GSASIImath.py

    r2321 r2326  
    15891589    return Dist,sig
    15901590
    1591 def CalcAngle(distance_dict, distance_atoms, parmDict):
     1591def CalcAngle(angle_dict, angle_atoms, parmDict):
    15921592    if not len(parmDict):
    15931593        return 0.
    1594 
    1595     return 0.   #angle
     1594    pId = angle_dict['pId']
     1595    pfx = '%d::'%(pId)
     1596    A = [parmDict['%s::A%d'%(pId,i)] for i in range(6)]
     1597    Amat = G2lat.cell2AB(G2lat.A2cell(A))[0]
     1598    Oxyz = [parmDict['%s::A%s:%d'%(pId,x,angle_atoms[0])] for x in ['x','y','z']]
     1599    Axyz = [parmDict['%s::A%s:%d'%(pId,x,angle_atoms[1][0])] for x in ['x','y','z']]
     1600    Bxyz = [parmDict['%s::A%s:%d'%(pId,x,angle_atoms[1][1])] for x in ['x','y','z']]
     1601    ABxyz = [Axyz,Bxyz]
     1602    symNo = angle_dict['symNo']
     1603    for i in range(2):
     1604        inv = 1
     1605        if symNo[i] < 0:
     1606            inv = -1
     1607            symNo[i] *= -1
     1608        cen = symNo[i]/100
     1609        op = symNo[i]%100-1
     1610        M,T = angle_dict['SGData']['SGOps'][op]
     1611        D = T*inv+angle_dict['SGData']['SGCen'][cen]
     1612        D += angle_dict['cellNo'][i]
     1613        ABxyz[i] = np.inner(M*inv,ABxyz[i])+D
     1614        ABxyz[i] = np.inner(Amat,(ABxyz[i]-Oxyz))
     1615        dist = np.sqrt(np.sum(ABxyz[i]**2))
     1616        if not dist:
     1617            return 0.
     1618        ABxyz[i] /= dist
     1619    angle = acosd(np.sum(ABxyz[0]*ABxyz[1]))
     1620    return angle
    15961621
    15971622def getSyXYZ(XYZ,ops,SGData):
  • trunk/GSASIIobj.py

    r2323 r2326  
    19531953        Adds the free parameter values to the parameter dict (parmDict).
    19541954        '''
    1955         if self.eObj.expression.startswith('Dist'):
     1955        if self.eObj.expression.startswith('Dist') or self.eObj.expression.startswith('Angle'):
    19561956            return
    19571957        self.fxnpkgdict = self.eObj.CheckVars()
     
    20222022        :param list parmDict: a dict of values some of which may be in use here
    20232023        '''
    2024         if self.eObj.expression.startswith('Dist'):
     2024        if self.eObj.expression.startswith('Dist') or self.eObj.expression.startswith('Angle'):
    20252025            self.parmDict = parmDict
    20262026            return
     
    20512051            #self.su = G2mth.CalcDistSu(self.eObj.distance_dict, self.eObj.distance_atoms, self.parmDict)
    20522052            return dist
     2053        elif self.eObj.expression.startswith('Angle'):
     2054            angle = 0
     2055            dist = G2mth.CalcAngle(self.eObj.angle_dict, self.eObj.angle_atoms, self.parmDict)
     2056            return angle
    20532057        if self.compiledExpr is None:
    20542058            raise Exception,"EvalExpression called before SetupCalc"
Note: See TracChangeset for help on using the changeset viewer.