Esempio n. 1
0
class first_output_window(Tkinter.Tk):

    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent

        self.protocol("WM_DELETE_WINDOW", self.dest)
        self.main()

    def main(self):
        # prepare figure, frame, canvas
        self.fig = plt.figure(figsize=(4,4))
        self.frame = Tkinter.Frame(self)
        self.frame.grid(padx=10,pady=10)
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
        self.canvas.get_tk_widget().grid(column=0,row=0)
        # define 3D interactive plot
        self.ax = Axes3D(self.fig)
        # display 3D model on chimera's main window
        opened = chimera.openModels.open('class2_run10k_ct24_it031_class001.mrc')
        tt=chimera.runCommand('volume #0 level 0.02 color pink')
        # button widget to show the chosen angle
        self.btn = Tkinter.Button(self,text=u'Chosen angle',command=self.disp2D)        
        self.btn.grid(column=0,row=2,sticky='EW')
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)
        # button widget for computing chronos and topos
        self.btn = Tkinter.Button(self,text=u'Calculate Topos and Chronos now',command=self.disp2D)        
        self.btn.grid(column=0,row=3,sticky='EW')
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)
        # generate some fake data points
        ss = 100
        tt = 50
        phi = np.ones((ss,1))
        theta = np.ones((ss,1))
        for i in range(phi.shape[0]):
            phi[i] = random.uniform(0,2*np.pi)
            theta[i] = random.uniform(0,np.pi)
        phi1 = np.array([[0],[np.pi/2],[np.pi/20]])
        theta1 = np.array([[0],[np.pi/2],[np.pi/20]])
        phi1 = npm.repmat(phi1,tt,1)
        theta1 = npm.repmat(theta1,tt,1)
        self.p = geo.euler_to_vect(theta, phi)
        self.p1 = geo.euler_to_vect(theta1, phi1)
        self.points=[]
        # display data points on the unit sphere
        self.ax.view_init(elev=0, azim=90)
        t = self.ax.scatter(self.p[:,0], self.p[:,1], self.p[:,2],  marker='o', s=10, c="goldenrod", alpha=0.6)
        t = self.ax.scatter(self.p1[:,0],self.p1[:,1],self.p1[:,2], marker='+', s=10, c="red", alpha=0.6)
        # display data points that are in the front view
        self.disp2D()
        #
        self.canvas2 = Tkinter.Canvas(self.frame,bg="white", width=4,height=4)
        self.canvas2.configure(cursor="crosshair")
        self.canvas2.grid(column=0,row=1)
        self.canvas2.bind('<Button-1>', self.point)
        # gui grid adjustments
        #self.grid_columnconfigure(0,weight=0)
        #self.resizable(False,False)
        
    # method to update the display of points in the front view
    def disp2D(self):
        # print 1
        self.fig1 = Figure(figsize=(4,4))    
        self.ax1 = self.fig1.add_subplot(111)
        pt = geo.proj_sphere(self.ax.elev,self.ax.azim,self.p)
        pt1 = geo.proj_sphere(self.ax.elev,self.ax.azim,self.p1)
        #print self.ax.azim, self.ax.elev
        # aa = pt[:,0]
        #print aa.ndim
        #print aa.shape
        self.ax1.scatter(pt[:,0],pt[:,1],marker = 'o',c="goldenrod")
        self.ax1.scatter(pt1[:,0],pt1[:,1],marker = '+',c="red")
        self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame)
        self.canvas1.get_tk_widget().grid(column=0,row=1)
        #self.canvas2 = Tkinter.Canvas(self.frame,width=4,height=4)
        #self.canvas2.configure(cursor="crosshair")
        #self.canvas2.grid(column=0,row=1)
        #self.canvas2.bind("<Button-1>", self.point)
        cid1 = self.canvas1.mpl_connect('button_press_event', self.onclick1)
        chimera.runCommand('turn x %f'%self.ax.azim)
        print 'elev = %f, azim=%f,'%(self.ax.elev,self.ax.azim)
        return
        
    def dest(self):
        self.destroy()
        sys.exit()

    def scroll(self):
        self.canvas2=Tkinter.Canvas(self.frame)
        self.frame1=Tkinter.Frame(self.canvas2)
        self.vbar=Tkinter.Scrollbar(self.frame,orient="vertical",command=self.canvas2.yview)
        self.canvas2.configure(yscrollcommand=self.vbar.set)
        self.vbar.pack(side="right",fill="y")
        self.canvas2.pack(side='left')
        self.canvas2.create_window((0,0),window=self.frame1,anchor='nw')
        
    def point(self, event):
        self.canvas1.create_oval(event.x, event.y, event.x+1, event.y+1, fill="black")
        self.points.append(event.x)
        self.points.append(event.y)
        print event.x
        return self.points
        
    # method that reports the coordinates of the clicked point 
    def onclick(self,event):
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f,'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
    def onclick1(self,event):
        print 'x=%d, y=%d, xdata=%f, ydata=%f,'%(
            event.x, event.y, event.xdata, event.ydata)