particle_interaction_vis.py 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe and Joeri Exelmans
  3. Date: Tue Jan 26 10:23:07 2016
  4. Model author: Simon Van Mierlo
  5. Model name: Particle Interaction
  6. Model description:
  7. Visualization of Particle Interaction Simulation
  8. """
  9. from python_runtime.statecharts_core import *
  10. import Tkinter as tk
  11. from tkinter_widget import TkinterWidget
  12. # package "Particle Interaction"
  13. class MainApp(RuntimeClassBase):
  14. def __init__(self, controller, root, resolution):
  15. RuntimeClassBase.__init__(self, controller)
  16. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  17. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  18. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  19. self.semantics.priority = StatechartSemantics.SourceParent
  20. self.semantics.concurrency = StatechartSemantics.Single
  21. # Call user defined constructor
  22. MainApp.user_defined_constructor(self, root, resolution)
  23. def user_defined_constructor(self, root, resolution):
  24. self.nr_of_fields = 0
  25. self.root = root
  26. self.resolution = resolution
  27. def user_defined_destructor(self):
  28. pass
  29. def initializeStatechart(self):
  30. self.current_state[self.Root] = []
  31. self.current_state[self.Root_main] = []
  32. self.current_state[self.Root_main_main_behaviour] = []
  33. self.current_state[self.Root_main_creating_behaviour] = []
  34. self.current_state[self.Root_main_deleting_behaviour] = []
  35. # Enter default state
  36. self.enterDefault_Root_main()
  37. # Unique IDs for all statechart nodes
  38. Root = 0
  39. Root_main = 1
  40. Root_main_main_behaviour = 2
  41. Root_main_creating_behaviour = 3
  42. Root_main_deleting_behaviour = 4
  43. Root_main_main_behaviour_initializing = 5
  44. Root_main_main_behaviour_running = 6
  45. Root_main_creating_behaviour_waiting = 7
  46. Root_main_creating_behaviour_creating = 8
  47. Root_main_deleting_behaviour_waiting = 9
  48. Root_main_deleting_behaviour_deleting = 10
  49. Root_stopped = 11
  50. # Statechart enter/exit action method(s)
  51. def enter_Root_main(self):
  52. self.current_state[self.Root].append(self.Root_main)
  53. def exit_Root_main(self):
  54. self.exit_Root_main_main_behaviour()
  55. self.exit_Root_main_creating_behaviour()
  56. self.exit_Root_main_deleting_behaviour()
  57. self.current_state[self.Root] = []
  58. def enter_Root_main_main_behaviour(self):
  59. self.current_state[self.Root_main].append(self.Root_main_main_behaviour)
  60. def exit_Root_main_main_behaviour(self):
  61. if self.Root_main_main_behaviour_initializing in self.current_state[self.Root_main_main_behaviour]:
  62. self.exit_Root_main_main_behaviour_initializing()
  63. if self.Root_main_main_behaviour_running in self.current_state[self.Root_main_main_behaviour]:
  64. self.exit_Root_main_main_behaviour_running()
  65. self.current_state[self.Root_main] = []
  66. def enter_Root_main_creating_behaviour(self):
  67. self.current_state[self.Root_main].append(self.Root_main_creating_behaviour)
  68. def exit_Root_main_creating_behaviour(self):
  69. if self.Root_main_creating_behaviour_waiting in self.current_state[self.Root_main_creating_behaviour]:
  70. self.exit_Root_main_creating_behaviour_waiting()
  71. if self.Root_main_creating_behaviour_creating in self.current_state[self.Root_main_creating_behaviour]:
  72. self.exit_Root_main_creating_behaviour_creating()
  73. self.current_state[self.Root_main] = []
  74. def enter_Root_main_deleting_behaviour(self):
  75. self.current_state[self.Root_main].append(self.Root_main_deleting_behaviour)
  76. def exit_Root_main_deleting_behaviour(self):
  77. if self.Root_main_deleting_behaviour_waiting in self.current_state[self.Root_main_deleting_behaviour]:
  78. self.exit_Root_main_deleting_behaviour_waiting()
  79. if self.Root_main_deleting_behaviour_deleting in self.current_state[self.Root_main_deleting_behaviour]:
  80. self.exit_Root_main_deleting_behaviour_deleting()
  81. self.current_state[self.Root_main] = []
  82. def enter_Root_main_main_behaviour_initializing(self):
  83. self.raiseInternalEvent(Event("create_field", None, []))
  84. self.current_state[self.Root_main_main_behaviour].append(self.Root_main_main_behaviour_initializing)
  85. def exit_Root_main_main_behaviour_initializing(self):
  86. self.current_state[self.Root_main_main_behaviour] = []
  87. def enter_Root_main_main_behaviour_running(self):
  88. self.current_state[self.Root_main_main_behaviour].append(self.Root_main_main_behaviour_running)
  89. def exit_Root_main_main_behaviour_running(self):
  90. self.current_state[self.Root_main_main_behaviour] = []
  91. def enter_Root_main_creating_behaviour_waiting(self):
  92. self.current_state[self.Root_main_creating_behaviour].append(self.Root_main_creating_behaviour_waiting)
  93. def exit_Root_main_creating_behaviour_waiting(self):
  94. self.current_state[self.Root_main_creating_behaviour] = []
  95. def enter_Root_main_creating_behaviour_creating(self):
  96. self.current_state[self.Root_main_creating_behaviour].append(self.Root_main_creating_behaviour_creating)
  97. def exit_Root_main_creating_behaviour_creating(self):
  98. self.current_state[self.Root_main_creating_behaviour] = []
  99. def enter_Root_main_deleting_behaviour_waiting(self):
  100. self.current_state[self.Root_main_deleting_behaviour].append(self.Root_main_deleting_behaviour_waiting)
  101. def exit_Root_main_deleting_behaviour_waiting(self):
  102. self.current_state[self.Root_main_deleting_behaviour] = []
  103. def enter_Root_main_deleting_behaviour_deleting(self):
  104. self.current_state[self.Root_main_deleting_behaviour].append(self.Root_main_deleting_behaviour_deleting)
  105. def exit_Root_main_deleting_behaviour_deleting(self):
  106. self.current_state[self.Root_main_deleting_behaviour] = []
  107. def enter_Root_stopped(self):
  108. self.root.quit()
  109. self.current_state[self.Root].append(self.Root_stopped)
  110. def exit_Root_stopped(self):
  111. self.current_state[self.Root] = []
  112. # Statechart enter/exit default method(s)
  113. def enterDefault_Root_main(self):
  114. self.enter_Root_main()
  115. self.enterDefault_Root_main_main_behaviour()
  116. self.enterDefault_Root_main_creating_behaviour()
  117. self.enterDefault_Root_main_deleting_behaviour()
  118. def enterDefault_Root_main_main_behaviour(self):
  119. self.enter_Root_main_main_behaviour()
  120. self.enter_Root_main_main_behaviour_initializing()
  121. def enterDefault_Root_main_creating_behaviour(self):
  122. self.enter_Root_main_creating_behaviour()
  123. self.enter_Root_main_creating_behaviour_waiting()
  124. def enterDefault_Root_main_deleting_behaviour(self):
  125. self.enter_Root_main_deleting_behaviour()
  126. self.enter_Root_main_deleting_behaviour_waiting()
  127. # Statechart transitions
  128. def generateCandidatesChildren_Root(self):
  129. if self.current_state[self.Root][0] == self.Root_main:
  130. return self.generateCandidates_Root_main()
  131. elif self.current_state[self.Root][0] == self.Root_stopped:
  132. return self.generateCandidates_Root_stopped()
  133. return False
  134. def generateCandidates_Root(self):
  135. if not self.combo_step.isArenaChanged(self.Root):
  136. return self.generateCandidatesChildren_Root()
  137. else:
  138. return True
  139. def generateCandidatesChildren_Root_main(self):
  140. branch_done = False
  141. branch_done = (self.generateCandidates_Root_main_main_behaviour() or branch_done)
  142. branch_done = (self.generateCandidates_Root_main_creating_behaviour() or branch_done)
  143. branch_done = (self.generateCandidates_Root_main_deleting_behaviour() or branch_done)
  144. return branch_done
  145. def generateCandidatesCurrent_Root_main(self):
  146. enabled_events = self.getEnabledEvents()
  147. for e in enabled_events:
  148. if e.name == "stop":
  149. self.small_step.addCandidate(self.transition_Root_main_1, e.parameters)
  150. return True
  151. return False
  152. def generateCandidates_Root_main(self):
  153. if not self.combo_step.isArenaChanged(self.Root_main):
  154. branch_done = False
  155. if self.semantics.priority == StatechartSemantics.SourceParent:
  156. branch_done = self.generateCandidatesCurrent_Root_main()
  157. if not branch_done:
  158. branch_done = self.generateCandidatesChildren_Root_main()
  159. elif self.semantics.priority == StatechartSemantics.SourceChild:
  160. branch_done = self.generateCandidatesChildren_Root_main()
  161. if not branch_done:
  162. branch_done = self.generateCandidatesCurrent_Root_main()
  163. return branch_done
  164. else:
  165. return True
  166. def transition_Root_main_1(self, parameters):
  167. self.exit_Root_main()
  168. self.combo_step.setArenaChanged(self.Root)
  169. self.enter_Root_stopped()
  170. def generateCandidatesChildren_Root_main_main_behaviour(self):
  171. if self.current_state[self.Root_main_main_behaviour][0] == self.Root_main_main_behaviour_initializing:
  172. return self.generateCandidates_Root_main_main_behaviour_initializing()
  173. elif self.current_state[self.Root_main_main_behaviour][0] == self.Root_main_main_behaviour_running:
  174. return self.generateCandidates_Root_main_main_behaviour_running()
  175. return False
  176. def generateCandidates_Root_main_main_behaviour(self):
  177. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour):
  178. return self.generateCandidatesChildren_Root_main_main_behaviour()
  179. else:
  180. return True
  181. def generateCandidatesCurrent_Root_main_main_behaviour_initializing(self):
  182. enabled_events = self.getEnabledEvents()
  183. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_initializing_1, [])
  184. return True
  185. return False
  186. def generateCandidates_Root_main_main_behaviour_initializing(self):
  187. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour_initializing):
  188. return self.generateCandidatesCurrent_Root_main_main_behaviour_initializing()
  189. else:
  190. return True
  191. def transition_Root_main_main_behaviour_initializing_1(self, parameters):
  192. self.exit_Root_main_main_behaviour_initializing()
  193. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  194. self.enter_Root_main_main_behaviour_running()
  195. def generateCandidatesCurrent_Root_main_main_behaviour_running(self):
  196. enabled_events = self.getEnabledEvents()
  197. for e in enabled_events:
  198. if e.name == "field_created":
  199. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_running_1, e.parameters)
  200. return True
  201. enabled_events = self.getEnabledEvents()
  202. for e in enabled_events:
  203. if e.name == "field_deleted":
  204. parameters = e.parameters
  205. if self.nr_of_fields > 1:
  206. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_running_2, e.parameters)
  207. return True
  208. enabled_events = self.getEnabledEvents()
  209. for e in enabled_events:
  210. if e.name == "field_deleted":
  211. parameters = e.parameters
  212. if self.nr_of_fields == 1:
  213. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_running_3, e.parameters)
  214. return True
  215. return False
  216. def generateCandidates_Root_main_main_behaviour_running(self):
  217. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour_running):
  218. return self.generateCandidatesCurrent_Root_main_main_behaviour_running()
  219. else:
  220. return True
  221. def transition_Root_main_main_behaviour_running_1(self, parameters):
  222. self.exit_Root_main_main_behaviour_running()
  223. self.nr_of_fields += 1
  224. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  225. self.enter_Root_main_main_behaviour_running()
  226. def transition_Root_main_main_behaviour_running_2(self, parameters):
  227. self.exit_Root_main_main_behaviour_running()
  228. self.nr_of_fields -= 1
  229. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  230. self.enter_Root_main_main_behaviour_running()
  231. def transition_Root_main_main_behaviour_running_3(self, parameters):
  232. self.exit_Root_main_main_behaviour_running()
  233. self.raiseInternalEvent(Event("stop", None, []))
  234. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  235. self.enter_Root_main_main_behaviour_running()
  236. def generateCandidatesChildren_Root_main_creating_behaviour(self):
  237. if self.current_state[self.Root_main_creating_behaviour][0] == self.Root_main_creating_behaviour_waiting:
  238. return self.generateCandidates_Root_main_creating_behaviour_waiting()
  239. elif self.current_state[self.Root_main_creating_behaviour][0] == self.Root_main_creating_behaviour_creating:
  240. return self.generateCandidates_Root_main_creating_behaviour_creating()
  241. return False
  242. def generateCandidates_Root_main_creating_behaviour(self):
  243. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour):
  244. return self.generateCandidatesChildren_Root_main_creating_behaviour()
  245. else:
  246. return True
  247. def generateCandidatesCurrent_Root_main_creating_behaviour_waiting(self):
  248. enabled_events = self.getEnabledEvents()
  249. for e in enabled_events:
  250. if e.name == "create_field":
  251. self.small_step.addCandidate(self.transition_Root_main_creating_behaviour_waiting_1, e.parameters)
  252. return True
  253. return False
  254. def generateCandidates_Root_main_creating_behaviour_waiting(self):
  255. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour_waiting):
  256. return self.generateCandidatesCurrent_Root_main_creating_behaviour_waiting()
  257. else:
  258. return True
  259. def transition_Root_main_creating_behaviour_waiting_1(self, parameters):
  260. self.exit_Root_main_creating_behaviour_waiting()
  261. self.big_step.outputEventOM(Event("create_instance", None, [self, 'fields', 'Field', self.resolution]))
  262. self.combo_step.setArenaChanged(self.Root_main_creating_behaviour)
  263. self.enter_Root_main_creating_behaviour_creating()
  264. def generateCandidatesCurrent_Root_main_creating_behaviour_creating(self):
  265. enabled_events = self.getEnabledEvents()
  266. for e in enabled_events:
  267. if e.name == "instance_created":
  268. self.small_step.addCandidate(self.transition_Root_main_creating_behaviour_creating_1, e.parameters)
  269. return True
  270. return False
  271. def generateCandidates_Root_main_creating_behaviour_creating(self):
  272. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour_creating):
  273. return self.generateCandidatesCurrent_Root_main_creating_behaviour_creating()
  274. else:
  275. return True
  276. def transition_Root_main_creating_behaviour_creating_1(self, parameters):
  277. association_name = parameters[0]
  278. self.exit_Root_main_creating_behaviour_creating()
  279. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  280. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  281. self.raiseInternalEvent(Event("field_created", None, []))
  282. self.combo_step.setArenaChanged(self.Root_main_creating_behaviour)
  283. self.enter_Root_main_creating_behaviour_waiting()
  284. def generateCandidatesChildren_Root_main_deleting_behaviour(self):
  285. if self.current_state[self.Root_main_deleting_behaviour][0] == self.Root_main_deleting_behaviour_waiting:
  286. return self.generateCandidates_Root_main_deleting_behaviour_waiting()
  287. elif self.current_state[self.Root_main_deleting_behaviour][0] == self.Root_main_deleting_behaviour_deleting:
  288. return self.generateCandidates_Root_main_deleting_behaviour_deleting()
  289. return False
  290. def generateCandidates_Root_main_deleting_behaviour(self):
  291. if not self.combo_step.isArenaChanged(self.Root_main_deleting_behaviour):
  292. return self.generateCandidatesChildren_Root_main_deleting_behaviour()
  293. else:
  294. return True
  295. def generateCandidatesCurrent_Root_main_deleting_behaviour_waiting(self):
  296. enabled_events = self.getEnabledEvents()
  297. for e in enabled_events:
  298. if e.name == "delete_field":
  299. self.small_step.addCandidate(self.transition_Root_main_deleting_behaviour_waiting_1, e.parameters)
  300. return True
  301. return False
  302. def generateCandidates_Root_main_deleting_behaviour_waiting(self):
  303. if not self.combo_step.isArenaChanged(self.Root_main_deleting_behaviour_waiting):
  304. return self.generateCandidatesCurrent_Root_main_deleting_behaviour_waiting()
  305. else:
  306. return True
  307. def transition_Root_main_deleting_behaviour_waiting_1(self, parameters):
  308. association_name = parameters[0]
  309. self.exit_Root_main_deleting_behaviour_waiting()
  310. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  311. self.combo_step.setArenaChanged(self.Root_main_deleting_behaviour)
  312. self.enter_Root_main_deleting_behaviour_deleting()
  313. def generateCandidatesCurrent_Root_main_deleting_behaviour_deleting(self):
  314. enabled_events = self.getEnabledEvents()
  315. for e in enabled_events:
  316. if e.name == "instance_deleted":
  317. self.small_step.addCandidate(self.transition_Root_main_deleting_behaviour_deleting_1, e.parameters)
  318. return True
  319. return False
  320. def generateCandidates_Root_main_deleting_behaviour_deleting(self):
  321. if not self.combo_step.isArenaChanged(self.Root_main_deleting_behaviour_deleting):
  322. return self.generateCandidatesCurrent_Root_main_deleting_behaviour_deleting()
  323. else:
  324. return True
  325. def transition_Root_main_deleting_behaviour_deleting_1(self, parameters):
  326. self.exit_Root_main_deleting_behaviour_deleting()
  327. self.raiseInternalEvent(Event("field_deleted", None, []))
  328. self.combo_step.setArenaChanged(self.Root_main_deleting_behaviour)
  329. self.enter_Root_main_deleting_behaviour_waiting()
  330. def generateCandidates_Root_stopped(self):
  331. return False
  332. # Generate transition candidates for current small step
  333. def generateCandidates(self):
  334. self.generateCandidates_Root()
  335. class Field(RuntimeClassBase, tk.Toplevel, TkinterWidget):
  336. def __init__(self, controller, resolution):
  337. RuntimeClassBase.__init__(self, controller)
  338. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  339. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  340. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  341. self.semantics.priority = StatechartSemantics.SourceParent
  342. self.semantics.concurrency = StatechartSemantics.Single
  343. # Call user defined constructor
  344. Field.user_defined_constructor(self, resolution)
  345. def user_defined_constructor(self, resolution):
  346. tk.Toplevel.__init__(self)
  347. TkinterWidget.__init__(self, True)
  348. self.geometry('{}x{}'.format(resolution[0], resolution[1]))
  349. CANVAS_SIZE_TUPLE = (0, 0, self.winfo_screenwidth(), self.winfo_screenheight())
  350. self.canvas = tk.Canvas(self, relief=tk.RIDGE, scrollregion=CANVAS_SIZE_TUPLE)
  351. self.canvas.focus_force()
  352. self.canvas.pack(expand = True, fill=tk.BOTH)
  353. self.text = self.canvas.create_text(5, 5, anchor='nw', text="TIME: %s" % 0.0)
  354. self.title('Particle Interaction')
  355. self.particles = {}
  356. self.creates = []
  357. self.moves = []
  358. self.color_changes = []
  359. self.deletes = []
  360. self.new_particle_id = None
  361. self.set_bindable_and_tagorid(self.canvas)
  362. self.positions = {}
  363. self.curr_positions = {}
  364. def user_defined_destructor(self):
  365. self.destroy()
  366. # Call super class destructors
  367. if hasattr(tk.Toplevel, "__del__"):
  368. tk.Toplevel.__del__(self)
  369. if hasattr(TkinterWidget, "__del__"):
  370. TkinterWidget.__del__(self)
  371. def initializeStatechart(self):
  372. self.current_state[self.Root] = []
  373. self.current_state[self.Root_main] = []
  374. self.current_state[self.Root_main_main_behaviour] = []
  375. self.current_state[self.Root_main_creating_behaviour] = []
  376. self.current_state[self.Root_main_listening_behaviour] = []
  377. # Enter default state
  378. self.enterDefault_Root_main()
  379. # Unique IDs for all statechart nodes
  380. Root = 0
  381. Root_main = 1
  382. Root_main_main_behaviour = 2
  383. Root_main_creating_behaviour = 3
  384. Root_main_listening_behaviour = 4
  385. Root_main_main_behaviour_initializing = 5
  386. Root_main_main_behaviour_running = 6
  387. Root_main_creating_behaviour_idle = 7
  388. Root_main_creating_behaviour_creating_particle = 8
  389. Root_main_listening_behaviour_listening = 9
  390. Root_stopped = 10
  391. # Statechart enter/exit action method(s)
  392. def enter_Root_main(self):
  393. self.current_state[self.Root].append(self.Root_main)
  394. def exit_Root_main(self):
  395. self.exit_Root_main_main_behaviour()
  396. self.exit_Root_main_creating_behaviour()
  397. self.exit_Root_main_listening_behaviour()
  398. self.current_state[self.Root] = []
  399. def enter_Root_main_main_behaviour(self):
  400. self.current_state[self.Root_main].append(self.Root_main_main_behaviour)
  401. def exit_Root_main_main_behaviour(self):
  402. if self.Root_main_main_behaviour_initializing in self.current_state[self.Root_main_main_behaviour]:
  403. self.exit_Root_main_main_behaviour_initializing()
  404. if self.Root_main_main_behaviour_running in self.current_state[self.Root_main_main_behaviour]:
  405. self.exit_Root_main_main_behaviour_running()
  406. self.current_state[self.Root_main] = []
  407. def enter_Root_main_creating_behaviour(self):
  408. self.current_state[self.Root_main].append(self.Root_main_creating_behaviour)
  409. def exit_Root_main_creating_behaviour(self):
  410. if self.Root_main_creating_behaviour_idle in self.current_state[self.Root_main_creating_behaviour]:
  411. self.exit_Root_main_creating_behaviour_idle()
  412. if self.Root_main_creating_behaviour_creating_particle in self.current_state[self.Root_main_creating_behaviour]:
  413. self.exit_Root_main_creating_behaviour_creating_particle()
  414. self.current_state[self.Root_main] = []
  415. def enter_Root_main_listening_behaviour(self):
  416. self.current_state[self.Root_main].append(self.Root_main_listening_behaviour)
  417. def exit_Root_main_listening_behaviour(self):
  418. if self.Root_main_listening_behaviour_listening in self.current_state[self.Root_main_listening_behaviour]:
  419. self.exit_Root_main_listening_behaviour_listening()
  420. self.current_state[self.Root_main] = []
  421. def enter_Root_main_main_behaviour_initializing(self):
  422. self.current_state[self.Root_main_main_behaviour].append(self.Root_main_main_behaviour_initializing)
  423. def exit_Root_main_main_behaviour_initializing(self):
  424. self.current_state[self.Root_main_main_behaviour] = []
  425. def enter_Root_main_main_behaviour_running(self):
  426. self.current_state[self.Root_main_main_behaviour].append(self.Root_main_main_behaviour_running)
  427. def exit_Root_main_main_behaviour_running(self):
  428. self.current_state[self.Root_main_main_behaviour] = []
  429. def enter_Root_main_creating_behaviour_idle(self):
  430. self.current_state[self.Root_main_creating_behaviour].append(self.Root_main_creating_behaviour_idle)
  431. def exit_Root_main_creating_behaviour_idle(self):
  432. self.current_state[self.Root_main_creating_behaviour] = []
  433. def enter_Root_main_creating_behaviour_creating_particle(self):
  434. self.current_state[self.Root_main_creating_behaviour].append(self.Root_main_creating_behaviour_creating_particle)
  435. def exit_Root_main_creating_behaviour_creating_particle(self):
  436. self.current_state[self.Root_main_creating_behaviour] = []
  437. def enter_Root_main_listening_behaviour_listening(self):
  438. self.current_state[self.Root_main_listening_behaviour].append(self.Root_main_listening_behaviour_listening)
  439. def exit_Root_main_listening_behaviour_listening(self):
  440. self.current_state[self.Root_main_listening_behaviour] = []
  441. def enter_Root_stopped(self):
  442. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_field", None, [self.association_name])]))
  443. self.current_state[self.Root].append(self.Root_stopped)
  444. def exit_Root_stopped(self):
  445. self.current_state[self.Root] = []
  446. # Statechart enter/exit default method(s)
  447. def enterDefault_Root_main(self):
  448. self.enter_Root_main()
  449. self.enterDefault_Root_main_main_behaviour()
  450. self.enterDefault_Root_main_creating_behaviour()
  451. self.enterDefault_Root_main_listening_behaviour()
  452. def enterDefault_Root_main_main_behaviour(self):
  453. self.enter_Root_main_main_behaviour()
  454. self.enter_Root_main_main_behaviour_initializing()
  455. def enterDefault_Root_main_creating_behaviour(self):
  456. self.enter_Root_main_creating_behaviour()
  457. self.enter_Root_main_creating_behaviour_idle()
  458. def enterDefault_Root_main_listening_behaviour(self):
  459. self.enter_Root_main_listening_behaviour()
  460. self.enter_Root_main_listening_behaviour_listening()
  461. # Statechart transitions
  462. def generateCandidatesChildren_Root(self):
  463. if self.current_state[self.Root][0] == self.Root_main:
  464. return self.generateCandidates_Root_main()
  465. elif self.current_state[self.Root][0] == self.Root_stopped:
  466. return self.generateCandidates_Root_stopped()
  467. return False
  468. def generateCandidates_Root(self):
  469. if not self.combo_step.isArenaChanged(self.Root):
  470. return self.generateCandidatesChildren_Root()
  471. else:
  472. return True
  473. def generateCandidatesChildren_Root_main(self):
  474. branch_done = False
  475. branch_done = (self.generateCandidates_Root_main_main_behaviour() or branch_done)
  476. branch_done = (self.generateCandidates_Root_main_creating_behaviour() or branch_done)
  477. branch_done = (self.generateCandidates_Root_main_listening_behaviour() or branch_done)
  478. return branch_done
  479. def generateCandidatesCurrent_Root_main(self):
  480. enabled_events = self.getEnabledEvents()
  481. for e in enabled_events:
  482. if e.name == "stop":
  483. self.small_step.addCandidate(self.transition_Root_main_1, e.parameters)
  484. return True
  485. return False
  486. def generateCandidates_Root_main(self):
  487. if not self.combo_step.isArenaChanged(self.Root_main):
  488. branch_done = False
  489. if self.semantics.priority == StatechartSemantics.SourceParent:
  490. branch_done = self.generateCandidatesCurrent_Root_main()
  491. if not branch_done:
  492. branch_done = self.generateCandidatesChildren_Root_main()
  493. elif self.semantics.priority == StatechartSemantics.SourceChild:
  494. branch_done = self.generateCandidatesChildren_Root_main()
  495. if not branch_done:
  496. branch_done = self.generateCandidatesCurrent_Root_main()
  497. return branch_done
  498. else:
  499. return True
  500. def transition_Root_main_1(self, parameters):
  501. self.exit_Root_main()
  502. self.big_step.outputEventOM(Event("delete_instance", None, [self, 'particles']))
  503. self.combo_step.setArenaChanged(self.Root)
  504. self.enter_Root_stopped()
  505. def generateCandidatesChildren_Root_main_main_behaviour(self):
  506. if self.current_state[self.Root_main_main_behaviour][0] == self.Root_main_main_behaviour_initializing:
  507. return self.generateCandidates_Root_main_main_behaviour_initializing()
  508. elif self.current_state[self.Root_main_main_behaviour][0] == self.Root_main_main_behaviour_running:
  509. return self.generateCandidates_Root_main_main_behaviour_running()
  510. return False
  511. def generateCandidates_Root_main_main_behaviour(self):
  512. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour):
  513. return self.generateCandidatesChildren_Root_main_main_behaviour()
  514. else:
  515. return True
  516. def generateCandidatesCurrent_Root_main_main_behaviour_initializing(self):
  517. enabled_events = self.getEnabledEvents()
  518. for e in enabled_events:
  519. if e.name == "set_association_name":
  520. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_initializing_1, e.parameters)
  521. return True
  522. return False
  523. def generateCandidates_Root_main_main_behaviour_initializing(self):
  524. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour_initializing):
  525. return self.generateCandidatesCurrent_Root_main_main_behaviour_initializing()
  526. else:
  527. return True
  528. def transition_Root_main_main_behaviour_initializing_1(self, parameters):
  529. association_name = parameters[0]
  530. self.exit_Root_main_main_behaviour_initializing()
  531. self.association_name = association_name
  532. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  533. self.enter_Root_main_main_behaviour_running()
  534. def generateCandidatesCurrent_Root_main_main_behaviour_running(self):
  535. enabled_events = self.getEnabledEvents()
  536. for e in enabled_events:
  537. if (e.name == "window-close") and (e.port == "input"):
  538. parameters = e.parameters
  539. tagorid = parameters[0]
  540. if tagorid == id(self):
  541. self.small_step.addCandidate(self.transition_Root_main_main_behaviour_running_1, e.parameters)
  542. return True
  543. return False
  544. def generateCandidates_Root_main_main_behaviour_running(self):
  545. if not self.combo_step.isArenaChanged(self.Root_main_main_behaviour_running):
  546. return self.generateCandidatesCurrent_Root_main_main_behaviour_running()
  547. else:
  548. return True
  549. def transition_Root_main_main_behaviour_running_1(self, parameters):
  550. tagorid = parameters[0]
  551. self.exit_Root_main_main_behaviour_running()
  552. self.raiseInternalEvent(Event("stop", None, []))
  553. self.combo_step.setArenaChanged(self.Root_main_main_behaviour)
  554. self.enter_Root_main_main_behaviour_running()
  555. def generateCandidatesChildren_Root_main_creating_behaviour(self):
  556. if self.current_state[self.Root_main_creating_behaviour][0] == self.Root_main_creating_behaviour_idle:
  557. return self.generateCandidates_Root_main_creating_behaviour_idle()
  558. elif self.current_state[self.Root_main_creating_behaviour][0] == self.Root_main_creating_behaviour_creating_particle:
  559. return self.generateCandidates_Root_main_creating_behaviour_creating_particle()
  560. return False
  561. def generateCandidates_Root_main_creating_behaviour(self):
  562. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour):
  563. return self.generateCandidatesChildren_Root_main_creating_behaviour()
  564. else:
  565. return True
  566. def generateCandidatesCurrent_Root_main_creating_behaviour_idle(self):
  567. enabled_events = self.getEnabledEvents()
  568. for e in enabled_events:
  569. if e.name == "create_particle":
  570. self.small_step.addCandidate(self.transition_Root_main_creating_behaviour_idle_1, e.parameters)
  571. return True
  572. return False
  573. def generateCandidates_Root_main_creating_behaviour_idle(self):
  574. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour_idle):
  575. return self.generateCandidatesCurrent_Root_main_creating_behaviour_idle()
  576. else:
  577. return True
  578. def transition_Root_main_creating_behaviour_idle_1(self, parameters):
  579. new_particle_info = parameters[0]
  580. self.exit_Root_main_creating_behaviour_idle()
  581. self.big_step.outputEventOM(Event("create_instance", None, [self, "particles", "Particle", self.canvas, new_particle_info[0], new_particle_info[1][0], new_particle_info[1][1], new_particle_info[2]]))
  582. self.new_particle_id = new_particle_info[0]
  583. self.combo_step.setArenaChanged(self.Root_main_creating_behaviour)
  584. self.enter_Root_main_creating_behaviour_creating_particle()
  585. def generateCandidatesCurrent_Root_main_creating_behaviour_creating_particle(self):
  586. enabled_events = self.getEnabledEvents()
  587. for e in enabled_events:
  588. if e.name == "instance_created":
  589. self.small_step.addCandidate(self.transition_Root_main_creating_behaviour_creating_particle_1, e.parameters)
  590. return True
  591. return False
  592. def generateCandidates_Root_main_creating_behaviour_creating_particle(self):
  593. if not self.combo_step.isArenaChanged(self.Root_main_creating_behaviour_creating_particle):
  594. return self.generateCandidatesCurrent_Root_main_creating_behaviour_creating_particle()
  595. else:
  596. return True
  597. def transition_Root_main_creating_behaviour_creating_particle_1(self, parameters):
  598. association_name = parameters[0]
  599. self.exit_Root_main_creating_behaviour_creating_particle()
  600. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  601. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  602. self.particles[self.new_particle_id] = association_name
  603. self.combo_step.setArenaChanged(self.Root_main_creating_behaviour)
  604. self.enter_Root_main_creating_behaviour_idle()
  605. def generateCandidatesChildren_Root_main_listening_behaviour(self):
  606. if self.current_state[self.Root_main_listening_behaviour][0] == self.Root_main_listening_behaviour_listening:
  607. return self.generateCandidates_Root_main_listening_behaviour_listening()
  608. return False
  609. def generateCandidates_Root_main_listening_behaviour(self):
  610. if not self.combo_step.isArenaChanged(self.Root_main_listening_behaviour):
  611. return self.generateCandidatesChildren_Root_main_listening_behaviour()
  612. else:
  613. return True
  614. def generateCandidatesCurrent_Root_main_listening_behaviour_listening(self):
  615. enabled_events = self.getEnabledEvents()
  616. for e in enabled_events:
  617. if (e.name == "update_time") and (e.port == "input"):
  618. self.small_step.addCandidate(self.transition_Root_main_listening_behaviour_listening_1, e.parameters)
  619. return True
  620. enabled_events = self.getEnabledEvents()
  621. for e in enabled_events:
  622. if (e.name == "create_particle") and (e.port == "input"):
  623. self.small_step.addCandidate(self.transition_Root_main_listening_behaviour_listening_2, e.parameters)
  624. return True
  625. enabled_events = self.getEnabledEvents()
  626. for e in enabled_events:
  627. if (e.name == "delete_particle") and (e.port == "input"):
  628. self.small_step.addCandidate(self.transition_Root_main_listening_behaviour_listening_3, e.parameters)
  629. return True
  630. enabled_events = self.getEnabledEvents()
  631. for e in enabled_events:
  632. if (e.name == "delete") and (e.port == "input"):
  633. self.small_step.addCandidate(self.transition_Root_main_listening_behaviour_listening_4, e.parameters)
  634. return True
  635. return False
  636. def generateCandidates_Root_main_listening_behaviour_listening(self):
  637. if not self.combo_step.isArenaChanged(self.Root_main_listening_behaviour_listening):
  638. return self.generateCandidatesCurrent_Root_main_listening_behaviour_listening()
  639. else:
  640. return True
  641. def transition_Root_main_listening_behaviour_listening_1(self, parameters):
  642. new_time = parameters[0]
  643. self.exit_Root_main_listening_behaviour_listening()
  644. self.canvas.itemconfig(self.text, text=new_time)
  645. self.combo_step.setArenaChanged(self.Root_main_listening_behaviour)
  646. self.enter_Root_main_listening_behaviour_listening()
  647. def transition_Root_main_listening_behaviour_listening_2(self, parameters):
  648. params = parameters[0]
  649. self.exit_Root_main_listening_behaviour_listening()
  650. self.raiseInternalEvent(Event("create_particle", None, [params]))
  651. self.combo_step.setArenaChanged(self.Root_main_listening_behaviour)
  652. self.enter_Root_main_listening_behaviour_listening()
  653. def transition_Root_main_listening_behaviour_listening_3(self, parameters):
  654. particle_id = parameters[0]
  655. self.exit_Root_main_listening_behaviour_listening()
  656. self.big_step.outputEventOM(Event("delete_instance", None, [self, self.particles[particle_id]]))
  657. del self.particles[particle_id]
  658. self.combo_step.setArenaChanged(self.Root_main_listening_behaviour)
  659. self.enter_Root_main_listening_behaviour_listening()
  660. def transition_Root_main_listening_behaviour_listening_4(self, parameters):
  661. clicked_id = parameters[0]
  662. self.exit_Root_main_listening_behaviour_listening()
  663. self.big_step.outputEvent(Event("delete_selected", "output", []))
  664. self.combo_step.setArenaChanged(self.Root_main_listening_behaviour)
  665. self.enter_Root_main_listening_behaviour_listening()
  666. def generateCandidates_Root_stopped(self):
  667. return False
  668. # Generate transition candidates for current small step
  669. def generateCandidates(self):
  670. self.generateCandidates_Root()
  671. class Particle(RuntimeClassBase, TkinterWidget):
  672. def __init__(self, controller, canvas, particle_id, x, y, r):
  673. RuntimeClassBase.__init__(self, controller)
  674. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  675. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  676. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  677. self.semantics.priority = StatechartSemantics.SourceParent
  678. self.semantics.concurrency = StatechartSemantics.Single
  679. # Call user defined constructor
  680. Particle.user_defined_constructor(self, canvas, particle_id, x, y, r)
  681. def user_defined_constructor(self, canvas, particle_id, x, y, r):
  682. TkinterWidget.__init__(self, True)
  683. self.canvas = canvas
  684. self.x = x
  685. self.y = y
  686. self.r = r
  687. self.circle_id = self.canvas.create_oval(x - r, y - r, x + r, y + r, fill="red")
  688. self.middle_id = self.canvas.create_oval(x - 4, y - 4, x + 4, y + 4, fill="orange")
  689. self.set_bindable_and_tagorid(self.canvas, [self.circle_id, self.middle_id])
  690. self.particle_id = particle_id
  691. def user_defined_destructor(self):
  692. self.canvas.delete(self.circle_id)
  693. self.canvas.delete(self.middle_id)
  694. # Call super class destructors
  695. if hasattr(TkinterWidget, "__del__"):
  696. TkinterWidget.__del__(self)
  697. def initializeStatechart(self):
  698. self.current_state[self.Root] = []
  699. # Enter default state
  700. self.enter_Root_initializing()
  701. # Unique IDs for all statechart nodes
  702. Root = 0
  703. Root_initializing = 1
  704. Root_running = 2
  705. Root_deleted = 3
  706. # Statechart enter/exit action method(s)
  707. def enter_Root_initializing(self):
  708. self.current_state[self.Root].append(self.Root_initializing)
  709. def exit_Root_initializing(self):
  710. self.current_state[self.Root] = []
  711. def enter_Root_running(self):
  712. self.current_state[self.Root].append(self.Root_running)
  713. def exit_Root_running(self):
  714. self.current_state[self.Root] = []
  715. def enter_Root_deleted(self):
  716. self.current_state[self.Root].append(self.Root_deleted)
  717. def exit_Root_deleted(self):
  718. self.current_state[self.Root] = []
  719. # Statechart transitions
  720. def generateCandidatesChildren_Root(self):
  721. if self.current_state[self.Root][0] == self.Root_initializing:
  722. return self.generateCandidates_Root_initializing()
  723. elif self.current_state[self.Root][0] == self.Root_running:
  724. return self.generateCandidates_Root_running()
  725. elif self.current_state[self.Root][0] == self.Root_deleted:
  726. return self.generateCandidates_Root_deleted()
  727. return False
  728. def generateCandidates_Root(self):
  729. if not self.combo_step.isArenaChanged(self.Root):
  730. return self.generateCandidatesChildren_Root()
  731. else:
  732. return True
  733. def generateCandidatesCurrent_Root_initializing(self):
  734. enabled_events = self.getEnabledEvents()
  735. for e in enabled_events:
  736. if e.name == "set_association_name":
  737. self.small_step.addCandidate(self.transition_Root_initializing_1, e.parameters)
  738. return True
  739. return False
  740. def generateCandidates_Root_initializing(self):
  741. if not self.combo_step.isArenaChanged(self.Root_initializing):
  742. return self.generateCandidatesCurrent_Root_initializing()
  743. else:
  744. return True
  745. def transition_Root_initializing_1(self, parameters):
  746. association_name = parameters[0]
  747. self.exit_Root_initializing()
  748. self.association_name = association_name
  749. self.combo_step.setArenaChanged(self.Root)
  750. self.enter_Root_running()
  751. def generateCandidatesCurrent_Root_running(self):
  752. enabled_events = self.getEnabledEvents()
  753. for e in enabled_events:
  754. if (e.name == "move_particle") and (e.port == "input"):
  755. parameters = e.parameters
  756. params = parameters[0]
  757. if params[0] == self.particle_id:
  758. self.small_step.addCandidate(self.transition_Root_running_1, e.parameters)
  759. return True
  760. enabled_events = self.getEnabledEvents()
  761. for e in enabled_events:
  762. if (e.name == "color_particle") and (e.port == "input"):
  763. parameters = e.parameters
  764. params = parameters[0]
  765. if params[0] == self.particle_id:
  766. self.small_step.addCandidate(self.transition_Root_running_2, e.parameters)
  767. return True
  768. enabled_events = self.getEnabledEvents()
  769. for e in enabled_events:
  770. if (e.name == "left-click") and (e.port == "input"):
  771. parameters = e.parameters
  772. clicked_id = parameters[0]
  773. if clicked_id == id(self):
  774. self.small_step.addCandidate(self.transition_Root_running_3, e.parameters)
  775. return True
  776. return False
  777. def generateCandidates_Root_running(self):
  778. if not self.combo_step.isArenaChanged(self.Root_running):
  779. return self.generateCandidatesCurrent_Root_running()
  780. else:
  781. return True
  782. def transition_Root_running_1(self, parameters):
  783. params = parameters[0]
  784. self.exit_Root_running()
  785. x, y = params[1]
  786. curr_pos = self.canvas.coords(self.circle_id)
  787. self.canvas.move(self.circle_id, x - self.r - curr_pos[0], y - self.r - curr_pos[1])
  788. curr_pos_middle = self.canvas.coords(self.middle_id)
  789. self.canvas.move(self.middle_id, x - 4 - curr_pos_middle[0], y - 4 - curr_pos_middle[1])
  790. self.combo_step.setArenaChanged(self.Root)
  791. self.enter_Root_running()
  792. def transition_Root_running_2(self, parameters):
  793. params = parameters[0]
  794. self.exit_Root_running()
  795. self.canvas.itemconfig(self.circle_id, fill=params[1])
  796. self.combo_step.setArenaChanged(self.Root)
  797. self.enter_Root_running()
  798. def transition_Root_running_3(self, parameters):
  799. clicked_id = parameters[0]
  800. self.exit_Root_running()
  801. self.big_step.outputEvent(Event("particle_clicked", "output", [self.particle_id]))
  802. self.combo_step.setArenaChanged(self.Root)
  803. self.enter_Root_running()
  804. def generateCandidates_Root_deleted(self):
  805. return False
  806. # Generate transition candidates for current small step
  807. def generateCandidates(self):
  808. self.generateCandidates_Root()
  809. class ObjectManager(ObjectManagerBase):
  810. def __init__(self, controller):
  811. ObjectManagerBase.__init__(self, controller)
  812. def instantiate(self, class_name, construct_params):
  813. if class_name == "MainApp":
  814. instance = MainApp(self.controller, construct_params[0], construct_params[1])
  815. instance.associations = {}
  816. instance.associations["fields"] = Association("Field", 0, -1)
  817. elif class_name == "Field":
  818. instance = Field(self.controller, construct_params[0])
  819. instance.associations = {}
  820. instance.associations["parent"] = Association("MainApp", 1, 1)
  821. instance.associations["particles"] = Association("Particle", 0, -1)
  822. elif class_name == "Particle":
  823. instance = Particle(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3], construct_params[4])
  824. instance.associations = {}
  825. instance.associations["parent"] = Association("Field", 1, 1)
  826. return instance
  827. class Controller(EventLoopControllerBase):
  828. def __init__(self, root, resolution, event_loop_callbacks, finished_callback = None):
  829. if finished_callback == None: finished_callback = None
  830. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback)
  831. self.addInputPort("input")
  832. self.addInputPort("output")
  833. self.object_manager.createInstance("MainApp", [root, resolution])