Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/GrapherActivity-sugarized.py
diff options
context:
space:
mode:
Diffstat (limited to 'GrapherActivity-sugarized.py')
-rwxr-xr-xGrapherActivity-sugarized.py354
1 files changed, 354 insertions, 0 deletions
diff --git a/GrapherActivity-sugarized.py b/GrapherActivity-sugarized.py
new file mode 100755
index 0000000..4fa63b6
--- /dev/null
+++ b/GrapherActivity-sugarized.py
@@ -0,0 +1,354 @@
+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
+
+
+