target.py 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
  3. Model author: Sam Pieters
  4. Model name: Bouncing_Balls_DEVS_Version
  5. Model description:
  6. Tkinter frame with bouncing balls in it.
  7. """
  8. from sccd.runtime.DEVS_statecharts_core import *
  9. from sccd.runtime.libs import ui_v2 as ui
  10. import random
  11. CANVAS_DIMS = (800, 550)
  12. # package "Bouncing_Balls_DEVS_Version"
  13. class MainAppInstance(RuntimeClassBase):
  14. def __init__(self, atomdevs):
  15. RuntimeClassBase.__init__(self, atomdevs)
  16. self.associations = {}
  17. self.associations["fields"] = Association("Field", 0, -1)
  18. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  19. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  20. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  21. self.semantics.priority = StatechartSemantics.SourceParent
  22. self.semantics.concurrency = StatechartSemantics.Single
  23. # build Statechart structure
  24. self.build_statechart_structure()
  25. # call user defined constructor
  26. MainAppInstance.user_defined_constructor(self)
  27. port_name = Ports.addInputPort("<narrow_cast>", self)
  28. atomdevs.addInPort(port_name)
  29. def user_defined_constructor(self):
  30. self.nr_of_fields = 0
  31. def user_defined_destructor(self):
  32. pass
  33. # builds Statechart structure
  34. def build_statechart_structure(self):
  35. # state <root>
  36. self.states[""] = State(0, "", self)
  37. # state /running
  38. self.states["/running"] = State(1, "/running", self)
  39. # state /running/root
  40. self.states["/running/root"] = ParallelState(2, "/running/root", self)
  41. # state /running/root/main_behaviour
  42. self.states["/running/root/main_behaviour"] = State(3, "/running/root/main_behaviour", self)
  43. # state /running/root/main_behaviour/initializing
  44. self.states["/running/root/main_behaviour/initializing"] = State(4, "/running/root/main_behaviour/initializing", self)
  45. # state /running/root/main_behaviour/running
  46. self.states["/running/root/main_behaviour/running"] = State(5, "/running/root/main_behaviour/running", self)
  47. # state /running/root/cd_behaviour
  48. self.states["/running/root/cd_behaviour"] = State(6, "/running/root/cd_behaviour", self)
  49. # state /running/root/cd_behaviour/waiting
  50. self.states["/running/root/cd_behaviour/waiting"] = State(7, "/running/root/cd_behaviour/waiting", self)
  51. # state /running/root/cd_behaviour/creating
  52. self.states["/running/root/cd_behaviour/creating"] = State(8, "/running/root/cd_behaviour/creating", self)
  53. # state /running/root/cd_behaviour/check_nr_of_fields
  54. self.states["/running/root/cd_behaviour/check_nr_of_fields"] = State(9, "/running/root/cd_behaviour/check_nr_of_fields", self)
  55. self.states["/running/root/cd_behaviour/check_nr_of_fields"].setEnter(self._running_root_cd_behaviour_check_nr_of_fields_enter)
  56. self.states["/running/root/cd_behaviour/check_nr_of_fields"].setExit(self._running_root_cd_behaviour_check_nr_of_fields_exit)
  57. # state /running/root/cd_behaviour/stopped
  58. self.states["/running/root/cd_behaviour/stopped"] = State(10, "/running/root/cd_behaviour/stopped", self)
  59. # state /running/stopped
  60. self.states["/running/stopped"] = State(11, "/running/stopped", self)
  61. # add children
  62. self.states[""].addChild(self.states["/running"])
  63. self.states["/running"].addChild(self.states["/running/root"])
  64. self.states["/running"].addChild(self.states["/running/stopped"])
  65. self.states["/running/root"].addChild(self.states["/running/root/main_behaviour"])
  66. self.states["/running/root"].addChild(self.states["/running/root/cd_behaviour"])
  67. self.states["/running/root/main_behaviour"].addChild(self.states["/running/root/main_behaviour/initializing"])
  68. self.states["/running/root/main_behaviour"].addChild(self.states["/running/root/main_behaviour/running"])
  69. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/waiting"])
  70. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/creating"])
  71. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/check_nr_of_fields"])
  72. self.states["/running/root/cd_behaviour"].addChild(self.states["/running/root/cd_behaviour/stopped"])
  73. self.states[""].fixTree()
  74. self.states[""].default_state = self.states["/running"]
  75. self.states["/running"].default_state = self.states["/running/root"]
  76. self.states["/running/root/main_behaviour"].default_state = self.states["/running/root/main_behaviour/initializing"]
  77. self.states["/running/root/cd_behaviour"].default_state = self.states["/running/root/cd_behaviour/waiting"]
  78. # transition /running/root/main_behaviour/initializing
  79. _running_root_main_behaviour_initializing_0 = Transition(self, self.states["/running/root/main_behaviour/initializing"], [self.states["/running/root/main_behaviour/running"]])
  80. _running_root_main_behaviour_initializing_0.setAction(self._running_root_main_behaviour_initializing_0_exec)
  81. _running_root_main_behaviour_initializing_0.setTrigger(None)
  82. self.states["/running/root/main_behaviour/initializing"].addTransition(_running_root_main_behaviour_initializing_0)
  83. # transition /running/root/main_behaviour/running
  84. _running_root_main_behaviour_running_0 = Transition(self, self.states["/running/root/main_behaviour/running"], [self.states["/running/root/main_behaviour/running"]])
  85. _running_root_main_behaviour_running_0.setAction(self._running_root_main_behaviour_running_0_exec)
  86. _running_root_main_behaviour_running_0.setTrigger(Event("button_pressed", None))
  87. _running_root_main_behaviour_running_0.setGuard(self._running_root_main_behaviour_running_0_guard)
  88. self.states["/running/root/main_behaviour/running"].addTransition(_running_root_main_behaviour_running_0)
  89. # transition /running/root/cd_behaviour/waiting
  90. _running_root_cd_behaviour_waiting_0 = Transition(self, self.states["/running/root/cd_behaviour/waiting"], [self.states["/running/root/cd_behaviour/creating"]])
  91. _running_root_cd_behaviour_waiting_0.setAction(self._running_root_cd_behaviour_waiting_0_exec)
  92. _running_root_cd_behaviour_waiting_0.setTrigger(Event("create_field", None))
  93. self.states["/running/root/cd_behaviour/waiting"].addTransition(_running_root_cd_behaviour_waiting_0)
  94. _running_root_cd_behaviour_waiting_1 = Transition(self, self.states["/running/root/cd_behaviour/waiting"], [self.states["/running/root/cd_behaviour/check_nr_of_fields"]])
  95. _running_root_cd_behaviour_waiting_1.setAction(self._running_root_cd_behaviour_waiting_1_exec)
  96. _running_root_cd_behaviour_waiting_1.setTrigger(Event("delete_field", None))
  97. self.states["/running/root/cd_behaviour/waiting"].addTransition(_running_root_cd_behaviour_waiting_1)
  98. # transition /running/root/cd_behaviour/creating
  99. _running_root_cd_behaviour_creating_0 = Transition(self, self.states["/running/root/cd_behaviour/creating"], [self.states["/running/root/cd_behaviour/waiting"]])
  100. _running_root_cd_behaviour_creating_0.setAction(self._running_root_cd_behaviour_creating_0_exec)
  101. _running_root_cd_behaviour_creating_0.setTrigger(Event("instance_created", None))
  102. self.states["/running/root/cd_behaviour/creating"].addTransition(_running_root_cd_behaviour_creating_0)
  103. # transition /running/root/cd_behaviour/check_nr_of_fields
  104. _running_root_cd_behaviour_check_nr_of_fields_0 = Transition(self, self.states["/running/root/cd_behaviour/check_nr_of_fields"], [self.states["/running/root/cd_behaviour/stopped"]])
  105. _running_root_cd_behaviour_check_nr_of_fields_0.setAction(self._running_root_cd_behaviour_check_nr_of_fields_0_exec)
  106. _running_root_cd_behaviour_check_nr_of_fields_0.setTrigger(Event("_0after"))
  107. _running_root_cd_behaviour_check_nr_of_fields_0.setGuard(self._running_root_cd_behaviour_check_nr_of_fields_0_guard)
  108. self.states["/running/root/cd_behaviour/check_nr_of_fields"].addTransition(_running_root_cd_behaviour_check_nr_of_fields_0)
  109. _running_root_cd_behaviour_check_nr_of_fields_1 = Transition(self, self.states["/running/root/cd_behaviour/check_nr_of_fields"], [self.states["/running/root/cd_behaviour/waiting"]])
  110. _running_root_cd_behaviour_check_nr_of_fields_1.setTrigger(None)
  111. _running_root_cd_behaviour_check_nr_of_fields_1.setGuard(self._running_root_cd_behaviour_check_nr_of_fields_1_guard)
  112. self.states["/running/root/cd_behaviour/check_nr_of_fields"].addTransition(_running_root_cd_behaviour_check_nr_of_fields_1)
  113. # transition /running/root
  114. _running_root_0 = Transition(self, self.states["/running/root"], [self.states["/running/stopped"]])
  115. _running_root_0.setAction(self._running_root_0_exec)
  116. _running_root_0.setTrigger(Event("stop", None))
  117. self.states["/running/root"].addTransition(_running_root_0)
  118. def _running_root_cd_behaviour_check_nr_of_fields_enter(self):
  119. self.addTimer(0, 0.05)
  120. def _running_root_cd_behaviour_check_nr_of_fields_exit(self):
  121. self.removeTimer(0)
  122. def _running_root_0_exec(self, parameters):
  123. self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
  124. def _running_root_main_behaviour_initializing_0_exec(self, parameters):
  125. self.raiseInternalEvent(Event("create_field", None, []))
  126. def _running_root_main_behaviour_running_0_exec(self, parameters):
  127. event_name = parameters[0]
  128. self.raiseInternalEvent(Event("create_field", None, []))
  129. def _running_root_main_behaviour_running_0_guard(self, parameters):
  130. event_name = parameters[0]
  131. return event_name == "create_new_field"
  132. def _running_root_cd_behaviour_waiting_0_exec(self, parameters):
  133. self.big_step.outputEventOM(Event("create_instance", None, [self, "fields"]))
  134. def _running_root_cd_behaviour_waiting_1_exec(self, parameters):
  135. association_name = parameters[0]
  136. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  137. self.nr_of_fields -= 1
  138. def _running_root_cd_behaviour_creating_0_exec(self, parameters):
  139. association_name = parameters[0]
  140. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  141. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  142. self.nr_of_fields += 1
  143. def _running_root_cd_behaviour_check_nr_of_fields_0_exec(self, parameters):
  144. self.raiseInternalEvent(Event("stop", None, []))
  145. def _running_root_cd_behaviour_check_nr_of_fields_0_guard(self, parameters):
  146. return self.nr_of_fields == 0
  147. def _running_root_cd_behaviour_check_nr_of_fields_1_guard(self, parameters):
  148. return self.nr_of_fields != 0
  149. def initializeStatechart(self):
  150. # enter default state
  151. self.default_targets = self.states["/running"].getEffectiveTargetStates()
  152. RuntimeClassBase.initializeStatechart(self)
  153. class MainApp(ClassBase):
  154. def __init__(self, name):
  155. ClassBase.__init__(self, name)
  156. self.input = self.addInPort("input")
  157. self.output = self.addOutPort("ui")
  158. self.outputs["fields"] = self.addOutPort("fields")
  159. self.state.instances[self.state.next_instance] = MainAppInstance(self)
  160. self.state.next_instance = self.state.next_instance + 1
  161. def constructObject(self, parameters):
  162. new_instance = MainAppInstance(self)
  163. return new_instance
  164. class FieldInstance(RuntimeClassBase):
  165. def __init__(self, atomdevs):
  166. RuntimeClassBase.__init__(self, atomdevs)
  167. self.associations = {}
  168. self.associations["balls"] = Association("Ball", 0, -1)
  169. self.associations["buttons"] = Association("Button", 0, -1)
  170. self.associations["parent"] = Association("MainApp", 1, 1)
  171. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  172. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  173. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  174. self.semantics.priority = StatechartSemantics.SourceParent
  175. self.semantics.concurrency = StatechartSemantics.Single
  176. # build Statechart structure
  177. self.build_statechart_structure()
  178. # user defined attributes
  179. self.window_id = None
  180. self.canvas_id = None
  181. # call user defined constructor
  182. FieldInstance.user_defined_constructor(self)
  183. port_name = Ports.addInputPort("<narrow_cast>", self)
  184. atomdevs.addInPort(port_name)
  185. port_name = Ports.addInputPort("field_ui", self)
  186. atomdevs.addInPort(port_name)
  187. atomdevs.state.port_mappings[port_name] = atomdevs.state.next_instance
  188. self.inports["field_ui"] = port_name
  189. def user_defined_constructor(self):
  190. pass
  191. def user_defined_destructor(self):
  192. pass
  193. # builds Statechart structure
  194. def build_statechart_structure(self):
  195. # state <root>
  196. self.states[""] = State(0, "", self)
  197. # state /root
  198. self.states["/root"] = State(1, "/root", self)
  199. # state /root/waiting
  200. self.states["/root/waiting"] = State(2, "/root/waiting", self)
  201. # state /root/creating_window
  202. self.states["/root/creating_window"] = State(3, "/root/creating_window", self)
  203. self.states["/root/creating_window"].setEnter(self._root_creating_window_enter)
  204. # state /root/creating_canvas
  205. self.states["/root/creating_canvas"] = State(4, "/root/creating_canvas", self)
  206. self.states["/root/creating_canvas"].setEnter(self._root_creating_canvas_enter)
  207. # state /root/creating_button
  208. self.states["/root/creating_button"] = State(5, "/root/creating_button", self)
  209. self.states["/root/creating_button"].setEnter(self._root_creating_button_enter)
  210. # state /root/running
  211. self.states["/root/running"] = ParallelState(6, "/root/running", self)
  212. # state /root/running/main_behaviour
  213. self.states["/root/running/main_behaviour"] = State(7, "/root/running/main_behaviour", self)
  214. # state /root/running/main_behaviour/running
  215. self.states["/root/running/main_behaviour/running"] = State(8, "/root/running/main_behaviour/running", self)
  216. # state /root/running/main_behaviour/creating_ball
  217. self.states["/root/running/main_behaviour/creating_ball"] = State(9, "/root/running/main_behaviour/creating_ball", self)
  218. # state /root/running/deleting_behaviour
  219. self.states["/root/running/deleting_behaviour"] = State(10, "/root/running/deleting_behaviour", self)
  220. # state /root/running/deleting_behaviour/running
  221. self.states["/root/running/deleting_behaviour/running"] = State(11, "/root/running/deleting_behaviour/running", self)
  222. # state /root/running/child_behaviour
  223. self.states["/root/running/child_behaviour"] = State(12, "/root/running/child_behaviour", self)
  224. # state /root/running/child_behaviour/listening
  225. self.states["/root/running/child_behaviour/listening"] = State(13, "/root/running/child_behaviour/listening", self)
  226. # state /root/running/deleting_balls_behaviour
  227. self.states["/root/running/deleting_balls_behaviour"] = State(14, "/root/running/deleting_balls_behaviour", self)
  228. # state /root/running/deleting_balls_behaviour/listening
  229. self.states["/root/running/deleting_balls_behaviour/listening"] = State(15, "/root/running/deleting_balls_behaviour/listening", self)
  230. # state /root/deleting
  231. self.states["/root/deleting"] = State(16, "/root/deleting", self)
  232. # state /root/deleted
  233. self.states["/root/deleted"] = State(17, "/root/deleted", self)
  234. # add children
  235. self.states[""].addChild(self.states["/root"])
  236. self.states["/root"].addChild(self.states["/root/waiting"])
  237. self.states["/root"].addChild(self.states["/root/creating_window"])
  238. self.states["/root"].addChild(self.states["/root/creating_canvas"])
  239. self.states["/root"].addChild(self.states["/root/creating_button"])
  240. self.states["/root"].addChild(self.states["/root/running"])
  241. self.states["/root"].addChild(self.states["/root/deleting"])
  242. self.states["/root"].addChild(self.states["/root/deleted"])
  243. self.states["/root/running"].addChild(self.states["/root/running/main_behaviour"])
  244. self.states["/root/running"].addChild(self.states["/root/running/deleting_behaviour"])
  245. self.states["/root/running"].addChild(self.states["/root/running/child_behaviour"])
  246. self.states["/root/running"].addChild(self.states["/root/running/deleting_balls_behaviour"])
  247. self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/running"])
  248. self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/creating_ball"])
  249. self.states["/root/running/deleting_behaviour"].addChild(self.states["/root/running/deleting_behaviour/running"])
  250. self.states["/root/running/child_behaviour"].addChild(self.states["/root/running/child_behaviour/listening"])
  251. self.states["/root/running/deleting_balls_behaviour"].addChild(self.states["/root/running/deleting_balls_behaviour/listening"])
  252. self.states[""].fixTree()
  253. self.states[""].default_state = self.states["/root"]
  254. self.states["/root"].default_state = self.states["/root/waiting"]
  255. self.states["/root/running/main_behaviour"].default_state = self.states["/root/running/main_behaviour/running"]
  256. self.states["/root/running/deleting_behaviour"].default_state = self.states["/root/running/deleting_behaviour/running"]
  257. self.states["/root/running/child_behaviour"].default_state = self.states["/root/running/child_behaviour/listening"]
  258. self.states["/root/running/deleting_balls_behaviour"].default_state = self.states["/root/running/deleting_balls_behaviour/listening"]
  259. # transition /root/waiting
  260. _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_window"]])
  261. _root_waiting_0.setAction(self._root_waiting_0_exec)
  262. _root_waiting_0.setTrigger(Event("set_association_name", None))
  263. self.states["/root/waiting"].addTransition(_root_waiting_0)
  264. # transition /root/creating_window
  265. _root_creating_window_0 = Transition(self, self.states["/root/creating_window"], [self.states["/root/creating_canvas"]])
  266. _root_creating_window_0.setAction(self._root_creating_window_0_exec)
  267. _root_creating_window_0.setTrigger(Event("window_created", None))
  268. self.states["/root/creating_window"].addTransition(_root_creating_window_0)
  269. # transition /root/creating_canvas
  270. _root_creating_canvas_0 = Transition(self, self.states["/root/creating_canvas"], [self.states["/root/creating_button"]])
  271. _root_creating_canvas_0.setAction(self._root_creating_canvas_0_exec)
  272. _root_creating_canvas_0.setTrigger(Event("canvas_created", None))
  273. self.states["/root/creating_canvas"].addTransition(_root_creating_canvas_0)
  274. # transition /root/creating_button
  275. _root_creating_button_0 = Transition(self, self.states["/root/creating_button"], [self.states["/root/running"]])
  276. _root_creating_button_0.setAction(self._root_creating_button_0_exec)
  277. _root_creating_button_0.setTrigger(Event("instance_created", None))
  278. self.states["/root/creating_button"].addTransition(_root_creating_button_0)
  279. # transition /root/running/main_behaviour/running
  280. _root_running_main_behaviour_running_0 = Transition(self, self.states["/root/running/main_behaviour/running"], [self.states["/root/running/main_behaviour/creating_ball"]])
  281. _root_running_main_behaviour_running_0.setAction(self._root_running_main_behaviour_running_0_exec)
  282. _root_running_main_behaviour_running_0.setTrigger(Event("right_click", self.getInPortName("field_ui")))
  283. self.states["/root/running/main_behaviour/running"].addTransition(_root_running_main_behaviour_running_0)
  284. # transition /root/running/main_behaviour/creating_ball
  285. _root_running_main_behaviour_creating_ball_0 = Transition(self, self.states["/root/running/main_behaviour/creating_ball"], [self.states["/root/running/main_behaviour/running"]])
  286. _root_running_main_behaviour_creating_ball_0.setAction(self._root_running_main_behaviour_creating_ball_0_exec)
  287. _root_running_main_behaviour_creating_ball_0.setTrigger(Event("instance_created", None))
  288. self.states["/root/running/main_behaviour/creating_ball"].addTransition(_root_running_main_behaviour_creating_ball_0)
  289. # transition /root/running/deleting_behaviour/running
  290. _root_running_deleting_behaviour_running_0 = Transition(self, self.states["/root/running/deleting_behaviour/running"], [self.states["/root/running/deleting_behaviour/running"]])
  291. _root_running_deleting_behaviour_running_0.setAction(self._root_running_deleting_behaviour_running_0_exec)
  292. _root_running_deleting_behaviour_running_0.setTrigger(Event("delete_ball", None))
  293. self.states["/root/running/deleting_behaviour/running"].addTransition(_root_running_deleting_behaviour_running_0)
  294. # transition /root/running/child_behaviour/listening
  295. _root_running_child_behaviour_listening_0 = Transition(self, self.states["/root/running/child_behaviour/listening"], [self.states["/root/running/child_behaviour/listening"]])
  296. _root_running_child_behaviour_listening_0.setAction(self._root_running_child_behaviour_listening_0_exec)
  297. _root_running_child_behaviour_listening_0.setTrigger(Event("button_pressed", None))
  298. self.states["/root/running/child_behaviour/listening"].addTransition(_root_running_child_behaviour_listening_0)
  299. # transition /root/running/deleting_balls_behaviour/listening
  300. _root_running_deleting_balls_behaviour_listening_0 = Transition(self, self.states["/root/running/deleting_balls_behaviour/listening"], [self.states["/root/running/deleting_balls_behaviour/listening"]])
  301. _root_running_deleting_balls_behaviour_listening_0.setAction(self._root_running_deleting_balls_behaviour_listening_0_exec)
  302. _root_running_deleting_balls_behaviour_listening_0.setTrigger(Event("key_press", self.getInPortName("field_ui")))
  303. _root_running_deleting_balls_behaviour_listening_0.setGuard(self._root_running_deleting_balls_behaviour_listening_0_guard)
  304. self.states["/root/running/deleting_balls_behaviour/listening"].addTransition(_root_running_deleting_balls_behaviour_listening_0)
  305. # transition /root/deleting
  306. _root_deleting_0 = Transition(self, self.states["/root/deleting"], [self.states["/root/deleted"]])
  307. _root_deleting_0.setAction(self._root_deleting_0_exec)
  308. _root_deleting_0.setTrigger(None)
  309. self.states["/root/deleting"].addTransition(_root_deleting_0)
  310. # transition /root/running
  311. _root_running_0 = Transition(self, self.states["/root/running"], [self.states["/root/deleting"]])
  312. _root_running_0.setAction(self._root_running_0_exec)
  313. _root_running_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
  314. self.states["/root/running"].addTransition(_root_running_0)
  315. def _root_creating_window_enter(self):
  316. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
  317. def _root_creating_canvas_enter(self):
  318. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1], {'background':'#eee'}, self.inports['field_ui']]))
  319. def _root_creating_button_enter(self):
  320. self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
  321. def _root_running_0_exec(self, parameters):
  322. self.big_step.outputEventOM(Event("delete_instance", None, [self, "buttons"]))
  323. self.big_step.outputEventOM(Event("delete_instance", None, [self, "balls"]))
  324. def _root_waiting_0_exec(self, parameters):
  325. association_name = parameters[0]
  326. self.association_name = association_name
  327. def _root_creating_window_0_exec(self, parameters):
  328. window_id = parameters[0]
  329. self.window_id = window_id
  330. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  331. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
  332. def _root_creating_canvas_0_exec(self, parameters):
  333. canvas_id = parameters[0]
  334. self.canvas_id = canvas_id
  335. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['field_ui']]))
  336. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['field_ui']]))
  337. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['field_ui']]))
  338. def _root_creating_button_0_exec(self, parameters):
  339. association_name = parameters[0]
  340. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  341. def _root_running_main_behaviour_running_0_exec(self, parameters):
  342. x = parameters[0]
  343. y = parameters[1]
  344. button = parameters[2]
  345. self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, x, y]))
  346. def _root_running_main_behaviour_creating_ball_0_exec(self, parameters):
  347. association_name = parameters[0]
  348. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  349. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  350. def _root_running_deleting_behaviour_running_0_exec(self, parameters):
  351. association_name = parameters[0]
  352. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  353. def _root_running_child_behaviour_listening_0_exec(self, parameters):
  354. event_name = parameters[0]
  355. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [event_name])]))
  356. def _root_running_deleting_balls_behaviour_listening_0_exec(self, parameters):
  357. key = parameters[0]
  358. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'balls', Event("delete_self", None, [])]))
  359. def _root_running_deleting_balls_behaviour_listening_0_guard(self, parameters):
  360. key = parameters[0]
  361. return key == ui.KEYCODES.DELETE
  362. def _root_deleting_0_exec(self, parameters):
  363. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_field", None, [self.association_name])]))
  364. self.big_step.outputEvent(Event("destroy_window", self.getOutPortName("ui"), [self.window_id]))
  365. def initializeStatechart(self):
  366. # enter default state
  367. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  368. RuntimeClassBase.initializeStatechart(self)
  369. class Field(ClassBase):
  370. def __init__(self, name):
  371. ClassBase.__init__(self, name)
  372. self.input = self.addInPort("input")
  373. self.output = self.addOutPort("ui")
  374. self.outputs["balls"] = self.addOutPort("balls")
  375. self.outputs["buttons"] = self.addOutPort("buttons")
  376. self.outputs["parent"] = self.addOutPort("parent")
  377. self.field_ui = self.addInPort("field_ui")
  378. def constructObject(self, parameters):
  379. new_instance = FieldInstance(self)
  380. return new_instance
  381. class ButtonInstance(RuntimeClassBase):
  382. def __init__(self, atomdevs, window_id, event_name, button_text):
  383. RuntimeClassBase.__init__(self, atomdevs)
  384. self.associations = {}
  385. self.associations["parent"] = Association("Field", 1, 1)
  386. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  387. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  388. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  389. self.semantics.priority = StatechartSemantics.SourceParent
  390. self.semantics.concurrency = StatechartSemantics.Single
  391. # build Statechart structure
  392. self.build_statechart_structure()
  393. # user defined attributes
  394. self.window_id = None
  395. self.event_name = None
  396. self.button_id = None
  397. # call user defined constructor
  398. ButtonInstance.user_defined_constructor(self, window_id, event_name, button_text)
  399. port_name = Ports.addInputPort("<narrow_cast>", self)
  400. atomdevs.addInPort(port_name)
  401. port_name = Ports.addInputPort("button_ui", self)
  402. atomdevs.addInPort(port_name)
  403. atomdevs.state.port_mappings[port_name] = atomdevs.state.next_instance
  404. self.inports["button_ui"] = port_name
  405. def user_defined_constructor(self, window_id, event_name, button_text):
  406. self.window_id = window_id;
  407. self.event_name = event_name;
  408. def user_defined_destructor(self):
  409. pass
  410. # builds Statechart structure
  411. def build_statechart_structure(self):
  412. # state <root>
  413. self.states[""] = State(0, "", self)
  414. # state /creating_button
  415. self.states["/creating_button"] = State(1, "/creating_button", self)
  416. self.states["/creating_button"].setEnter(self._creating_button_enter)
  417. # state /running
  418. self.states["/running"] = State(2, "/running", self)
  419. # add children
  420. self.states[""].addChild(self.states["/creating_button"])
  421. self.states[""].addChild(self.states["/running"])
  422. self.states[""].fixTree()
  423. self.states[""].default_state = self.states["/creating_button"]
  424. # transition /creating_button
  425. _creating_button_0 = Transition(self, self.states["/creating_button"], [self.states["/running"]])
  426. _creating_button_0.setAction(self._creating_button_0_exec)
  427. _creating_button_0.setTrigger(Event("button_created", None))
  428. self.states["/creating_button"].addTransition(_creating_button_0)
  429. # transition /running
  430. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  431. _running_0.setAction(self._running_0_exec)
  432. _running_0.setTrigger(Event("mouse_click", self.getInPortName("button_ui")))
  433. _running_0.setGuard(self._running_0_guard)
  434. self.states["/running"].addTransition(_running_0)
  435. def _creating_button_enter(self):
  436. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, self.event_name, self.inports['button_ui']]))
  437. def _creating_button_0_exec(self, parameters):
  438. button_id = parameters[0]
  439. self.button_id = button_id
  440. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "mouse_click", self.inports['button_ui']]))
  441. def _running_0_exec(self, parameters):
  442. x = parameters[0]
  443. y = parameters[1]
  444. button = parameters[2]
  445. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_name])]))
  446. def _running_0_guard(self, parameters):
  447. x = parameters[0]
  448. y = parameters[1]
  449. button = parameters[2]
  450. return button == ui.MOUSE_BUTTONS.LEFT
  451. def initializeStatechart(self):
  452. # enter default state
  453. self.default_targets = self.states["/creating_button"].getEffectiveTargetStates()
  454. RuntimeClassBase.initializeStatechart(self)
  455. class Button(ClassBase):
  456. def __init__(self, name):
  457. ClassBase.__init__(self, name)
  458. self.input = self.addInPort("input")
  459. self.output = self.addOutPort("ui")
  460. self.outputs["parent"] = self.addOutPort("parent")
  461. self.button_ui = self.addInPort("button_ui")
  462. def constructObject(self, parameters):
  463. new_instance = ButtonInstance(self, parameters[2], parameters[3], parameters[4])
  464. return new_instance
  465. class BallInstance(RuntimeClassBase):
  466. def __init__(self, atomdevs, canvas_id, x, y):
  467. RuntimeClassBase.__init__(self, atomdevs)
  468. self.associations = {}
  469. self.associations["parent"] = Association("Field", 1, 1)
  470. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  471. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  472. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  473. self.semantics.priority = StatechartSemantics.SourceParent
  474. self.semantics.concurrency = StatechartSemantics.Single
  475. # build Statechart structure
  476. self.build_statechart_structure()
  477. # user defined attributes
  478. self.canvas_id = None
  479. self.pos = None
  480. # call user defined constructor
  481. BallInstance.user_defined_constructor(self, canvas_id, x, y)
  482. port_name = Ports.addInputPort("<narrow_cast>", self)
  483. atomdevs.addInPort(port_name)
  484. port_name = Ports.addInputPort("ball_ui", self)
  485. atomdevs.addInPort(port_name)
  486. atomdevs.state.port_mappings[port_name] = atomdevs.state.next_instance
  487. self.inports["ball_ui"] = port_name
  488. def user_defined_constructor(self, canvas_id, x, y):
  489. self.canvas_id = canvas_id;
  490. self.r = 20.0;
  491. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  492. self.pos = {'x': x, 'y': y};
  493. self.smooth = 0.6; # value between 0 and 1
  494. def user_defined_destructor(self):
  495. pass
  496. # builds Statechart structure
  497. def build_statechart_structure(self):
  498. # state <root>
  499. self.states[""] = State(0, "", self)
  500. # state /main_behaviour
  501. self.states["/main_behaviour"] = State(1, "/main_behaviour", self)
  502. # state /main_behaviour/initializing
  503. self.states["/main_behaviour/initializing"] = State(2, "/main_behaviour/initializing", self)
  504. # state /main_behaviour/creating_circle
  505. self.states["/main_behaviour/creating_circle"] = State(3, "/main_behaviour/creating_circle", self)
  506. self.states["/main_behaviour/creating_circle"].setEnter(self._main_behaviour_creating_circle_enter)
  507. # state /main_behaviour/bouncing
  508. self.states["/main_behaviour/bouncing"] = State(4, "/main_behaviour/bouncing", self)
  509. self.states["/main_behaviour/bouncing"].setEnter(self._main_behaviour_bouncing_enter)
  510. self.states["/main_behaviour/bouncing"].setExit(self._main_behaviour_bouncing_exit)
  511. # state /main_behaviour/dragging
  512. self.states["/main_behaviour/dragging"] = State(5, "/main_behaviour/dragging", self)
  513. # state /main_behaviour/selected
  514. self.states["/main_behaviour/selected"] = State(6, "/main_behaviour/selected", self)
  515. # state /deleted
  516. self.states["/deleted"] = State(7, "/deleted", self)
  517. # add children
  518. self.states[""].addChild(self.states["/main_behaviour"])
  519. self.states[""].addChild(self.states["/deleted"])
  520. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/initializing"])
  521. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/creating_circle"])
  522. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
  523. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/dragging"])
  524. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/selected"])
  525. self.states[""].fixTree()
  526. self.states[""].default_state = self.states["/main_behaviour"]
  527. self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
  528. # transition /main_behaviour/initializing
  529. _main_behaviour_initializing_0 = Transition(self, self.states["/main_behaviour/initializing"], [self.states["/main_behaviour/creating_circle"]])
  530. _main_behaviour_initializing_0.setAction(self._main_behaviour_initializing_0_exec)
  531. _main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  532. self.states["/main_behaviour/initializing"].addTransition(_main_behaviour_initializing_0)
  533. # transition /main_behaviour/creating_circle
  534. _main_behaviour_creating_circle_0 = Transition(self, self.states["/main_behaviour/creating_circle"], [self.states["/main_behaviour/bouncing"]])
  535. _main_behaviour_creating_circle_0.setAction(self._main_behaviour_creating_circle_0_exec)
  536. _main_behaviour_creating_circle_0.setTrigger(Event("circle_created", None))
  537. self.states["/main_behaviour/creating_circle"].addTransition(_main_behaviour_creating_circle_0)
  538. # transition /main_behaviour/bouncing
  539. _main_behaviour_bouncing_0 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  540. _main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
  541. _main_behaviour_bouncing_0.setTrigger(Event("_0after"))
  542. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
  543. _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/selected"]])
  544. _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
  545. _main_behaviour_bouncing_1.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  546. _main_behaviour_bouncing_1.setGuard(self._main_behaviour_bouncing_1_guard)
  547. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
  548. # transition /main_behaviour/dragging
  549. _main_behaviour_dragging_0 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/dragging"]])
  550. _main_behaviour_dragging_0.setAction(self._main_behaviour_dragging_0_exec)
  551. _main_behaviour_dragging_0.setTrigger(Event("mouse_move", self.getInPortName("ball_ui")))
  552. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_0)
  553. _main_behaviour_dragging_1 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/bouncing"]])
  554. _main_behaviour_dragging_1.setAction(self._main_behaviour_dragging_1_exec)
  555. _main_behaviour_dragging_1.setTrigger(Event("mouse_release", self.getInPortName("ball_ui")))
  556. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_1)
  557. # transition /main_behaviour/selected
  558. _main_behaviour_selected_0 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/main_behaviour/dragging"]])
  559. _main_behaviour_selected_0.setAction(self._main_behaviour_selected_0_exec)
  560. _main_behaviour_selected_0.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  561. _main_behaviour_selected_0.setGuard(self._main_behaviour_selected_0_guard)
  562. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_0)
  563. _main_behaviour_selected_1 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/deleted"]])
  564. _main_behaviour_selected_1.setAction(self._main_behaviour_selected_1_exec)
  565. _main_behaviour_selected_1.setTrigger(Event("delete_self", None))
  566. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_1)
  567. def _main_behaviour_creating_circle_enter(self):
  568. self.big_step.outputEvent(Event("create_circle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.r, {'fill':'#000'}, self.inports['ball_ui']]))
  569. def _main_behaviour_bouncing_enter(self):
  570. self.addTimer(0, 0.02)
  571. def _main_behaviour_bouncing_exit(self):
  572. self.removeTimer(0)
  573. def _main_behaviour_initializing_0_exec(self, parameters):
  574. association_name = parameters[0]
  575. self.association_name = association_name
  576. def _main_behaviour_creating_circle_0_exec(self, parameters):
  577. canvas_id = parameters[0]
  578. circle_id = parameters[1]
  579. self.circle_id = circle_id
  580. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_PRESS, 'mouse_press', self.inports['ball_ui']]))
  581. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['ball_ui']]))
  582. self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['ball_ui']]))
  583. def _main_behaviour_bouncing_0_exec(self, parameters):
  584. # Invert velocity when colliding with canvas border:
  585. if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_DIMS[0]:
  586. self.vel['x'] = -self.vel['x'];
  587. if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_DIMS[1]:
  588. self.vel['y'] = -self.vel['y'];
  589. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
  590. self.pos['x'] += self.vel['x']
  591. self.pos['y'] += self.vel['y']
  592. def _main_behaviour_bouncing_1_exec(self, parameters):
  593. x = parameters[0]
  594. y = parameters[1]
  595. button = parameters[2]
  596. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#ff0']))
  597. def _main_behaviour_bouncing_1_guard(self, parameters):
  598. x = parameters[0]
  599. y = parameters[1]
  600. button = parameters[2]
  601. return button == ui.MOUSE_BUTTONS.LEFT
  602. def _main_behaviour_dragging_0_exec(self, parameters):
  603. x = parameters[0]
  604. y = parameters[1]
  605. button = parameters[2]
  606. # Always keep ball within canvas:
  607. x = min(max(0+self.r, x), CANVAS_DIMS[0]-self.r)
  608. y = min(max(0+self.r, y), CANVAS_DIMS[1]-self.r)
  609. dx = x - self.pos['x']
  610. dy = y - self.pos['y']
  611. self.vel = {
  612. 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
  613. 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
  614. }
  615. self.pos = {'x': x, 'y': y}
  616. self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, x-self.r, y-self.r]))
  617. def _main_behaviour_dragging_1_exec(self, parameters):
  618. x = parameters[0]
  619. y = parameters[1]
  620. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#f00']))
  621. def _main_behaviour_selected_0_exec(self, parameters):
  622. x = parameters[0]
  623. y = parameters[1]
  624. button = parameters[2]
  625. self.mouse_pos = {'x':x, 'y':y};
  626. def _main_behaviour_selected_0_guard(self, parameters):
  627. x = parameters[0]
  628. y = parameters[1]
  629. button = parameters[2]
  630. return button == ui.MOUSE_BUTTONS.LEFT
  631. def _main_behaviour_selected_1_exec(self, parameters):
  632. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
  633. self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.element_id]))
  634. def initializeStatechart(self):
  635. # enter default state
  636. self.default_targets = self.states["/main_behaviour"].getEffectiveTargetStates()
  637. RuntimeClassBase.initializeStatechart(self)
  638. class Ball(ClassBase):
  639. def __init__(self, name):
  640. ClassBase.__init__(self, name)
  641. self.input = self.addInPort("input")
  642. self.output = self.addOutPort("ui")
  643. self.outputs["parent"] = self.addOutPort("parent")
  644. self.ball_ui = self.addInPort("ball_ui")
  645. def constructObject(self, parameters):
  646. new_instance = BallInstance(self, parameters[2], parameters[3], parameters[4])
  647. return new_instance
  648. class ObjectManagerState:
  649. def __init__(self):
  650. self.to_send = [("MainApp", "MainApp", Event("start_instance", None, ["MainApp[0]"], 0))]
  651. class ObjectManager(ObjectManagerBase):
  652. def __init__(self, name):
  653. ObjectManagerBase.__init__(self, name)
  654. self.state = ObjectManagerState()
  655. self.input = self.addInPort("input")
  656. self.output["MainApp"] = self.addOutPort()
  657. self.output["Field"] = self.addOutPort()
  658. self.output["Button"] = self.addOutPort()
  659. self.output["Ball"] = self.addOutPort()
  660. class Controller(CoupledDEVS):
  661. def __init__(self, name):
  662. CoupledDEVS.__init__(self, name)
  663. self.in_ui = self.addInPort("ui")
  664. Ports.addInputPort("ui")
  665. self.out_ui = self.addOutPort("ui")
  666. Ports.addOutputPort("ui")
  667. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  668. self.atomics = []
  669. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  670. self.atomics.append(self.addSubModel(Field("Field")))
  671. self.atomics.append(self.addSubModel(Button("Button")))
  672. self.atomics.append(self.addSubModel(Ball("Ball")))
  673. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  674. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)
  675. self.connectPorts(self.atomics[0].outputs["fields"], self.atomics[1].input)
  676. self.connectPorts(self.atomics[1].obj_manager_out, self.objectmanager.input)
  677. self.connectPorts(self.objectmanager.output["Field"], self.atomics[1].obj_manager_in)
  678. self.connectPorts(self.atomics[1].outputs["balls"], self.atomics[3].input)
  679. self.connectPorts(self.atomics[1].outputs["buttons"], self.atomics[2].input)
  680. self.connectPorts(self.atomics[1].outputs["parent"], self.atomics[0].input)
  681. self.connectPorts(self.atomics[2].obj_manager_out, self.objectmanager.input)
  682. self.connectPorts(self.objectmanager.output["Button"], self.atomics[2].obj_manager_in)
  683. self.connectPorts(self.atomics[2].outputs["parent"], self.atomics[1].input)
  684. self.connectPorts(self.atomics[3].obj_manager_out, self.objectmanager.input)
  685. self.connectPorts(self.objectmanager.output["Ball"], self.atomics[3].obj_manager_in)
  686. self.connectPorts(self.atomics[3].outputs["parent"], self.atomics[1].input)
  687. self.connectPorts(self.atomics[0].output, self.out_ui)
  688. self.connectPorts(self.atomics[1].output, self.out_ui)
  689. self.connectPorts(self.atomics[2].output, self.out_ui)
  690. self.connectPorts(self.atomics[3].output, self.out_ui)