All pastes #190819 Raw Edit

Something

public text v1 · immutable
·published 2006-10-04 10:38 UTC
rendered paste body
# Graphing lalalala
# CREDITS TO HAMAD... LALALALA
# SHALALALALALALALALALALALALALALALAT!!!
# By PEACEYALL(AT)gmail.com

import wx
import math, cmath
import time

ID_VG = wx.NewId()
ID_CO = wx.NewId()
ID_PS = wx.NewId()
ID_PenS = wx.NewId()

class DrawArea(wx.Window):
	
	def __init__(self, parent, title):
		wx.Window.__init__(self, parent)
		self.data = [(1, (0, 0), (0, 0), (0, 0, 0), 2, wx.SOLID)]
		self.title = title
		self.titleFont = wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)
		self.grid = 1
		
		self.InitBuffer()
		
		self.Bind(wx.EVT_PAINT, self.OnPaint)
		self.Bind(wx.EVT_SIZE, self.OnSize)
		
	def OnSize(self, event):
		self.InitBuffer()
		
	def OnPaint(self, event):
		dc = wx.BufferedPaintDC(self, self.buffer)
		
	def GetData(self):
		return self.data	
		
	def SetData(self, type_, arg1, arg2, arg3, arg4, arg5):
		self.data.append((type_, arg1, arg2, arg3, arg4, arg5))
		dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
		self.DrawGraph(dc)
		
	def OpenFile(self, FileName):
		file = open(FileName, 'r').read().replace(' ', '')
		split = file.split('\n')
		for n in split:
			if n == '':
				pass;
			else:
				Esplit = n.split("||")
				print Esplit
				type_ = Esplit[0]
				if type_ == '': type_ = 0;
				type_ = int(type_)
				
				colour_Tmp = Esplit[2].replace('(', '').replace(')', '')
				c = [int(n) for n in colour_Tmp.split(',')]
				
				ps = int(Esplit[3])
				style = Esplit[4]
				
				if type_ == 0:
					pass;
					
				if type_ == 1:
					a = Esplit[1]
					a = a.split('|')
					self.SetData(type_, (float(a[0]), float(a[1])), (float(a[2]), float(a[3])), (c[0], c[1], c[2]), ps, eval(style))
				else:
					a = Esplit[1]
					a = a.split('|')
					n = [int(n) for n in a[1].split('->')]
					x = a[0]
					self.SetData(type_, n, x, (c[0], c[1], c[2]), ps, eval(style))
					
				
	def SaveFile(self, FileName):
		file_w = open(FileName, 'w')
		s = self.GetData()
		for n in s:
			type_ = n[0]
			if type_ == 1:
				x1, y1 = n[1]
				x2, y2 = n[2]
				colour = n[3]
				pointS = n[4]
				style = n[5]
				
				file_w.write("\n%s || %s | %s | %s | %s || %s || %s || %s" % (type_, x1, y1, x2, y2, colour, pointS, style) )
				
			else:
				NoP, eq = n[1], n[2]
				colour = n[3]
				pointS = n[4]
				style = n[5]
				file_w.write("\n%s || %s | %s -> %s || %s || %s || %s" % (type_, eq, NoP[0], NoP[1], colour, pointS, style) )
				
				
		
		
	def SetGrid(self, value):
		self.grid = value
		dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
		self.DrawGraph(dc)
		
	def ClearData(self):
		self.data = [(1, (0, 0), (0, 0), (0, 0, 0), 2, wx.SOLID)]
		dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
		self.DrawGraph(dc)
	
	def InitBuffer(self):
		w, h = self.GetClientSize()
		self.buffer = wx.EmptyBitmap(w, h)
		dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
		self.DrawGraph(dc)
		
	def DrawGraph(self, dc):
		spacer = 10
		scaledmax = 120.0
		
		dc.SetBackground(wx.Brush((255, 255, 255)))
		dc.Clear()
		w, h = dc.GetSize()
		dc.SetFont(self.titleFont)
		tw, th = dc.GetTextExtent(self.title)
		dc.DrawText(self.title, (w-tw)/2, spacer)
		
		th = th + 2*spacer      #  <--
		cx = w/2		#     | Finding the center point
		cy = (h-th)/2 + th	#  <--
		print "------"
		print "Center Point: ", cy
		
		mindim = min(cx, (h-th)/2) #  <--  Calculating the
		scale = mindim/scaledmax   #  <--  scale factor
		
		if self.grid == 1:
			dc.SetPen(wx.Pen("grey", 1))
			for n in range(10, 120, 10):
				dc.DrawLine((cx-n*scale), cy-110*scale, (cx-n*scale), (cy+110*scale)+2)
				dc.DrawLine((cx+n*scale)+1, cy-110*scale, (cx+n*scale)+1, (cy+110*scale)+2)
				
				dc.DrawLine(cx-110*scale, cy-n*scale, (cx+110*scale)+2, cy-n*scale)
				dc.DrawLine(cx-110*scale, (cy+n*scale)+1, (cx+110*scale)+2, (cy+n*scale)+1)
			
			
		dc.SetPen(wx.Pen("black", 2))
		dc.DrawLine(cx-110*scale, cy, cx+110*scale, cy)
		dc.DrawLine(cx, cy-110*scale, cx, cy+110*scale)
		
		
		print "(%s, %s) (%s, %s)" % (str(cx-110*scale), str(cy), str(cx+110*scale), str(cy))
		print "(%s, %s) (%s, %s)" % (str(cx), str(cy-110*scale), str(cx), str(cy+110*scale))
		
		dc.SetPen(wx.Pen("black", 2))
		print "App Center x, y: (%s, %s)" % (w/2, h/2)
		#x1, y1 = (0, 0)
		#x2, y2 = (0, 70)
		print self.GetData()
		for n in self.GetData():
			try:
				type_ = n[0]
				if type_ == 1:
					print n
					x1, y1 = n[1]
					x2, y2 = n[2]
					colour = n[3]
					ps = n[4]
					style = n[5]
					dc.SetPen(wx.Pen(colour, ps, style))
					print "x1:", x1, "y1:", y1, "x2:", x2, "y2:", y2
					dc.DrawLines([wx.Point(x1*scale, -y1*scale), wx.Point(x2*scale, -y2*scale)], (w/2)+0.5, (h/2)+(spacer+8))
				if type_ == 21:
					s, NoP, d, c, ps, s = n
					dc.SetPen(wx.Pen(c, ps, s))
					x = range(int(NoP[0]), int(NoP[-1]))
					for y in x:
						eq = eval(d)
						dc.DrawLines([(eq*scale, -y*scale), (eq*scale, -y*scale)], (w/2)+0.5, (h/2)+(spacer+8))
						
				if type_ == 22:
					s, NoP, d, c, ps, s = n
					dc.SetPen(wx.Pen(c, ps, s))
					y = range(int(NoP[0]), int(NoP[-1]))
					for x in y:
						eq = eval(d)
						dc.DrawLines([(x*scale, -eq*scale), (x*scale, -eq*scale)], (w/2)+0.5, (h/2)+(spacer+8))
			
			except:
				self.data.remove(n)
				a = "Error in format. Removed from list."
				raise a;
					
		
		
