Changeset 242


Ignore:
Timestamp:
Jan 26, 2011 9:38:41 AM (11 years ago)
Author:
vondreele
Message:

refactor polygon search & rendering to eliminate internal "faces". Polygon search now in FindBonds? and Faces put at end of drawAtom array. Much faster rendering of complex polygons

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r230 r242  
    1919[ wxID_ATOMSEDITADD, wxID_ATOMSEDITINSERT, wxID_ATOMSEDITDELETE, wxID_ATOMSREFINE,
    2020    wxID_ATOMSMODIFY, wxID_ATOMSTRANSFORM, wxID_ATOMSTESTADD, wxID_ATONTESTINSERT,
    21 ] = [wx.NewId() for _init_coll_Atom_Items in range(8)]
     21    wxID_RELOADDRAWATOMS,
     22] = [wx.NewId() for _init_coll_Atom_Items in range(9)]
    2223
    2324[ wxID_PWDRADD, wxID_HKLFADD, wxID_DATADELETE,
     
    104105        parent.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
    105106            help='Select atoms to transform first')
     107        parent.Append(id=wxID_RELOADDRAWATOMS, kind=wx.ITEM_NORMAL,text='Reload draw atoms',
     108            help='Reload atom drawing list')
    106109           
    107110    def _init_coll_Data_Items(self,parent):
  • trunk/GSASIIphsGUI.py

    r230 r242  
    926926            else:
    927927                Atoms.ForceRefresh()
     928               
     929#Structure drawing GUI stuff               
    928930
    929931    def SetupDrawingData():
     
    980982            else:
    981983                atomInfo = [atom[:2]+atom[3:6]+['1',]+['vdW balls',]+
    982                     ['',]+[[255,255,255],]+atom[9:]+[[]]][0]
     984                    ['',]+[[255,255,255],]+atom[9:]+[[],[]]][0]
    983985            ct,cs = [1,8]         #type & color
    984986        elif generalData['Type'] == 'macromolecular':
     
    989991            atomInfo = [[atom[1].strip()+atom[0],]+
    990992                [AA1letter[oneLetter]+atom[0],]+atom[2:5]+
    991                 atom[6:9]+['1',]+['sticks',]+['',]+[[255,255,255],]+atom[12:]+[[]]][0]
     993                atom[6:9]+['1',]+['sticks',]+['',]+[[255,255,255],]+atom[12:]+[[],[]]][0]
    992994            ct,cs = [4,11]         #type & color
    993995        elif generalData['Type'] == 'magnetic':
     
    995997                atomInfo = [atom[:2]+oldatom[3:]][0]
    996998            else:
    997                 atomInfo = [atom[:2]+atom[3:6]+['vdW balls',]+['',]+atom[9:]+[[]]][0]
     999                atomInfo = [atom[:2]+atom[3:6]+['vdW balls',]+['',]+atom[9:]+[[],[]]][0]
    9981000            ct,cs = [1,8]         #type & color
    9991001#        elif generalData['Type'] == 'modulated':
     
    15531555            pass           
    15541556        for atom in atomData:
    1555             atom[-1] = []               #clear out old bonds
     1557            atom[-2] = []               #clear out old bonds/polyhedra
     1558            atom[-1] = []
    15561559        Indx = range(len(atomData))
    15571560        Atoms = []
     
    15801583                for j in IndB[0]:
    15811584                    if Styles[i] == 'polyhedra':
    1582                         atomData[i][-1].append(np.inner(Amat,Dx[j]))
     1585                        atomData[i][-2].append(np.inner(Amat,Dx[j]))
    15831586                    elif Styles[j] != 'polyhedra' and j > i:
    1584                         atomData[i][-1].append(Dx[j]*Radii[i]/sumR[j])
    1585                         atomData[j][-1].append(-Dx[j]*Radii[j]/sumR[j])
    1586 
     1587                        atomData[i][-2].append(Dx[j]*Radii[i]/sumR[j])
     1588                        atomData[j][-2].append(-Dx[j]*Radii[j]/sumR[j])
     1589                if Styles[i] == 'polyhedra':
     1590                    Bonds = atomData[i][-2]
     1591                    Faces = []
     1592                    if len(Bonds) > 2:
     1593                        FaceGen = G2lat.uniqueCombinations(Bonds,3)     #N.B. this is a generator
     1594                        for face in FaceGen:
     1595                            vol = nl.det(face)
     1596                            if abs(vol) > 1. or len(Bonds) == 3:
     1597                                if vol < 0.:
     1598                                    face = [face[0],face[2],face[1]]
     1599                                face = np.array(face)
     1600                                if not np.array([np.array(nl.det(face-bond))+0.0001 < 0 for bond in Bonds]).any():
     1601                                    norm = np.cross(face[1]-face[0],face[2]-face[0])
     1602                                    norm /= np.sqrt(np.sum(norm**2))
     1603                                    Faces.append([face,norm])
     1604                        atomData[i][-1] = Faces
     1605                       
    15871606    def DrawAtomsDelete(event):   
    15881607        indx = drawAtoms.GetSelectedRows()
     
    15961615            drawAtoms.ClearSelection()
    15971616            G2plt.PlotStructure(self,data)
     1617        event.StopPropagation()
     1618       
     1619    def OnReloadDrawAtoms(event):
     1620        data['Drawing']['Atoms'] = []
     1621        UpdateDrawAtoms()
     1622        drawAtoms.ClearSelection()
     1623        G2plt.PlotStructure(self,data)
    15981624        event.StopPropagation()
    15991625       
     
    24032429            self.dataFrame.Bind(wx.EVT_MENU, AtomModify, id=G2gd.wxID_ATOMSMODIFY)
    24042430            self.dataFrame.Bind(wx.EVT_MENU, AtomTransform, id=G2gd.wxID_ATOMSTRANSFORM)
     2431            self.dataFrame.Bind(wx.EVT_MENU, OnReloadDrawAtoms, id=G2gd.wxID_RELOADDRAWATOMS)
    24052432            FillAtomsGrid()
    24062433        elif text == 'General':
  • trunk/GSASIIplot.py

    r240 r242  
    17691769        for iat,atom in enumerate(drawingData['Atoms']):
    17701770            x,y,z = atom[cx:cx+3]
    1771             Bonds = atom[-1]
     1771            Bonds = atom[-2]
     1772            Faces = atom[-1]
    17721773            try:
    17731774                atNum = generalData['AtomTypes'].index(atom[ct])
     
    17801781            radius = 0.5
    17811782            if atom[cs] != '':
    1782                 glLoadName(atom[-2])
     1783                glLoadName(atom[-3])                   
    17831784            if 'balls' in atom[cs]:
    17841785                vdwScale = drawingData['vdwScale']
     
    18291830                RenderBonds(x,y,z,Bonds,bondR,color)
    18301831            elif atom[cs] == 'polyhedra':
    1831                 if len(Bonds) > 2:
    1832                     FaceGen = G2lat.uniqueCombinations(Bonds,3)     #N.B. this is a generator
    1833                     Faces = []
    1834                     for face in FaceGen:
    1835                         vol = nl.det(face)
    1836                         if abs(vol) > 1. or len(Bonds) == 3:
    1837                             if vol < 0.:
    1838                                 face = [face[0],face[2],face[1]]
    1839                             norm = np.cross(face[1]-face[0],face[2]-face[0])
    1840                             norm /= np.sqrt(np.sum(norm**2))
    1841                             Faces.append([face,norm])
    1842                     RenderPolyhedra(x,y,z,Faces,color)
     1832                RenderPolyhedra(x,y,z,Faces,color)
    18431833            elif atom[cs] == 'backbone':
    18441834                if atom[ct-1].split()[0] in ['C','N']:
Note: See TracChangeset for help on using the changeset viewer.