Final Project files for mBed development.

Dependencies:   m3pi mbed

Committer:
alecguertin
Date:
Mon Dec 01 01:02:42 2014 +0000
Revision:
18:eab7b0e89398
Parent:
14:41fa8b95a9ab
Child:
29:459ff10d2a07
added logic to calculate angle to drive at -- untested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lsaristo 12:1aa6b8a74136 1 #!/usr/bin/python
lsaristo 14:41fa8b95a9ab 2 """"Paint program by Dave Michell.
lsaristo 12:1aa6b8a74136 3
lsaristo 14:41fa8b95a9ab 4 NOTE: A substantial portion of this code was taken from Dave Michell's
lsaristo 14:41fa8b95a9ab 5 example illustrating how to draw on a Python-generated canvas. All credit
lsaristo 14:41fa8b95a9ab 6 for those portions of the code belong to him. Below is the header from the
lsaristo 14:41fa8b95a9ab 7 original document written by him.
lsaristo 12:1aa6b8a74136 8
lsaristo 14:41fa8b95a9ab 9 # Start origin header ########################
lsaristo 14:41fa8b95a9ab 10
lsaristo 14:41fa8b95a9ab 11 Subject: tkinter "paint" example
lsaristo 14:41fa8b95a9ab 12 From: Dave Mitchell <davem@magnet.com>
lsaristo 14:41fa8b95a9ab 13 To: python-list@cwi.nl
lsaristo 14:41fa8b95a9ab 14 Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST)
lsaristo 14:41fa8b95a9ab 15
lsaristo 14:41fa8b95a9ab 16 Not too long ago (last week maybe?) someone posted a request
lsaristo 14:41fa8b95a9ab 17 for an example of a paint program using Tkinter. Try as I might
lsaristo 14:41fa8b95a9ab 18 I can't seem to find it in the archive, so i'll just post mine
lsaristo 14:41fa8b95a9ab 19 here and hope that the person who requested it sees this!
lsaristo 14:41fa8b95a9ab 20
lsaristo 14:41fa8b95a9ab 21 All this does is put up a canvas and draw a smooth black line
lsaristo 14:41fa8b95a9ab 22 whenever you have the mouse button down, but hopefully it will
lsaristo 14:41fa8b95a9ab 23 be enough to start with.. It would be easy enough to add some
lsaristo 14:41fa8b95a9ab 24 options like other shapes or colors...
lsaristo 12:1aa6b8a74136 25
lsaristo 12:1aa6b8a74136 26 yours,
lsaristo 12:1aa6b8a74136 27 dave mitchell
lsaristo 12:1aa6b8a74136 28 davem@magnet.com
lsaristo 12:1aa6b8a74136 29
lsaristo 14:41fa8b95a9ab 30 # End original header #########################
lsaristo 12:1aa6b8a74136 31
lsaristo 12:1aa6b8a74136 32 """
lsaristo 12:1aa6b8a74136 33 from Tkinter import *
lsaristo 12:1aa6b8a74136 34 import os
lsaristo 12:1aa6b8a74136 35 import sys
lsaristo 14:41fa8b95a9ab 36 import re
lsaristo 14:41fa8b95a9ab 37
lsaristo 14:41fa8b95a9ab 38 """paint.py: not exactly a paint program. just a smooth line drawing demo."""
lsaristo 12:1aa6b8a74136 39
lsaristo 12:1aa6b8a74136 40 TEMP_FILE = "canvas-temp.ps"
lsaristo 12:1aa6b8a74136 41 OUTPUT_FILE = "control.out"
lsaristo 12:1aa6b8a74136 42 b1 = "up"
lsaristo 12:1aa6b8a74136 43 xold, yold = None, None
lsaristo 12:1aa6b8a74136 44 height = 600
lsaristo 12:1aa6b8a74136 45 width = 600
lsaristo 12:1aa6b8a74136 46
lsaristo 12:1aa6b8a74136 47 class popupWindow(object):
lsaristo 12:1aa6b8a74136 48 def __init__(self,master):
lsaristo 12:1aa6b8a74136 49 top=self.top=Toplevel(master)
lsaristo 12:1aa6b8a74136 50 self.l=Label(top,text="Resize Window")
lsaristo 12:1aa6b8a74136 51 self.l.pack()
lsaristo 12:1aa6b8a74136 52 self.h=Label(top,text="Height");
lsaristo 12:1aa6b8a74136 53 self.h.pack()
lsaristo 12:1aa6b8a74136 54 self.e=Entry(top)
lsaristo 12:1aa6b8a74136 55 self.e.pack()
lsaristo 12:1aa6b8a74136 56 self.w=Label(top,text="Width");
lsaristo 12:1aa6b8a74136 57 self.w.pack()
lsaristo 12:1aa6b8a74136 58 self.f=Entry(top);
lsaristo 12:1aa6b8a74136 59 self.f.pack()
lsaristo 12:1aa6b8a74136 60 self.b=Button(top,text='Ok',command=self.cleanup)
lsaristo 12:1aa6b8a74136 61 self.b.pack()
lsaristo 12:1aa6b8a74136 62 self.master = master
lsaristo 12:1aa6b8a74136 63 def cleanup(self):
lsaristo 12:1aa6b8a74136 64 global height
lsaristo 12:1aa6b8a74136 65 global width
lsaristo 12:1aa6b8a74136 66 h = self.e.get()
lsaristo 12:1aa6b8a74136 67 w = self.f.get()
lsaristo 12:1aa6b8a74136 68 self.top.destroy()
lsaristo 12:1aa6b8a74136 69 self.master.geometry(h+"x"+w)
lsaristo 12:1aa6b8a74136 70 height = h
lsaristo 12:1aa6b8a74136 71 width = w
lsaristo 12:1aa6b8a74136 72
lsaristo 12:1aa6b8a74136 73 def loop():
lsaristo 12:1aa6b8a74136 74 root = Tk()
lsaristo 12:1aa6b8a74136 75 root.geometry("%dx%d" % (height,width))
lsaristo 12:1aa6b8a74136 76 root.title("RoboCanvas")
lsaristo 12:1aa6b8a74136 77 drawing_area = Canvas(root)
lsaristo 12:1aa6b8a74136 78 drawing_area.pack(fill=BOTH,expand=1)
lsaristo 12:1aa6b8a74136 79 drawing_area.bind("<Motion>", motion)
lsaristo 12:1aa6b8a74136 80 drawing_area.bind("<ButtonPress-1>", b1down)
lsaristo 12:1aa6b8a74136 81 drawing_area.bind("<ButtonRelease-1>", b1up)
lsaristo 12:1aa6b8a74136 82
lsaristo 12:1aa6b8a74136 83 menubar = Menu(root)
lsaristo 12:1aa6b8a74136 84 control_menu = Menu(root);
lsaristo 12:1aa6b8a74136 85 control_menu.add_command(label="Deploy ", \
lsaristo 12:1aa6b8a74136 86 command=lambda p=drawing_area: build(p));
lsaristo 12:1aa6b8a74136 87 control_menu.add_command(label="Clear Canvas",\
lsaristo 12:1aa6b8a74136 88 command=lambda p=drawing_area: p.delete('all'))
lsaristo 12:1aa6b8a74136 89 control_menu.add_command(label="Resize Canvas", command=lambda p=root:\
lsaristo 12:1aa6b8a74136 90 resize(root));
lsaristo 12:1aa6b8a74136 91 control_menu.add_separator()
lsaristo 12:1aa6b8a74136 92 control_menu.add_command(label="Exit", command=lambda p=root: root.quit())
lsaristo 14:41fa8b95a9ab 93 menubar.add_cascade(label="Control", menu=control_menu);
lsaristo 12:1aa6b8a74136 94 root.config(menu=menubar);
lsaristo 14:41fa8b95a9ab 95 message = Label(root, text="Press and hold with the mouse to draw");
lsaristo 12:1aa6b8a74136 96 message.pack(side=BOTTOM)
lsaristo 12:1aa6b8a74136 97 root.mainloop()
lsaristo 12:1aa6b8a74136 98
lsaristo 12:1aa6b8a74136 99 def resize(root):
lsaristo 12:1aa6b8a74136 100 """ Resize the root window and expand the canvas to fill """
lsaristo 12:1aa6b8a74136 101 ans = popupWindow(root);
lsaristo 12:1aa6b8a74136 102
lsaristo 12:1aa6b8a74136 103 def build(canvas):
lsaristo 12:1aa6b8a74136 104 """
lsaristo 12:1aa6b8a74136 105 This function is indended to be called from the drawing canvas after
lsaristo 12:1aa6b8a74136 106 the drawing is complete and the user wishes to push it to the robot.
lsaristo 12:1aa6b8a74136 107 This function must send (somehow) the appropriate information to the
lsaristo 12:1aa6b8a74136 108 robot to make the drawing happen.
lsaristo 12:1aa6b8a74136 109 """
lsaristo 12:1aa6b8a74136 110 gen_postscript(canvas)
lsaristo 12:1aa6b8a74136 111
lsaristo 12:1aa6b8a74136 112 def gen_postscript(canvas):
lsaristo 12:1aa6b8a74136 113 """ Make a postscript capture of the canvas """
lsaristo 12:1aa6b8a74136 114
lsaristo 12:1aa6b8a74136 115 # Get lineto and moveto data from standard postscript output.
lsaristo 12:1aa6b8a74136 116 l = []
lsaristo 12:1aa6b8a74136 117 canvas.update()
lsaristo 12:1aa6b8a74136 118 canvas.postscript(file=TEMP_FILE);
lsaristo 12:1aa6b8a74136 119 f = open(TEMP_FILE, "r")
lsaristo 12:1aa6b8a74136 120 for line in f.readlines():
lsaristo 12:1aa6b8a74136 121 if 'lineto' in line or 'moveto' in line:
lsaristo 12:1aa6b8a74136 122 l.append(line)
lsaristo 12:1aa6b8a74136 123 f.close()
lsaristo 12:1aa6b8a74136 124
lsaristo 14:41fa8b95a9ab 125 # Filter the moves list
lsaristo 14:41fa8b95a9ab 126 output = filter_moves(l)
lsaristo 12:1aa6b8a74136 127
lsaristo 12:1aa6b8a74136 128 # Write filtered output to the new canvas file.
lsaristo 12:1aa6b8a74136 129 l = l[5:]
lsaristo 12:1aa6b8a74136 130 f = open(OUTPUT_FILE, "w");
lsaristo 12:1aa6b8a74136 131 f.write(str(height) + "/" + str(width)+"\n");
lsaristo 14:41fa8b95a9ab 132 for line in output:
lsaristo 12:1aa6b8a74136 133 f.write(line);
lsaristo 12:1aa6b8a74136 134 f.close()
lsaristo 12:1aa6b8a74136 135 os.remove(TEMP_FILE);
lsaristo 12:1aa6b8a74136 136
lsaristo 14:41fa8b95a9ab 137 def filter_moves(moves):
lsaristo 14:41fa8b95a9ab 138 """ Return a processed list of moves """
lsaristo 14:41fa8b95a9ab 139
lsaristo 14:41fa8b95a9ab 140 filtered_moves = list(moves)[5:]
lsaristo 14:41fa8b95a9ab 141 output_list = []
lsaristo 14:41fa8b95a9ab 142
lsaristo 14:41fa8b95a9ab 143 prev = filtered_moves[0]
lsaristo 14:41fa8b95a9ab 144 output_list.append(prev) # Write the first moveto always.
lsaristo 14:41fa8b95a9ab 145 prev = filtered_moves[1]
lsaristo 14:41fa8b95a9ab 146 output_list.append(prev)
lsaristo 14:41fa8b95a9ab 147
lsaristo 14:41fa8b95a9ab 148 for move in filtered_moves[2:]:
lsaristo 14:41fa8b95a9ab 149 x_coord = move.split()[0]
lsaristo 14:41fa8b95a9ab 150 x_coord_prev = prev.split()[0]
lsaristo 14:41fa8b95a9ab 151 y_coord = move.split()[1]
lsaristo 14:41fa8b95a9ab 152 y_coord_prev = prev.split()[1]
lsaristo 14:41fa8b95a9ab 153
lsaristo 14:41fa8b95a9ab 154 # Remove redundant moveto's
lsaristo 14:41fa8b95a9ab 155 if x_coord != x_coord_prev or y_coord != y_coord_prev:
lsaristo 14:41fa8b95a9ab 156 output_list.append(move)
lsaristo 14:41fa8b95a9ab 157 prev = move
lsaristo 14:41fa8b95a9ab 158
lsaristo 14:41fa8b95a9ab 159 # Flatten on x-coordinate
lsaristo 14:41fa8b95a9ab 160 filtered_moves = list(output_list)
lsaristo 14:41fa8b95a9ab 161 output_list = [filtered_moves.pop(0)]
lsaristo 14:41fa8b95a9ab 162 prev = filtered_moves.pop(0)
lsaristo 14:41fa8b95a9ab 163 prev_s = prev.split()
lsaristo 14:41fa8b95a9ab 164 prev_y = prev_s[1]
lsaristo 14:41fa8b95a9ab 165 prev_x = prev_s[0]
lsaristo 14:41fa8b95a9ab 166 while filtered_moves:
lsaristo 14:41fa8b95a9ab 167 move = filtered_moves.pop(0)
lsaristo 14:41fa8b95a9ab 168 move_s = move.split()
lsaristo 14:41fa8b95a9ab 169 move_x = move_s[0]
lsaristo 14:41fa8b95a9ab 170 move_y = move_s[1]
lsaristo 14:41fa8b95a9ab 171 move_c = move_s[2]
lsaristo 14:41fa8b95a9ab 172
lsaristo 14:41fa8b95a9ab 173 if move_c == 'moveto':
lsaristo 14:41fa8b95a9ab 174 output_list.append(prev)
lsaristo 14:41fa8b95a9ab 175 prev = None
lsaristo 14:41fa8b95a9ab 176 output_list.append(move)
lsaristo 14:41fa8b95a9ab 177 continue
lsaristo 14:41fa8b95a9ab 178
lsaristo 14:41fa8b95a9ab 179 if prev and move_x == prev_x:
lsaristo 14:41fa8b95a9ab 180 prev_y = move_y
lsaristo 14:41fa8b95a9ab 181 continue
lsaristo 14:41fa8b95a9ab 182
lsaristo 14:41fa8b95a9ab 183 if prev:
lsaristo 14:41fa8b95a9ab 184 output_list.append(prev)
lsaristo 14:41fa8b95a9ab 185 prev = move
lsaristo 14:41fa8b95a9ab 186 prev_s = prev.split()
lsaristo 14:41fa8b95a9ab 187 prev_y = prev_s[1]
lsaristo 14:41fa8b95a9ab 188 prev_x = prev_s[0]
lsaristo 14:41fa8b95a9ab 189 if prev: output_list.append(prev)
lsaristo 14:41fa8b95a9ab 190
lsaristo 14:41fa8b95a9ab 191 # Flatten on y-coordinate
lsaristo 14:41fa8b95a9ab 192 filtered_moves = list(output_list)
lsaristo 14:41fa8b95a9ab 193 output_list = [filtered_moves.pop(0)]
lsaristo 14:41fa8b95a9ab 194 prev = filtered_moves.pop(0)
lsaristo 14:41fa8b95a9ab 195 prev_s = prev.split()
lsaristo 14:41fa8b95a9ab 196 prev_y = prev_s[1]
lsaristo 14:41fa8b95a9ab 197 prev_x = prev_s[0]
lsaristo 14:41fa8b95a9ab 198 while filtered_moves:
lsaristo 14:41fa8b95a9ab 199 move = filtered_moves.pop(0)
lsaristo 14:41fa8b95a9ab 200 move_s = move.split()
lsaristo 14:41fa8b95a9ab 201 move_x = move_s[0]
lsaristo 14:41fa8b95a9ab 202 move_y = move_s[1]
lsaristo 14:41fa8b95a9ab 203 move_c = move_s[2]
lsaristo 14:41fa8b95a9ab 204
lsaristo 14:41fa8b95a9ab 205 if move_c == 'moveto':
lsaristo 14:41fa8b95a9ab 206 output_list.append(prev)
lsaristo 14:41fa8b95a9ab 207 prev = None
lsaristo 14:41fa8b95a9ab 208 output_list.append(move)
lsaristo 14:41fa8b95a9ab 209 continue
lsaristo 14:41fa8b95a9ab 210
lsaristo 14:41fa8b95a9ab 211 if prev and move_y == prev_y:
lsaristo 14:41fa8b95a9ab 212 prev_x = move_x
lsaristo 14:41fa8b95a9ab 213 continue
lsaristo 14:41fa8b95a9ab 214 if prev:
lsaristo 14:41fa8b95a9ab 215 output_list.append(prev)
lsaristo 14:41fa8b95a9ab 216 prev = move
lsaristo 14:41fa8b95a9ab 217 prev_s = prev.split()
lsaristo 14:41fa8b95a9ab 218 prev_y = prev_s[1]
lsaristo 14:41fa8b95a9ab 219 prev_x = prev_s[0]
lsaristo 14:41fa8b95a9ab 220 if prev: output_list.append(prev)
lsaristo 14:41fa8b95a9ab 221
lsaristo 14:41fa8b95a9ab 222 for move in output_list:
lsaristo 14:41fa8b95a9ab 223 x_coord = move.split()[0]
lsaristo 14:41fa8b95a9ab 224 y_coord = move.split()[1]
lsaristo 14:41fa8b95a9ab 225 cmd = move.split()[2]
lsaristo 14:41fa8b95a9ab 226
lsaristo 14:41fa8b95a9ab 227 return output_list
lsaristo 14:41fa8b95a9ab 228
lsaristo 12:1aa6b8a74136 229 def b1down(event):
lsaristo 12:1aa6b8a74136 230 global b1
lsaristo 12:1aa6b8a74136 231 b1 = "down" # you only want to draw when the button is down
lsaristo 12:1aa6b8a74136 232 # because "Motion" events happen -all the time-
lsaristo 12:1aa6b8a74136 233
lsaristo 12:1aa6b8a74136 234 def b1up(event):
lsaristo 12:1aa6b8a74136 235 global b1, xold, yold
lsaristo 12:1aa6b8a74136 236 b1 = "up"
lsaristo 12:1aa6b8a74136 237 xold = None # reset the line when you let go of the button
lsaristo 12:1aa6b8a74136 238 yold = None
lsaristo 12:1aa6b8a74136 239
lsaristo 12:1aa6b8a74136 240 def motion(event):
lsaristo 12:1aa6b8a74136 241 if b1 == "down":
lsaristo 12:1aa6b8a74136 242 global xold, yold
lsaristo 12:1aa6b8a74136 243 if xold is not None and yold is not None:
lsaristo 12:1aa6b8a74136 244 event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE)
lsaristo 12:1aa6b8a74136 245 xold = event.x
lsaristo 12:1aa6b8a74136 246 yold = event.y
lsaristo 12:1aa6b8a74136 247
lsaristo 12:1aa6b8a74136 248 def main():
lsaristo 12:1aa6b8a74136 249 """ Main program entry point """
lsaristo 12:1aa6b8a74136 250 loop()
lsaristo 12:1aa6b8a74136 251
lsaristo 12:1aa6b8a74136 252 if __name__ == "__main__":
lsaristo 12:1aa6b8a74136 253 main()