class MainFrame(wx.Frame):
	
	def __init__(self):
		wx.Frame.__init__(self, None, title = "Graphing Program")
		
		self.graph = DrawArea(self, "The Ultimate Graph!")
		self.colour = (0, 0, 0)
		self.PointSize = 2
		self.PenStyle = wx.SOLID
		self.Colourdata = None
		
		self.sMenu = wx.Menu()
		self.sMenu.AppendCheckItem(ID_VG, "View Grid")
		self.sMenu.Check(ID_VG, 1)
		self.sMenu.Append(ID_CO, "Set Colour")
		self.sMenu.Append(ID_PS, "Set Point Size")
		self.sMenu.Append(ID_PenS, "Set Pen Style")
		
		self.fMenu = wx.Menu()
		open_f = self.fMenu.Append(-1, "Open Saved GPH File")
		save_f = self.fMenu.Append(-1, "Save As GPH File")
		
		
		mb = wx.MenuBar()
		mb.Append(self.fMenu, "&File")
		mb.Append(self.sMenu, "S&ettings")
		
		wx.EVT_MENU(self, ID_VG, self.OnViewGrid)
		wx.EVT_MENU(self, ID_CO, self.OnColour)
		wx.EVT_MENU(self, ID_PS, self.OnPointSize)
		wx.EVT_MENU(self, ID_PenS, self.OnPenStyle)
		self.Bind(wx.EVT_MENU, self.OnOpen, open_f)
		self.Bind(wx.EVT_MENU, self.OnSave, save_f)
		
		self.txtc1 = wx.TextCtrl(self, -1)
		self.txtc1.SetValue("x1 | y1")
		self.txtc2 = wx.TextCtrl(self, -1)
		self.txtc2.SetValue("x2 | y2")
		self.txtXY = wx.TextCtrl(self, -1)
		self.txtXY.SetValue("X or Y")
		self.txtEQ = wx.TextCtrl(self, -1)
		self.txtEQ.SetValue("x")
		self.txtNP = wx.TextCtrl(self, -1)
		self.txtNP.SetValue("x -> y")
		
		graph_btn = wx.Button(self, -1, "Graph!")
		clear_btn = wx.Button(self, -1, "Clear")
		
		self.lineRB = wx.RadioButton(self, -1, "(x | y)")
		self.lineRB.SetValue(1)
		self.eqRB = wx.RadioButton(self, -1, "Equation")
		
		box_v = wx.BoxSizer(wx.VERTICAL)
		box_h = wx.BoxSizer(wx.HORIZONTAL)
		box_h2 = wx.BoxSizer(wx.HORIZONTAL)
		box_h3 = wx.BoxSizer(wx.HORIZONTAL)
		
		box_v.Add(self.graph, 1, wx.EXPAND|wx.ALL, 5)
		box_v.AddSizer(box_h, 0, wx.ALIGN_CENTER|wx.ALL)
		box_v.AddSizer(box_h2, 0, wx.ALIGN_CENTER|wx.ALL)
		box_v.AddSizer(box_h3, 0, wx.ALIGN_CENTER|wx.ALL)
		
		box_h.Add(self.lineRB, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h.Add(self.txtc1, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h.Add(self.txtc2, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		
		box_h2.Add(self.eqRB, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h2.Add(self.txtXY, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h2.Add(self.txtEQ, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h2.Add(self.txtNP, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		
		box_h3.Add(graph_btn, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		box_h3.Add(clear_btn, 0, wx.ALIGN_CENTER|wx.ALL, 5)
		
		self.Bind(wx.EVT_BUTTON, self.OnGraph, graph_btn)
		self.Bind(wx.EVT_BUTTON, self.OnClear, clear_btn)
		
		self.SetSizer(box_v)
		self.Layout()
		
		self.SetMenuBar(mb)
		self.Maximize(1)
		self.Show(1)
		
	def OnGraph(self, event):
		if self.lineRB.GetValue():
			try:
				x1, y1 = self.txtc1.GetValue().replace(' ', '').split('|')
				x2, y2 = self.txtc2.GetValue().replace(' ', '').split('|')
				self.graph.SetData(1, ( eval(x1), eval(y1) ), ( eval(x2), eval(y2) ), self.colour, self.PointSize, self.PenStyle )
			except:
				self.NewMessageDialog("Invalid Syntax", "Syntax Error", wx.OK|wx.ICON_ERROR)
			
		if self.eqRB.GetValue():
			try:
				nTmp = self.txtNP.GetValue().replace(' ', '')
				n = nTmp.split('->')
				x = self.txtEQ.GetValue()
				
				if self.txtXY.GetValue().lower() == 'x':
					self.graph.SetData(21, n, x, self.colour, self.PointSize, self.PenStyle)
					
				if self.txtXY.GetValue().lower() == 'y':
					self.graph.SetData(22, n, x, self.colour, self.PointSize, self.PenStyle)
					
			except:
				self.NewMessageDialog("Invalid Syntax", "Syntax Error", wx.OK|wx.ICON_ERROR)
				
				
	def OnClear(self, event):
		self.graph.ClearData()
		
	
	def OnViewGrid(self, event):
		if self.sMenu.IsChecked(ID_VG):
			self.graph.SetGrid(1)
			self.sMenu.Check(ID_VG, 1)
			
		else:
			self.graph.SetGrid(0)
			self.sMenu.Check(ID_VG, 0)
			
	def OnOpen(self, event):
		fd = wx.FileDialog(self, "Choose the GPH File...", '', '', "All Files (*.*)|*.*", wx.OPEN)
		if fd.ShowModal() == wx.ID_OK:
			try:
				self.graph.OpenFile(fd.GetPath())
			except:
				self.NewMessageDialog("The file you have chosen is corrupt, please ensure that it is a correct file.", "Corrupt File", wx.OK|wx.ICON_ERROR)

		fd.Destroy()
		
	def OnSave(self, event):
		fd = wx.FileDialog(self, "Select where to save the file...", '', '', "All Files (*.*)|*.*", wx.SAVE|wx.OVERWRITE_PROMPT)
		if fd.ShowModal() == wx.ID_OK:
			try:
				self.graph.SaveFile(fd.GetPath())
			except:
				self.NewMessageDialog("Could not save to file/folder. Make sure you have permission.", "Saving Failed", wx.OK|wx.ICON_ERROR)
		fd.Destroy()
			
	def NewMessageDialog(self, text, title, style):
		md = wx.MessageDialog(self, text, title, style = style)
		md.ShowModal()
		md.Destroy()
		
	def OnColour(self, event):
		cd = wx.ColourDialog(self, self.Colourdata)
		if cd.ShowModal() == wx.ID_OK:
			self.Colourdata = cd.GetColourData()
			self.colour = cd.GetColourData().GetColour()
		cd.Destroy()
		
	def OnPointSize(self, event):
		td = wx.TextEntryDialog(self, "Enter the Point Size you desire in pixels: ", "Point Width", str(self.PointSize))
		if td.ShowModal() == wx.ID_OK:
			self.PointSize = eval(td.GetValue())
		td.Destroy()
		
	def OnPenStyle(self, event):
		td = wx.TextEntryDialog(self, "Enter the Pen Style you would like to use. ( Make sure it is a correct value. ) ", "Pen Style", str(self.PenStyle))
		if td.ShowModal() == wx.ID_OK:
			self.PenStyle = eval(td.GetValue())
		td.Destroy()
					
			
		
		
			
		
app = wx.PySimpleApp()
frame = MainFrame()
app.MainLoop()