main.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. from Tkinter import *
  2. import tkSimpleDialog
  3. import urllib
  4. import urllib2
  5. JUMP = 40
  6. MAX_WIDTH = 20 * JUMP
  7. MAX_HEIGHT = 20 * JUMP
  8. address = "http://127.0.0.1:8001"
  9. root = Tk()
  10. canvas = Canvas(root, width=MAX_WIDTH, height=MAX_HEIGHT, bg="white")
  11. canvas.pack()
  12. name = 0
  13. class FakeLayer():
  14. def __init__(self, address):
  15. self.types = {}
  16. self.sources = {}
  17. self.targets = {}
  18. self.attrs = {}
  19. def read_available_attributes(self, name):
  20. if self.types[name] == "const":
  21. return ["value"]
  22. else:
  23. return []
  24. def read_attribute(self, name, attr):
  25. return self.attr.get(name, {}).get(attr, None)
  26. def set_attribute(self, name, attr, value):
  27. self.attrs[name][attr] = value
  28. def instantiate_block(self, name, block_type):
  29. self.types[name] = block_type
  30. def instantiate_link(self, name, link_type, source, target):
  31. self.types[name] = link_type
  32. self.sources[name] = source
  33. self.targets[name] = target
  34. self.attrs[name] = {}
  35. def simulate(self):
  36. pass
  37. def step(self):
  38. pass
  39. def pause(self):
  40. pass
  41. attribute = []
  42. available_attrs = []
  43. simulation = []
  44. def poll(address):
  45. while 1:
  46. returnvalue = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": "CBD_env"}))).read()
  47. if returnvalue.startswith("AVL"):
  48. available_attrs.append(returnvalue)
  49. elif returnvalue.startswith("ATR"):
  50. attribute.append(returnvalue)
  51. elif returnvalue.startswith("SIM"):
  52. simulation.append(returnvalue)
  53. class MvLayer():
  54. def __init__(self, address):
  55. import threading
  56. self.address = address
  57. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"CBD_env"', "username": "user_manager"}))).read()
  58. threading.Thread(target=poll, args=[address])
  59. def read_available_attributes(self, name):
  60. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"read_available_attributes"', "username": "CBD_env"}))).read()
  61. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % name, "username": "CBD_env"}))).read()
  62. while not available_attrs:
  63. time.sleep(0.1)
  64. return available_attrs.pop(0)
  65. def read_attribute(self, name, attr):
  66. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"read_attribute"', "username": "CBD_env"}))).read()
  67. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % name, "username": "CBD_env"}))).read()
  68. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % attr, "username": "CBD_env"}))).read()
  69. while not attribute:
  70. time.sleep(0.1)
  71. return attribute.pop(0)
  72. def set_attribute(self, name, attr, value):
  73. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"set_attribute"', "username": "CBD_env"}))).read()
  74. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % name, "username": "CBD_env"}))).read()
  75. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % attr, "username": "CBD_env"}))).read()
  76. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % value, "username": "CBD_env"}))).read()
  77. def instantiate_block(self, name, block_type):
  78. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"instantiate"', "username": "CBD_env"}))).read()
  79. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (block_type), "username": "CBD_env"}))).read()
  80. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (name), "username": "CBD_env"}))).read()
  81. def instantiate_link(self, name, link_type, source, target):
  82. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"instantiate"', "username": "CBD_env"}))).read()
  83. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (link_type), "username": "CBD_env"}))).read()
  84. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (name), "username": "CBD_env"}))).read()
  85. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (source), "username": "CBD_env"}))).read()
  86. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % (target), "username": "CBD_env"}))).read()
  87. def simulate(self):
  88. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"simulate"', "username": "CBD_env"}))).read()
  89. def step(self):
  90. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"step"', "username": "CBD_env"}))).read()
  91. def pause(self):
  92. urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"pause"', "username": "CBD_env"}))).read()
  93. def lower(value):
  94. return value / JUMP * JUMP
  95. def upper(value):
  96. return (value / JUMP + 1) * JUMP
  97. def avg(a, b):
  98. return float(a + b) / 2
  99. class InterfaceCore():
  100. mode = ""
  101. drawn = set()
  102. refs = dict()
  103. mappings = {"+": "AdditionBlock",
  104. "-": "NegationBlock",
  105. }
  106. #mv = MvLayer(address)
  107. mv = FakeLayer(address)
  108. def set_mode(self, mode):
  109. self.mode = mode
  110. def clicked(self, event):
  111. if self.mode not in ["+", "-"]:
  112. print("Cannot create something not guaranteed to be block type!")
  113. else:
  114. if self.find((event.x, event.y)):
  115. # Something already there, so don't add, but modify
  116. lname = self.find((event.x, event.y))
  117. attrs = self.mv.read_available_attributes(lname)
  118. if not attrs:
  119. print("No attrs to manage!")
  120. for attr in attrs:
  121. old_value = self.mv.read_attribute(lname, attr)
  122. new_value = tkSimpleDialog.askstring("Attribute modification", attr, initialvalue=old_value)
  123. self.mv.set_attribute(lname, attr, new_value)
  124. else:
  125. global name
  126. x = event.x
  127. y = event.y
  128. self.mv.instantiate_block(str(name), self.mappings[self.mode])
  129. r = canvas.create_rectangle(lower(x), lower(y), upper(x), upper(y), fill="white")
  130. t = canvas.create_text(avg(lower(x), upper(x)), avg(lower(y), upper(y)), text=self.mode, fill="black")
  131. b = (lower(x), lower(y), upper(x), upper(y), str(name))
  132. self.drawn.add(b)
  133. self.refs[str(name)] = [r, t]
  134. name += 1
  135. def find(self, location):
  136. x, y = location
  137. for e in self.drawn:
  138. if (e[0] <= x and
  139. e[1] <= y and
  140. e[2] >= x and
  141. e[3] >= y):
  142. return e[4]
  143. print("Found nothing at that location!")
  144. return []
  145. def draw(self, start, end):
  146. source = self.find(start)
  147. target = self.find(end)
  148. print("Connect from %s to %s" % (source, target))
  149. if source and target:
  150. if self.mode not in ["Link", "IC"]:
  151. print("Cannot create something not guaranteed to be link type!")
  152. else:
  153. global name
  154. self.mv.instantiate_link(str(name), self.mode, source, target)
  155. self.refs[str(name)] = [canvas.create_line(start[0], start[1], end[0], end[1], fill="black", arrow=LAST)]
  156. name += 1
  157. core = InterfaceCore()
  158. def addition():
  159. core.set_mode("+")
  160. def negation():
  161. core.set_mode("-")
  162. def link():
  163. core.set_mode("Link")
  164. def clicked(event):
  165. core.clicked(event)
  166. def draw(event):
  167. global start_location
  168. start_location = (event.x, event.y)
  169. def release(event):
  170. core.draw(start_location, (event.x, event.y))
  171. def simulate():
  172. core.mv.simulate()
  173. def step():
  174. core.mv.step()
  175. def pause():
  176. core.mv.pause()
  177. Button(root, text="+", command=addition).pack()
  178. Button(root, text="-", command=negation).pack()
  179. Button(root, text="Link", command=link).pack()
  180. Button(root, text="SIM", command=simulate).pack()
  181. Button(root, text="STEP", command=step).pack()
  182. Button(root, text="PAUSE", command=pause).pack()
  183. core.canvas = canvas
  184. for i in range(JUMP, MAX_HEIGHT, JUMP):
  185. canvas.create_line(0, i, MAX_HEIGHT, i, fill="grey")
  186. for i in range(JUMP, MAX_WIDTH, JUMP):
  187. canvas.create_line(i, 0, i, MAX_WIDTH, fill="grey")
  188. canvas.bind("<Button-1>", clicked)
  189. canvas.bind("<Button-3>", draw)
  190. canvas.bind("<ButtonRelease-3>", release)
  191. root.mainloop()