Final Project files for mBed development.

Dependencies:   m3pi mbed

Committer:
lsaristo
Date:
Fri Dec 19 03:47:18 2014 +0000
Revision:
46:a3b9c0fe8f36
Parent:
36:f25de790ea0b
Changed postscript file name to control.ps instead.

Who changed what in which revision?

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