import logging from sugar.activity import activity import pygtk pygtk.require('2.0') import gtk import cairo import graphs as graph import math class GrapherActivity(activity.Activity): def delete_event(self, widget, event, data=None): print "delete event occurred" return False def destroy(self, widget, data=None): print "destroy signal occurred" gtk.main_quit() def __init__(self,handle): activity.Activity.__init__(self,handle) self.set_title('Grapher Activity') self.buildGUI() self.graphs = {"Function": [], "Polar": [], "Parametric": []} self.Graphs = [] self.settings = {"degrees": False, "width": 3*self.X/4, "height": self.Y, "xmin": -10, "xmax": 10, "ymin": -10, "ymax": 10, "thetamin" : 0, "thetamax" : 2*math.pi, "tmin": -10, "tmax": 10, "points": 1000, "mode": "Polar"} self.axis = graph.Axis(self.settings) gtk.main() def buildGUI(self): self.X = self.window.get_screen().get_width() self.Y = self.window.get_screen().get_height() self.table = gtk.Table(2,2) self.table.show() self.drawing_area = gtk.DrawingArea() self.table.attach(self.drawing_area,0,1,0,2) self.drawing_area.set_size_request(3*self.X/4, self.Y) self.drawing_area.show() self.drawing_area.connect("expose_event", self.expose) #creat the settings panel frame = gtk.Frame("Settings") self.table.attach(frame,1,2,1,2) frame.show() frame.set_size_request(self.X/4,self.Y/2) settings_table = gtk.Table(2,12,False) frame.add(settings_table) settings_table.show() self.Xminlabel = gtk.Label("X Min") self.Xmaxlabel = gtk.Label("X Max") self.Yminlabel = gtk.Label("Y Min") self.Ymaxlabel = gtk.Label("Y Max") self.Thetaminlabel = gtk.Label("Theta Min") self.Thetamaxlabel = gtk.Label("Theta Max") self.Tminlabel = gtk.Label("T Min") self.Tmaxlabel = gtk.Label("T Max") self.numPointslabel = gtk.Label("Number of Points") settings_table.attach(self.Xminlabel,0,1,0,1) settings_table.attach(self.Xmaxlabel,0,1,1,2) settings_table.attach(self.Yminlabel,0,1,2,3) settings_table.attach(self.Ymaxlabel,0,1,3,4) settings_table.attach(self.Thetaminlabel,0,1,4,5) settings_table.attach(self.Thetamaxlabel,0,1,5,6) settings_table.attach(self.Tminlabel,0,1,6,7) settings_table.attach(self.Tmaxlabel,0,1,7,8) settings_table.attach(self.numPointslabel,0,1,8,9) self.Xminlabel.show() self.Xmaxlabel.show() self.Yminlabel.show() self.Ymaxlabel.show() self.numPointslabel.show() self.Xmin = gtk.Entry() self.Xmax = gtk.Entry() self.Ymin = gtk.Entry() self.Ymax = gtk.Entry() self.Thetamin = gtk.Entry() self.Thetamax = gtk.Entry() self.Tmin = gtk.Entry() self.Tmax = gtk.Entry() self.numPoints = gtk.Entry() self.Xmin.set_text("-10") self.Xmax.set_text("10") self.Ymin.set_text("-10") self.Ymax.set_text("10") self.Thetamin.set_text("0") self.Thetamax.set_text("6.283") self.Tmin.set_text("-10") self.Tmax.set_text("10") self.numPoints.set_text("600") settings_table.attach(self.Xmin,1,2,0,1) settings_table.attach(self.Xmax,1,2,1,2) settings_table.attach(self.Ymin,1,2,2,3) settings_table.attach(self.Ymax,1,2,3,4) settings_table.attach(self.Thetamin,1,2,4,5) settings_table.attach(self.Thetamax,1,2,5,6) settings_table.attach(self.Tmin,1,2,6,7) settings_table.attach(self.Tmax,1,2,7,8) settings_table.attach(self.numPoints,1,2,8,9) self.Xmin.show() self.Xmax.show() self.Ymin.show() self.Ymax.show() self.numPoints.show() self.Thetamin.hide() self.Thetamax.hide() self.Thetaminlabel.hide() self.Thetamaxlabel.hide() self.radians = gtk.CheckButton("Radians") self.degrees = gtk.CheckButton("Degrees") settings_table.attach(self.radians,0,1,9,10) settings_table.attach(self.degrees,1,2,9,10) self.radians.show() self.degrees.show() self.degrees.set_active(True) self.radians.connect("toggled",self.radians_clicked) self.degrees.connect("toggled",self.degrees_clicked) self.grapherButton = gtk.Button("Graph") settings_table.attach(self.grapherButton,0,2,10,12) self.grapherButton.show() self.grapherButton.connect("clicked", self.expose, None) self.notebook = gtk.Notebook() self.table.attach(self.notebook,1,2,0,1) self.notebook.set_size_request(self.X/4,self.Y/2) self.notebook.show() self.notebook.connect("switch-page", self.mode_changed, None) #Creat Function Notebook page self.func_table = gtk.Table(2,5,False) label = gtk.Label("Function") self.notebook.append_page(self.func_table,label) label.show() self.func_table.show() self.FunctionTexts = [] i = 0 while i < 5: label = gtk.Label("Y"+str(i+1)+" = ") self.func_table.attach(label,0,1,i,i+1) label.show() textbox = gtk.Entry() self.FunctionTexts.append(textbox) self.func_table.attach(textbox,1,2,i,i+1) textbox.show() i+= 1 #Creat Polar Notebook page self.polar_table = gtk.Table(2,8,False) label = gtk.Label("Polar") self.notebook.append_page(self.polar_table,label) label.show() self.polar_table.show() self.PolarTexts = [] i = 0 while i < 5: label = gtk.Label("R"+str(i+1)+" = ") self.polar_table.attach(label,0,1,i,i+1) label.show() textbox = gtk.Entry() self.PolarTexts.append(textbox) self.polar_table.attach(textbox,1,2,i,i+1) textbox.show() i+= 1 #Creat Parametric Notebook page self.parametric_table = gtk.Table(2,8,False) label = gtk.Label("Parametric") self.notebook.append_page(self.parametric_table,label) label.show() self.parametric_table.show() self.ParametricTexts = [] i = 0 while i < 4: label1 = gtk.Label("X"+str(i+1)+" = ") label2 = gtk.Label("Y"+str(i+1)+" = ") self.parametric_table.attach(label1,0,1,2*i,2*i+1) self.parametric_table.attach(label2,0,1,2*i+1,2*i+2) label1.show() label2.show() textboxX = gtk.Entry() textboxY = gtk.Entry() self.ParametricTexts.append((textboxX,textboxY)) self.parametric_table.attach(textboxX,1,2,2*i,2*i+1) self.parametric_table.attach(textboxY,1,2,2*i+1,2*i+2) textboxX.show() textboxY.show() i+= 1 self.set_canvas(self.table) self.show_all() def graph_clicked(self, widget=None, data=None): self.grapher() def grapher(self): self.Graphs = [] self.update_settings() self.update_graphs() self.axis = graph.Axis(self.settings) num = 0 if self.settings["mode"] == "Function": for g in self.graphs["Function"]: self.Graphs.append(graph.FunctionGraph(g, self.settings, num)) num += 1 if self.settings["mode"] == "Polar": for g in self.graphs["Polar"]: self.Graphs.append(graph.PolarGraph(g, self.settings, num)) num += 1 if self.settings["mode"] == "Parametric": for g in self.graphs["Parametric"]: self.Graphs.append(graph.ParametricGraph(g[0],g[1], self.settings, num)) num += 1 self.axis.draw(self.context) for g in self.Graphs: g.draw(self.context) def mode_changed(self, notebook, page, page_num, data): if page_num == 0: self.Thetamin.hide() self.Thetamax.hide() self.Thetaminlabel.hide() self.Thetamaxlabel.hide() self.Tmin.hide() self.Tmax.hide() self.Tminlabel.hide() self.Tmaxlabel.hide() if page_num == 1: self.Thetamin.show() self.Thetamax.show() self.Thetaminlabel.show() self.Thetamaxlabel.show() self.Tmin.hide() self.Tmax.hide() self.Tminlabel.hide() self.Tmaxlabel.hide() if page_num == 2: self.Thetamin.hide() self.Thetamax.hide() self.Thetaminlabel.hide() self.Thetamaxlabel.hide() self.Tmin.show() self.Tmax.show() self.Tminlabel.show() self.Tmaxlabel.show() def update_settings(self): self.settings["xmin"] = float(self.Xmin.get_text()) self.settings["xmax"] = float(self.Xmax.get_text()) self.settings["ymin"] = float(self.Ymin.get_text()) self.settings["ymax"] = float(self.Ymax.get_text()) self.settings["thetamin"] = float(self.Thetamin.get_text()) self.settings["thetamax"] = float(self.Thetamax.get_text()) self.settings["tmin"] = float(self.Tmin.get_text()) self.settings["tmax"] = float(self.Tmax.get_text()) self.settings["points"] = float(self.numPoints.get_text()) self.settings["degrees"] = self.degrees.get_active() mode = self.notebook self.settings["mode"] = mode.get_tab_label_text(mode.get_nth_page(mode.get_current_page())) if self.settings["xmin"] > self.settings["xmax"]: self.settings["xmax"] = 10 self.settings["xmin"] = -10 self.Xmax.set_text("10") self.Xmin.set_text("-10") if self.settings["ymin"] > self.settings["ymax"]: self.settings["ymax"] = 10 self.settings["ymin"] = -10 self.Ymax.set_text("10") self.Ymin.set_text("-10") def update_graphs(self): self.graphs = {"Function": [], "Polar": [], "Parametric": []} for textBox in self.FunctionTexts: graph = textBox.get_text() if graph != "": self.graphs["Function"].append(graph) for textBox in self.PolarTexts: graph = textBox.get_text() if graph != "": self.graphs["Polar"].append(graph) for textBoxs in self.ParametricTexts: Xgraph = textBoxs[0].get_text() Ygraph = textBoxs[1].get_text() if Xgraph != "" and Ygraph != "": self.graphs["Parametric"].append([Xgraph, Ygraph]) def radians_clicked(self, data): value = self.radians.get_active() if value: self.degrees.set_active(False) else: self.degrees.set_active(True) def degrees_clicked(self, data): value = self.degrees.get_active() if value: self.radians.set_active(False) else: self.radians.set_active(True) def expose(self, widget, event): self.context = self.drawing_area.window.cairo_create() # set a clip region for the expose event self.context.rectangle(0, 0, *self.drawing_area.window.get_size()) self.context.clip() self.context.set_source_rgb(1, 1, 1) self.context.rectangle(0, 0, *self.drawing_area.window.get_size()) self.context.fill() self.context.set_source_rgb(0, 0, 0) self.grapher() return False