Changeset 1442


Ignore:
Timestamp:
Jul 25, 2014 3:22:17 PM (7 years ago)
Author:
vondreele
Message:

Add 3D plotting for structure factors for both HKLF & PWDR

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r1414 r1442  
    145145] = [wx.NewId() for item in range(12)]
    146146
    147 [ wxID_SELECTPHASE,wxID_PWDHKLPLOT,
    148 ] = [wx.NewId() for item in range(2)]
     147[ wxID_SELECTPHASE,wxID_PWDHKLPLOT,wxID_PWD3DHKLPLOT,
     148] = [wx.NewId() for item in range(3)]
    149149
    150150[ wxID_PDFCOPYCONTROLS, wxID_PDFSAVECONTROLS, wxID_PDFLOADCONTROLS,
     
    28202820        self.PostfillDataMenu()
    28212821           
    2822         # Powder
    2823         self.HistMenu = wx.MenuBar()
    2824         self.PrefillDataMenu(self.HistMenu,helpType='PWD Analysis',helpLbl='Powder Fit Error Analysis')
     2822        # PWDR & SASD
     2823        self.PWDRMenu = wx.MenuBar()
     2824        self.PrefillDataMenu(self.PWDRMenu,helpType='PWDR Analysis',helpLbl='Powder Fit Error Analysis')
    28252825        self.ErrorAnal = wx.Menu(title='')
    2826         self.HistMenu.Append(menu=self.ErrorAnal,title='Commands')
     2826        self.PWDRMenu.Append(menu=self.ErrorAnal,title='Commands')
    28272827        self.ErrorAnal.Append(id=wxID_PWDANALYSIS,kind=wx.ITEM_NORMAL,text='Error Analysis',
    28282828            help='Error analysis on powder pattern')
    28292829        self.ErrorAnal.Append(id=wxID_PWDCOPY,kind=wx.ITEM_NORMAL,text='Copy params',
    2830             help='Error analysis on powder pattern')
     2830            help='Copy of PWDR parameters')
     2831        self.PostfillDataMenu()
     2832           
     2833        # HKLF
     2834        self.HKLFMenu = wx.MenuBar()
     2835        self.PrefillDataMenu(self.HKLFMenu,helpType='HKLF Analysis',helpLbl='HKLF Fit Error Analysis')
     2836        self.ErrorAnal = wx.Menu(title='')
     2837        self.HKLFMenu.Append(menu=self.ErrorAnal,title='Commands')
     2838        self.ErrorAnal.Append(id=wxID_PWDANALYSIS,kind=wx.ITEM_NORMAL,text='Error Analysis',
     2839            help='Error analysis on single crystal data')
     2840        self.ErrorAnal.Append(id=wxID_PWD3DHKLPLOT,kind=wx.ITEM_NORMAL,text='Plot 3D HKLs',
     2841            help='Plot HKLs from single crystal data in 3D')
     2842        self.ErrorAnal.Append(id=wxID_PWDCOPY,kind=wx.ITEM_NORMAL,text='Copy params',
     2843            help='Copy of HKLF parameters')
    28312844        self.PostfillDataMenu()
    28322845           
     
    29572970        self.ReflEdit.Append(id=wxID_PWDHKLPLOT,kind=wx.ITEM_NORMAL,text='Plot HKLs',
    29582971            help='Plot HKLs from powder pattern')
     2972        self.ReflEdit.Append(id=wxID_PWD3DHKLPLOT,kind=wx.ITEM_NORMAL,text='Plot 3D HKLs',
     2973            help='Plot HKLs from powder pattern in 3D')
    29592974        self.PostfillDataMenu()
    29602975       
     
    49354950        UpdatePWHKPlot(G2frame,kind,item) # redisplay data screen
    49364951
     4952    def OnPlot3DHKL(event):
     4953        refList = data[1]['RefList']
     4954        phaseName = data[0].get('0::Name','no phase')
     4955        FoMax = np.max(refList.T[8])
     4956        Hmin = np.array([int(np.min(refList.T[0])),int(np.min(refList.T[1])),int(np.min(refList.T[2]))])
     4957        Hmax = np.array([int(np.max(refList.T[0])),int(np.max(refList.T[1])),int(np.max(refList.T[2]))])
     4958        Vpoint = [int(np.mean(refList.T[0])),int(np.mean(refList.T[1])),int(np.mean(refList.T[2]))]
     4959        controls = {'Type' : 'Fosq','Iscale' : False,'HKLmax' : Hmax,'HKLmin' : Hmin,
     4960            'FoMax' : FoMax,'Scale' : 1.0,'Drawing':{'viewPoint':[Vpoint,[]],'default':Vpoint[:],
     4961            'backColor':[0,0,0],'depthFog':False,'Zclip':10.0,'cameraPos':10.,'Zstep':0.05,
     4962            'Scale':1.0,'oldxy':[],'viewDir':[1,0,0]}}
     4963        G2plt.Plot3DSngl(G2frame,newPlot=True,Data=controls,hklRef=refList,Title=phaseName)
     4964       
    49374965    def OnErrorAnalysis(event):
    49384966        G2plt.PlotDeltSig(G2frame,kind)
     
    49664994    if G2frame.dataDisplay:
    49674995        G2frame.dataDisplay.Destroy()
    4968     SetDataMenuBar(G2frame,G2frame.dataFrame.HistMenu)
    4969     G2frame.dataFrame.Bind(wx.EVT_MENU, OnErrorAnalysis, id=wxID_PWDANALYSIS)
    4970     G2frame.dataFrame.Bind(wx.EVT_MENU, onCopySelectedItems, id=wxID_PWDCOPY)
     4996    if kind in ['PWDR','SASD']:
     4997        SetDataMenuBar(G2frame,G2frame.dataFrame.PWDRMenu)
     4998        G2frame.dataFrame.Bind(wx.EVT_MENU, OnErrorAnalysis, id=wxID_PWDANALYSIS)
     4999        G2frame.dataFrame.Bind(wx.EVT_MENU, onCopySelectedItems, id=wxID_PWDCOPY)
     5000    elif kind in ['HKLF',]:
     5001        SetDataMenuBar(G2frame,G2frame.dataFrame.HKLFMenu)
     5002#        G2frame.dataFrame.Bind(wx.EVT_MENU, OnErrorAnalysis, id=wxID_PWDANALYSIS)
     5003        G2frame.dataFrame.Bind(wx.EVT_MENU, OnPlot3DHKL, id=wxID_PWD3DHKLPLOT)
     5004#        G2frame.dataFrame.Bind(wx.EVT_MENU, onCopySelectedItems, id=wxID_PWDCOPY)
    49715005    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
    49725006   
     
    50205054        refList = data[1]['RefList']
    50215055        FoMax = np.max(refList.T[5])
    5022         controls = {'Type' : 'Fo','ifFc' : True,     
     5056        controls = {'Type' : 'Fosq','ifFc' : True,     
    50235057            'HKLmax' : [int(np.max(refList.T[0])),int(np.max(refList.T[1])),int(np.max(refList.T[2]))],
    50245058            'HKLmin' : [int(np.min(refList.T[0])),int(np.min(refList.T[1])),int(np.min(refList.T[2]))],
  • trunk/GSASIIplot.py

    r1441 r1442  
    247247           
    248248def PlotSngl(G2frame,newPlot=False,Data=None,hklRef=None,Title=''):
    249     '''Single crystal structure factor plotting package - displays zone of reflections as rings proportional
     249    '''Structure factor plotting package - displays zone of reflections as rings proportional
    250250        to F, F**2, etc. as requested
    251251    '''
     
    256256        i = zones.index(Data['Zone'])
    257257        newPlot = False
    258         pwdrChoice = {'f':'Fo','s':'Fosq','i':'Unit Fc'}
     258        pwdrChoice = {'f':'Fo','s':'Fosq','u':'Unit Fc'}
    259259        hklfChoice = {'1':'|DFsq|>sig','3':'|DFsq|>3sig','w':'|DFsq|/sig','f':'Fo','s':'Fosq','i':'Unit Fc'}
    260260        if event.key == 'h':
     
    267267            Data['Zone'] = '001'
    268268            newPlot = True
    269         elif event.key == 'u':
     269        elif event.key == 'i':
    270270            Data['Scale'] *= 1.1
    271271        elif event.key == 'd':
     
    342342        Page.canvas.mpl_connect('key_press_event', OnSCKeyPress)
    343343        Page.keyPress = OnSCKeyPress
    344         Page.Choice = (' key press','u: increase scale','d: decrease scale',
     344        Page.Choice = (' key press','i: increase scale','d: decrease scale',
    345345            'h: select 100 zone','k: select 010 zone','l: select 001 zone',
    346             'f: select Fo','s: select Fosq','i: select unit Fc',
     346            'f: select Fo','s: select Fosq','u: select unit Fc',
    347347            '+: increase index','-: decrease index','0: zero layer',)
    348348        if 'HKLF' in Name:
     
    443443        Plot.set_ylim((HKLmin[pzone[izone][1]],HKLmax[pzone[izone][1]]))
    444444        Page.canvas.draw()
     445       
     446################################################################################
     447##### Plot3DSngl
     448################################################################################
     449
     450def Plot3DSngl(G2frame,newPlot=False,Data=None,hklRef=None,Title=''):
     451    '''3D Structure factor plotting package - displays reflections as rings proportional
     452        to F, F**2, etc. as requested as 3D array
     453    '''
     454
     455    def OnKeyBox(event):
     456        mode = cb.GetValue()
     457        if mode in ['jpeg','bmp','tiff',]:
     458            try:
     459                import Image as Im
     460            except ImportError:
     461                try:
     462                    from PIL import Image as Im
     463                except ImportError:
     464                    print "PIL/pillow Image module not present. Cannot save images without this"
     465                    raise Exception("PIL/pillow Image module not found")
     466            Fname = os.path.join(Mydir,generalData['Name']+'.'+mode)
     467            size = Page.canvas.GetSize()
     468            glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
     469            if mode in ['jpeg',]:
     470                Pix = glReadPixels(0,0,size[0],size[1],GL_RGBA, GL_UNSIGNED_BYTE)
     471                im = Image.new("RGBA", (size[0],size[1]))
     472            else:
     473                Pix = glReadPixels(0,0,size[0],size[1],GL_RGB, GL_UNSIGNED_BYTE)
     474                im = Image.new("RGB", (size[0],size[1]))
     475            im.fromstring(Pix)
     476            im.save(Fname,mode)
     477            cb.SetValue(' save as/key:')
     478            G2frame.G2plotNB.status.SetStatusText('Drawing saved to: '+Fname,1)
     479        else:
     480            event.key = cb.GetValue()[0]
     481            cb.SetValue(' save as/key:')
     482            wx.CallAfter(OnKey,event)
     483        Page.canvas.SetFocus() # redirect the Focus from the button back to the plot
     484       
     485    def OnKey(event):           #on key UP!!
     486        Choice = {'F':'Fo','S':'Fosq','U':'Unit','D':'dFsq','W':'dFsq/sig'}
     487        try:
     488            keyCode = event.GetKeyCode()
     489            if keyCode > 255:
     490                keyCode = 0
     491            key = chr(keyCode)
     492        except AttributeError:       #if from OnKeyBox above
     493            key = str(event.key).upper()
     494        if key in ['C']:
     495            drawingData['viewPoint'][0] = drawingData['default']
     496            drawingData['viewDir'] = [0,0,1]
     497            drawingData['oldxy'] = []
     498            V0 = np.array([0,0,1])
     499            V = np.inner(Amat,V0)
     500            V /= np.sqrt(np.sum(V**2))
     501            A = np.arccos(np.sum(V*V0))
     502            Q = G2mth.AV2Q(A,[0,1,0])
     503            drawingData['Quaternion'] = Q
     504            Q = drawingData['Quaternion']
     505        elif key == '+':
     506            Data['Scale'] *= 1.25
     507        elif key == '-':
     508            Data['Scale'] /= 1.25
     509        elif key == '0':
     510            Data['Scale'] = 1.0
     511        elif key == 'I':
     512            Data['Iscale'] = not Data['Iscale']
     513        elif key in Choice:
     514            Data['Type'] = Choice[key]           
     515        Draw('key')
     516           
     517    Name = G2frame.PatternTree.GetItemText(G2frame.PatternId)
     518    if Title != 'no phase':
     519        generalData = G2frame.GetPhaseData()[Title]['General']
     520        cell = generalData['Cell'][1:7]
     521    else:
     522        cell = [10,10,10,90,90,90]
     523    drawingData = Data['Drawing']
     524    defaultViewPt = copy.copy(drawingData['viewPoint'])
     525    Amat,Bmat = G2lat.cell2AB(cell)         #Amat - crystal to cartesian, Bmat - inverse
     526    Gmat,gmat = G2lat.cell2Gmat(cell)
     527    invcell = G2lat.Gmat2cell(Gmat)
     528    A4mat = np.concatenate((np.concatenate((Amat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     529    B4mat = np.concatenate((np.concatenate((Bmat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     530    drawingData['Quaternion'] = G2mth.AV2Q(2*np.pi,np.inner(Bmat,[0,0,1]))
     531    Wt = np.array([255,255,255])
     532    Rd = np.array([255,0,0])
     533    Gr = np.array([0,255,0])
     534    wxGreen = wx.Colour(0,255,0)
     535    Bl = np.array([0,0,255])
     536    Or = np.array([255,128,0])
     537    wxOrange = wx.Colour(255,128,0)
     538    uBox = np.array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]])
     539    uEdges = np.array([
     540        [uBox[0],uBox[1]],[uBox[0],uBox[3]],[uBox[0],uBox[4]],[uBox[1],uBox[2]]])
     541    uColors = [Rd,Gr,Bl]
     542   
     543    def FillHKLRC():
     544        R = np.zeros(len(hklRef))
     545        C = []
     546        HKL = []
     547        RC = []
     548        for i,refl in enumerate(hklRef):
     549            H = np.array(refl[:3])
     550            if 'HKLF' in Name:
     551                Fosq,sig,Fcsq = refl[5:8]
     552            else:
     553                Fosq,sig,Fcsq = refl[8],1.0,refl[9]
     554            HKL.append(H)
     555            if Data['Type'] == 'Unit':
     556                R[i] = 0.1
     557                C.append(Gr)
     558            elif Data['Type'] == 'Fosq':
     559                if Fosq > 0:
     560                    R[i] = Fosq
     561                    C.append(Gr)
     562                else:
     563                    R[i] = -Fosq
     564                    C.append(Rd)
     565            elif Data['Type'] == 'Fo':
     566                if Fosq > 0:
     567                    R[i] = np.sqrt(Fosq)
     568                    C.append(Gr)
     569                else:
     570                    R[i] = np.sqrt(-Fosq)
     571                    C.append(Rd)
     572            elif Data['Type'] == 'dFsq/sig':
     573                dFsig = (Fosq-Fcsq)/sig
     574                if dFsig > 0:
     575                    R[i] = dFsig
     576                    C.append(Gr)
     577                else:
     578                    R[i] = -dFsig
     579                    C.append(Rd)
     580            elif Data['Type'] == 'dFsq':
     581                dF = Fosq-Fcsq
     582                if dF > 0:
     583                    R[i] = dF
     584                    C.append(Gr)
     585                else:
     586                    R[i] = -dF
     587                    C.append(Rd)
     588        R /= np.max(R)
     589        R *= Data['Scale']
     590        if Data['Iscale']:
     591            R = np.where(R<=1.,R,1.)
     592            C = np.array(C)
     593            C = (C.T*R).T
     594            R = np.ones_like(R)*0.1     
     595        return HKL,zip(list(R),C)
     596
     597    def SetTranslation(newxy):
     598#first get translation vector in screen coords.       
     599        oldxy = drawingData['oldxy']
     600        if not len(oldxy): oldxy = list(newxy)
     601        dxy = newxy-oldxy
     602        drawingData['oldxy'] = list(newxy)
     603        V = np.array([-dxy[0],dxy[1],0.])
     604#then transform to rotated crystal coordinates & apply to view point       
     605        Q = drawingData['Quaternion']
     606        V = np.inner(Bmat,G2mth.prodQVQ(G2mth.invQ(Q),V))
     607        Tx,Ty,Tz = drawingData['viewPoint'][0]
     608        Tx += V[0]*0.1
     609        Ty += V[1]*0.1
     610        Tz += V[2]*0.1
     611        drawingData['viewPoint'][0] =  Tx,Ty,Tz
     612       
     613    def SetRotation(newxy):
     614        'Perform a rotation in x-y space due to a left-mouse drag'
     615    #first get rotation vector in screen coords. & angle increment       
     616        oldxy = drawingData['oldxy']
     617        if not len(oldxy): oldxy = list(newxy)
     618        dxy = newxy-oldxy
     619        drawingData['oldxy'] = list(newxy)
     620        V = np.array([dxy[1],dxy[0],0.])
     621        A = 0.25*np.sqrt(dxy[0]**2+dxy[1]**2)
     622        if not A: return # nothing changed, nothing to do
     623    # next transform vector back to xtal coordinates via inverse quaternion
     624    # & make new quaternion
     625        Q = drawingData['Quaternion']
     626        V = G2mth.prodQVQ(G2mth.invQ(Q),np.inner(Bmat,V))
     627        DQ = G2mth.AVdeg2Q(A,V)
     628        Q = G2mth.prodQQ(Q,DQ)
     629        drawingData['Quaternion'] = Q
     630    # finally get new view vector - last row of rotation matrix
     631        VD = np.inner(Bmat,G2mth.Q2Mat(Q)[2])
     632        VD /= np.sqrt(np.sum(VD**2))
     633        drawingData['viewDir'] = VD
     634       
     635    def SetRotationZ(newxy):                       
     636#first get rotation vector (= view vector) in screen coords. & angle increment       
     637        View = glGetIntegerv(GL_VIEWPORT)
     638        cent = [View[2]/2,View[3]/2]
     639        oldxy = drawingData['oldxy']
     640        if not len(oldxy): oldxy = list(newxy)
     641        dxy = newxy-oldxy
     642        drawingData['oldxy'] = list(newxy)
     643        V = drawingData['viewDir']
     644        A = [0,0]
     645        A[0] = dxy[1]*.25
     646        A[1] = dxy[0]*.25
     647        if newxy[0] > cent[0]:
     648            A[0] *= -1
     649        if newxy[1] < cent[1]:
     650            A[1] *= -1       
     651# next transform vector back to xtal coordinates & make new quaternion
     652        Q = drawingData['Quaternion']
     653        V = np.inner(Amat,V)
     654        Qx = G2mth.AVdeg2Q(A[0],V)
     655        Qy = G2mth.AVdeg2Q(A[1],V)
     656        Q = G2mth.prodQQ(Q,Qx)
     657        Q = G2mth.prodQQ(Q,Qy)
     658        drawingData['Quaternion'] = Q
     659
     660    def OnMouseDown(event):
     661        xy = event.GetPosition()
     662        drawingData['oldxy'] = list(xy)
     663       
     664    def OnMouseMove(event):
     665        if event.ShiftDown():           #don't want any inadvertant moves when picking
     666            return
     667        newxy = event.GetPosition()
     668                               
     669        if event.Dragging():
     670            if event.LeftIsDown():
     671                SetRotation(newxy)
     672                Q = drawingData['Quaternion']
     673            elif event.RightIsDown():
     674                SetTranslation(newxy)
     675                Tx,Ty,Tz = drawingData['viewPoint'][0]
     676            elif event.MiddleIsDown():
     677                SetRotationZ(newxy)
     678                Q = drawingData['Quaternion']
     679            Draw('move')
     680       
     681    def OnMouseWheel(event):
     682        if event.ShiftDown():
     683            return
     684        drawingData['cameraPos'] += event.GetWheelRotation()/120.
     685        drawingData['cameraPos'] = max(0.1,min(20.00,drawingData['cameraPos']))
     686        Draw('wheel')
     687       
     688    def SetBackground():
     689        R,G,B,A = Page.camera['backColor']
     690        glClearColor(R,G,B,A)
     691        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
     692       
     693    def SetLights():
     694        glEnable(GL_DEPTH_TEST)
     695        glShadeModel(GL_SMOOTH)
     696        glEnable(GL_LIGHTING)
     697        glEnable(GL_LIGHT0)
     698        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,0)
     699        glLightfv(GL_LIGHT0,GL_AMBIENT,[1,1,1,.8])
     700        glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])
     701       
     702    def RenderUnitVectors(x,y,z):
     703        xyz = np.array([x,y,z])
     704        glEnable(GL_COLOR_MATERIAL)
     705        glLineWidth(1)
     706        glPushMatrix()
     707        glTranslate(x,y,z)
     708        glBegin(GL_LINES)
     709        for line,color in zip(uEdges,uColors):
     710            glColor3ubv(color)
     711            glVertex3fv(-line[1])
     712            glVertex3fv(line[1])
     713        glEnd()
     714        glPopMatrix()
     715        glColor4ubv([0,0,0,0])
     716        glDisable(GL_COLOR_MATERIAL)
     717               
     718    def RenderDots(XYZ,RC):
     719        glEnable(GL_COLOR_MATERIAL)
     720        XYZ = np.array(XYZ)
     721        glPushMatrix()
     722        for xyz,rc in zip(XYZ,RC):
     723            x,y,z = xyz
     724            r,c = rc
     725            glColor3ubv(c)
     726            glPointSize(r*50)
     727            glBegin(GL_POINTS)
     728            glVertex3fv(xyz)
     729            glEnd()
     730        glPopMatrix()
     731        glColor4ubv([0,0,0,0])
     732        glDisable(GL_COLOR_MATERIAL)
     733       
     734    def Draw(caller=''):
     735#useful debug?       
     736#        if caller:
     737#            print caller
     738# end of useful debug
     739        G2frame.G2plotNB.status.SetStatusText('Plot type = %s for %s'%(Data['Type'],Name),1)
     740        VS = np.array(Page.canvas.GetSize())
     741        aspect = float(VS[0])/float(VS[1])
     742        cPos = drawingData['cameraPos']
     743        Zclip = drawingData['Zclip']*cPos/20.
     744        Q = drawingData['Quaternion']
     745        Tx,Ty,Tz = drawingData['viewPoint'][0]
     746        G,g = G2lat.cell2Gmat(cell)
     747        GS = G
     748        GS[0][1] = GS[1][0] = math.sqrt(GS[0][0]*GS[1][1])
     749        GS[0][2] = GS[2][0] = math.sqrt(GS[0][0]*GS[2][2])
     750        GS[1][2] = GS[2][1] = math.sqrt(GS[1][1]*GS[2][2])
     751       
     752        HKL,RC = FillHKLRC()
     753       
     754        SetBackground()
     755        glInitNames()
     756        glPushName(0)
     757       
     758        glMatrixMode(GL_PROJECTION)
     759        glLoadIdentity()
     760        glViewport(0,0,VS[0],VS[1])
     761        gluPerspective(20.,aspect,cPos-Zclip,cPos+Zclip)
     762        gluLookAt(0,0,cPos,0,0,0,0,1,0)
     763        SetLights()           
     764           
     765        glMatrixMode(GL_MODELVIEW)
     766        glLoadIdentity()
     767        matRot = G2mth.Q2Mat(Q)
     768        matRot = np.concatenate((np.concatenate((matRot,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     769        glMultMatrixf(matRot.T)
     770        glMultMatrixf(B4mat.T)
     771        glTranslate(-Tx,-Ty,-Tz)
     772        x,y,z = drawingData['viewPoint'][0]
     773        RenderUnitVectors(x,y,z)
     774        RenderUnitVectors(0,0,0)
     775        RenderDots(HKL,RC)
     776        time0 = time.time()
     777#        glEnable(GL_BLEND)
     778#        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
     779#        glDisable(GL_BLEND)
     780        if Page.context: Page.canvas.SetCurrent(Page.context)    # wx 2.9 fix
     781        Page.canvas.SwapBuffers()
     782
     783    # PlotStructure execution starts here (N.B. initialization above)
     784    try:
     785        plotNum = G2frame.G2plotNB.plotList.index('3D Structure Factors')
     786        Page = G2frame.G2plotNB.nb.GetPage(plotNum)       
     787    except ValueError:
     788        Plot = G2frame.G2plotNB.addOgl('3D Structure Factors')
     789        plotNum = G2frame.G2plotNB.plotList.index('3D Structure Factors')
     790        Page = G2frame.G2plotNB.nb.GetPage(plotNum)
     791        Page.views = False
     792        view = False
     793        altDown = False
     794    Font = Page.GetFont()
     795    Page.SetFocus()
     796    Page.Choice = None
     797    choice = [' save as/key:','jpeg','tiff','bmp','c: recenter to default','+: increase scale',
     798    '-: decrease scale','f: Fobs','s: Fobs**2','u: unit','d: Fo-Fc','w: DF/sig','i: toggle intensity scaling']
     799    cb = wx.ComboBox(G2frame.G2plotNB.status,style=wx.CB_DROPDOWN|wx.CB_READONLY,choices=choice)
     800    cb.Bind(wx.EVT_COMBOBOX, OnKeyBox)
     801    cb.SetValue(' save as/key:')
     802    Page.canvas.Bind(wx.EVT_MOUSEWHEEL, OnMouseWheel)
     803    Page.canvas.Bind(wx.EVT_LEFT_DOWN, OnMouseDown)
     804    Page.canvas.Bind(wx.EVT_RIGHT_DOWN, OnMouseDown)
     805    Page.canvas.Bind(wx.EVT_MIDDLE_DOWN, OnMouseDown)
     806    Page.canvas.Bind(wx.EVT_KEY_UP, OnKey)
     807    Page.canvas.Bind(wx.EVT_MOTION, OnMouseMove)
     808#    Page.canvas.Bind(wx.EVT_SIZE, OnSize)
     809    Page.camera['position'] = drawingData['cameraPos']
     810    Page.camera['viewPoint'] = np.inner(Amat,drawingData['viewPoint'][0])
     811    Page.camera['backColor'] = np.array(list(drawingData['backColor'])+[0,])/255.
     812    try:
     813        Page.canvas.SetCurrent()
     814    except:
     815        pass
     816    Draw('main')
     817#    if firstCall: Draw('main') # draw twice the first time that graphics are displayed
     818
    445819       
    446820################################################################################
  • trunk/GSASIIpwdGUI.py

    r1439 r1442  
    24072407        def OnPlotHKL(event):
    24082408            FoMax = np.max(refList.T[8])
    2409             controls = {'Type' : 'Fo','ifFc' : True,     
    2410                 'HKLmax' : [int(np.max(refList.T[0])),int(np.max(refList.T[1])),int(np.max(refList.T[2]))],
    2411                 'HKLmin' : [int(np.min(refList.T[0])),int(np.min(refList.T[1])),int(np.min(refList.T[2]))],
     2409            Hmin = np.array([int(np.min(refList.T[0])),int(np.min(refList.T[1])),int(np.min(refList.T[2]))])
     2410            Hmax = np.array([int(np.max(refList.T[0])),int(np.max(refList.T[1])),int(np.max(refList.T[2]))])
     2411            controls = {'Type' : 'Fo','ifFc' : True,'HKLmax' : Hmax,'HKLmin' : Hmin,
    24122412                'FoMax' : FoMax,'Zone' : '001','Layer' : 0,'Scale' : 1.0,}
    24132413            G2plt.PlotSngl(G2frame,newPlot=True,Data=controls,hklRef=refList,Title=phaseName)
     2414           
     2415        def OnPlot3DHKL(event):
     2416            FoMax = np.max(refList.T[8])
     2417            Hmin = np.array([int(np.min(refList.T[0])),int(np.min(refList.T[1])),int(np.min(refList.T[2]))])
     2418            Hmax = np.array([int(np.max(refList.T[0])),int(np.max(refList.T[1])),int(np.max(refList.T[2]))])
     2419            Vpoint = [int(np.mean(refList.T[0])),int(np.mean(refList.T[1])),int(np.mean(refList.T[2]))]
     2420            controls = {'Type':'Fosq','Iscale':False,'HKLmax':Hmax,'HKLmin':Hmin,
     2421                'FoMax' : FoMax,'Scale' : 1.0,'Drawing':{'viewPoint':[Vpoint,[]],'default':Vpoint[:],
     2422                'backColor':[0,0,0],'depthFog':False,'Zclip':10.0,'cameraPos':10.,'Zstep':0.05,
     2423                'Scale':1.0,'oldxy':[],'viewDir':[1,0,0]}}
     2424            G2plt.Plot3DSngl(G2frame,newPlot=True,Data=controls,hklRef=refList,Title=phaseName)
    24142425       
    24152426    if G2frame.dataDisplay:
     
    24252436        G2frame.Bind(wx.EVT_MENU, OnSelectPhase, id=G2gd.wxID_SELECTPHASE)
    24262437        G2frame.Bind(wx.EVT_MENU, OnPlotHKL, id=G2gd.wxID_PWDHKLPLOT)
     2438        G2frame.Bind(wx.EVT_MENU, OnPlot3DHKL, id=G2gd.wxID_PWD3DHKLPLOT)
    24272439        G2frame.dataFrame.SelectPhase.Enable(False)
    24282440        if len(data) > 1:
Note: See TracChangeset for help on using the changeset viewer.