target.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Model author: Sam Pieters
  4. Model name: Elevator Balls
  5. """
  6. from sccd.runtime.statecharts_core import *
  7. from sccd.runtime.libs.ui import ui
  8. import random
  9. import time
  10. CANVAS_WIDTH = 800
  11. CANVAS_HEIGHT = 550
  12. # package "Elevator Balls"
  13. class MainApp(RuntimeClassBase):
  14. def __init__(self, controller):
  15. RuntimeClassBase.__init__(self, controller)
  16. self.inports["field_ui"] = controller.addInputPort("field_ui", self)
  17. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  18. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  19. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  20. self.semantics.priority = StatechartSemantics.SourceParent
  21. self.semantics.concurrency = StatechartSemantics.Single
  22. # build Statechart structure
  23. self.build_statechart_structure()
  24. # user defined attributes
  25. self.window_id = None
  26. self.canvas_id = None
  27. self.floor_dimensions = None
  28. # call user defined constructor
  29. MainApp.user_defined_constructor(self)
  30. def user_defined_constructor(self):
  31. pass
  32. def user_defined_destructor(self):
  33. pass
  34. # builds Statechart structure
  35. def build_statechart_structure(self):
  36. # state <root>
  37. self.states[""] = State(0, "", self)
  38. # state /creating_window
  39. self.states["/creating_window"] = State(1, "/creating_window", self)
  40. self.states["/creating_window"].setEnter(self._creating_window_enter)
  41. # state /creating_canvas
  42. self.states["/creating_canvas"] = State(2, "/creating_canvas", self)
  43. self.states["/creating_canvas"].setEnter(self._creating_canvas_enter)
  44. # state /create_elevator
  45. self.states["/create_elevator"] = State(3, "/create_elevator", self)
  46. # state /creating
  47. self.states["/creating"] = State(4, "/creating", self)
  48. # state /waiting
  49. self.states["/waiting"] = State(5, "/waiting", self)
  50. # add children
  51. self.states[""].addChild(self.states["/creating_window"])
  52. self.states[""].addChild(self.states["/creating_canvas"])
  53. self.states[""].addChild(self.states["/create_elevator"])
  54. self.states[""].addChild(self.states["/creating"])
  55. self.states[""].addChild(self.states["/waiting"])
  56. self.states[""].fixTree()
  57. self.states[""].default_state = self.states["/creating_window"]
  58. # transition /creating_window
  59. _creating_window_0 = Transition(self, self.states["/creating_window"], [self.states["/creating_canvas"]])
  60. _creating_window_0.setAction(self._creating_window_0_exec)
  61. _creating_window_0.setTrigger(Event("window_created", None))
  62. self.states["/creating_window"].addTransition(_creating_window_0)
  63. # transition /creating_canvas
  64. _creating_canvas_0 = Transition(self, self.states["/creating_canvas"], [self.states["/create_elevator"]])
  65. _creating_canvas_0.setAction(self._creating_canvas_0_exec)
  66. _creating_canvas_0.setTrigger(Event("canvas_created", None))
  67. self.states["/creating_canvas"].addTransition(_creating_canvas_0)
  68. # transition /create_elevator
  69. _create_elevator_0 = Transition(self, self.states["/create_elevator"], [self.states["/creating"]])
  70. _create_elevator_0.setAction(self._create_elevator_0_exec)
  71. _create_elevator_0.setTrigger(None)
  72. self.states["/create_elevator"].addTransition(_create_elevator_0)
  73. # transition /creating
  74. _creating_0 = Transition(self, self.states["/creating"], [self.states["/waiting"]])
  75. _creating_0.setAction(self._creating_0_exec)
  76. _creating_0.setTrigger(Event("instance_created", None))
  77. self.states["/creating"].addTransition(_creating_0)
  78. def _creating_window_enter(self):
  79. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_WIDTH, CANVAS_HEIGHT, "Bouncing Balls Elevator", self.inports['field_ui']]))
  80. def _creating_canvas_enter(self):
  81. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_WIDTH, CANVAS_HEIGHT - 200, {'background':'#fff'}, self.inports['field_ui']]))
  82. def _creating_window_0_exec(self, parameters):
  83. window_id = parameters[0]
  84. self.window_id = window_id
  85. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  86. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
  87. def _creating_canvas_0_exec(self, parameters):
  88. canvas_id = parameters[0]
  89. self.canvas_id = canvas_id
  90. def _create_elevator_0_exec(self, parameters):
  91. self.big_step.outputEventOM(Event("create_instance", None, [self, "elevator", "Elevator", self.canvas_id]))
  92. def _creating_0_exec(self, parameters):
  93. association_name = parameters[0]
  94. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  95. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name, self.canvas_id, self.window_id])]))
  96. def initializeStatechart(self):
  97. # enter default state
  98. self.default_targets = self.states["/creating_window"].getEffectiveTargetStates()
  99. RuntimeClassBase.initializeStatechart(self)
  100. class Elevator(RuntimeClassBase):
  101. def __init__(self, controller, canvas_id):
  102. RuntimeClassBase.__init__(self, controller)
  103. self.inports["elevator_ui"] = controller.addInputPort("elevator_ui", self)
  104. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  105. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  106. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  107. self.semantics.priority = StatechartSemantics.SourceParent
  108. self.semantics.concurrency = StatechartSemantics.Single
  109. # build Statechart structure
  110. self.build_statechart_structure()
  111. # user defined attributes
  112. self.window_id = None
  113. self.canvas_id = None
  114. self.elevator_id = None
  115. # call user defined constructor
  116. Elevator.user_defined_constructor(self, canvas_id)
  117. def user_defined_constructor(self, canvas_id):
  118. self.canvas_id = canvas_id;
  119. self.button_ids = {
  120. 'up': None,
  121. 'down': None,
  122. 'open': None
  123. };
  124. self.open_button = None;
  125. self.is_open = False;
  126. self.dim = {'x': 80, 'y': 150};
  127. self.vel = {'x': 0, 'y': -2};
  128. self.pos = {'x': 400, 'y': 75};
  129. self.smooth = 0.6; # value between 0 and 1
  130. def user_defined_destructor(self):
  131. pass
  132. # builds Statechart structure
  133. def build_statechart_structure(self):
  134. # state <root>
  135. self.states[""] = State(0, "", self)
  136. # state /root
  137. self.states["/root"] = State(1, "/root", self)
  138. # state /root/waiting
  139. self.states["/root/waiting"] = State(2, "/root/waiting", self)
  140. # state /root/creating_elevator
  141. self.states["/root/creating_elevator"] = State(3, "/root/creating_elevator", self)
  142. self.states["/root/creating_elevator"].setEnter(self._root_creating_elevator_enter)
  143. # state /root/create_elevator_controls
  144. self.states["/root/create_elevator_controls"] = State(4, "/root/create_elevator_controls", self)
  145. # state /root/create_elevator_controls/create_up
  146. self.states["/root/create_elevator_controls/create_up"] = State(5, "/root/create_elevator_controls/create_up", self)
  147. self.states["/root/create_elevator_controls/create_up"].setEnter(self._root_create_elevator_controls_create_up_enter)
  148. # state /root/create_elevator_controls/create_down
  149. self.states["/root/create_elevator_controls/create_down"] = State(6, "/root/create_elevator_controls/create_down", self)
  150. self.states["/root/create_elevator_controls/create_down"].setEnter(self._root_create_elevator_controls_create_down_enter)
  151. # state /root/create_elevator_controls/create_open
  152. self.states["/root/create_elevator_controls/create_open"] = State(7, "/root/create_elevator_controls/create_open", self)
  153. self.states["/root/create_elevator_controls/create_open"].setEnter(self._root_create_elevator_controls_create_open_enter)
  154. # state /root/running
  155. self.states["/root/running"] = State(8, "/root/running", self)
  156. self.states["/root/running"].setEnter(self._root_running_enter)
  157. self.states["/root/running"].setExit(self._root_running_exit)
  158. # add children
  159. self.states[""].addChild(self.states["/root"])
  160. self.states["/root"].addChild(self.states["/root/waiting"])
  161. self.states["/root"].addChild(self.states["/root/creating_elevator"])
  162. self.states["/root"].addChild(self.states["/root/create_elevator_controls"])
  163. self.states["/root"].addChild(self.states["/root/running"])
  164. self.states["/root/create_elevator_controls"].addChild(self.states["/root/create_elevator_controls/create_up"])
  165. self.states["/root/create_elevator_controls"].addChild(self.states["/root/create_elevator_controls/create_down"])
  166. self.states["/root/create_elevator_controls"].addChild(self.states["/root/create_elevator_controls/create_open"])
  167. self.states[""].fixTree()
  168. self.states[""].default_state = self.states["/root"]
  169. self.states["/root"].default_state = self.states["/root/waiting"]
  170. self.states["/root/create_elevator_controls"].default_state = self.states["/root/create_elevator_controls/create_up"]
  171. # transition /root/waiting
  172. _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_elevator"]])
  173. _root_waiting_0.setAction(self._root_waiting_0_exec)
  174. _root_waiting_0.setTrigger(Event("set_association_name", None))
  175. self.states["/root/waiting"].addTransition(_root_waiting_0)
  176. # transition /root/creating_elevator
  177. _root_creating_elevator_0 = Transition(self, self.states["/root/creating_elevator"], [self.states["/root/create_elevator_controls"]])
  178. _root_creating_elevator_0.setAction(self._root_creating_elevator_0_exec)
  179. _root_creating_elevator_0.setTrigger(Event("rectangle_created", None))
  180. self.states["/root/creating_elevator"].addTransition(_root_creating_elevator_0)
  181. # transition /root/create_elevator_controls/create_up
  182. _root_create_elevator_controls_create_up_0 = Transition(self, self.states["/root/create_elevator_controls/create_up"], [self.states["/root/create_elevator_controls/create_down"]])
  183. _root_create_elevator_controls_create_up_0.setAction(self._root_create_elevator_controls_create_up_0_exec)
  184. _root_create_elevator_controls_create_up_0.setTrigger(Event("button_created", None))
  185. self.states["/root/create_elevator_controls/create_up"].addTransition(_root_create_elevator_controls_create_up_0)
  186. # transition /root/create_elevator_controls/create_down
  187. _root_create_elevator_controls_create_down_0 = Transition(self, self.states["/root/create_elevator_controls/create_down"], [self.states["/root/create_elevator_controls/create_open"]])
  188. _root_create_elevator_controls_create_down_0.setAction(self._root_create_elevator_controls_create_down_0_exec)
  189. _root_create_elevator_controls_create_down_0.setTrigger(Event("button_created", None))
  190. self.states["/root/create_elevator_controls/create_down"].addTransition(_root_create_elevator_controls_create_down_0)
  191. # transition /root/create_elevator_controls/create_open
  192. _root_create_elevator_controls_create_open_0 = Transition(self, self.states["/root/create_elevator_controls/create_open"], [self.states["/root/running"]])
  193. _root_create_elevator_controls_create_open_0.setAction(self._root_create_elevator_controls_create_open_0_exec)
  194. _root_create_elevator_controls_create_open_0.setTrigger(Event("button_created", None))
  195. self.states["/root/create_elevator_controls/create_open"].addTransition(_root_create_elevator_controls_create_open_0)
  196. # transition /root/running
  197. _root_running_0 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  198. _root_running_0.setAction(self._root_running_0_exec)
  199. _root_running_0.setTrigger(Event("_0after"))
  200. self.states["/root/running"].addTransition(_root_running_0)
  201. _root_running_1 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  202. _root_running_1.setAction(self._root_running_1_exec)
  203. _root_running_1.setTrigger(Event("right_click", self.getInPortName("elevator_ui")))
  204. self.states["/root/running"].addTransition(_root_running_1)
  205. _root_running_2 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  206. _root_running_2.setAction(self._root_running_2_exec)
  207. _root_running_2.setTrigger(Event("instance_created", None))
  208. self.states["/root/running"].addTransition(_root_running_2)
  209. def _root_creating_elevator_enter(self):
  210. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.dim['x'], self.dim['y'], {'fill':'white', 'outline': 'black'}, self.inports['elevator_ui']]))
  211. def _root_create_elevator_controls_create_up_enter(self):
  212. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'START', self.inports['elevator_ui']]))
  213. def _root_create_elevator_controls_create_down_enter(self):
  214. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'STOP', self.inports['elevator_ui']]))
  215. def _root_create_elevator_controls_create_open_enter(self):
  216. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'OPEN', self.inports['elevator_ui']]))
  217. def _root_running_enter(self):
  218. self.addTimer(0, 0.02)
  219. def _root_running_exit(self):
  220. self.removeTimer(0)
  221. def _root_waiting_0_exec(self, parameters):
  222. association_name = parameters[0]
  223. canvas_id = parameters[1]
  224. window_id = parameters[2]
  225. self.association_name = association_name
  226. self.canvas_id = canvas_id
  227. self.window_id = window_id
  228. def _root_creating_elevator_0_exec(self, parameters):
  229. canvas_id = parameters[0]
  230. rect_id = parameters[1]
  231. self.elevator_id = rect_id
  232. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['elevator_ui']]))
  233. def _root_create_elevator_controls_create_up_0_exec(self, parameters):
  234. button_id = parameters[0]
  235. self.button_ids['up'] = button_id
  236. def _root_create_elevator_controls_create_down_0_exec(self, parameters):
  237. button_id = parameters[0]
  238. self.button_ids['down'] = button_id
  239. def _root_create_elevator_controls_create_open_0_exec(self, parameters):
  240. button_id = parameters[0]
  241. self.button_ids['open'] = button_id
  242. def _root_running_0_exec(self, parameters):
  243. # Invert velocity when colliding with canvas border:
  244. if self.pos['y']-(self.dim['y']/2) <= 0 or self.pos['y']+(self.dim['y']/2) >= CANVAS_HEIGHT:
  245. self.vel['y'] = -self.vel['y'];
  246. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.elevator_id, self.vel['x'], self.vel['y']]))
  247. self.pos['x'] += self.vel['x']
  248. self.pos['y'] += self.vel['y']
  249. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'balls', Event("update_bounds", None, [self.pos, self.dim, self.vel])]))
  250. def _root_running_1_exec(self, parameters):
  251. x = parameters[0]
  252. y = parameters[1]
  253. button = parameters[2]
  254. self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, x, y]))
  255. def _root_running_2_exec(self, parameters):
  256. association_name = parameters[0]
  257. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  258. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  259. def initializeStatechart(self):
  260. # enter default state
  261. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  262. RuntimeClassBase.initializeStatechart(self)
  263. class Ball(RuntimeClassBase):
  264. def __init__(self, controller, canvas_id, x, y):
  265. RuntimeClassBase.__init__(self, controller)
  266. self.inports["ball_ui"] = controller.addInputPort("ball_ui", self)
  267. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  268. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  269. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  270. self.semantics.priority = StatechartSemantics.SourceParent
  271. self.semantics.concurrency = StatechartSemantics.Single
  272. # build Statechart structure
  273. self.build_statechart_structure()
  274. # user defined attributes
  275. self.canvas_id = None
  276. self.pos = None
  277. # call user defined constructor
  278. Ball.user_defined_constructor(self, canvas_id, x, y)
  279. def user_defined_constructor(self, canvas_id, x, y):
  280. self.canvas_id = canvas_id;
  281. self.r = 5.0;
  282. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  283. self.pos = {'x': x, 'y': y};
  284. self.smooth = 0.6; # value between 0 and 1
  285. def user_defined_destructor(self):
  286. pass
  287. # builds Statechart structure
  288. def build_statechart_structure(self):
  289. # state <root>
  290. self.states[""] = State(0, "", self)
  291. # state /main_behaviour
  292. self.states["/main_behaviour"] = State(1, "/main_behaviour", self)
  293. # state /main_behaviour/initializing
  294. self.states["/main_behaviour/initializing"] = State(2, "/main_behaviour/initializing", self)
  295. # state /main_behaviour/creating_circle
  296. self.states["/main_behaviour/creating_circle"] = State(3, "/main_behaviour/creating_circle", self)
  297. self.states["/main_behaviour/creating_circle"].setEnter(self._main_behaviour_creating_circle_enter)
  298. # state /main_behaviour/bouncing
  299. self.states["/main_behaviour/bouncing"] = State(4, "/main_behaviour/bouncing", self)
  300. self.states["/main_behaviour/bouncing"].setEnter(self._main_behaviour_bouncing_enter)
  301. self.states["/main_behaviour/bouncing"].setExit(self._main_behaviour_bouncing_exit)
  302. # state /main_behaviour/dragging
  303. self.states["/main_behaviour/dragging"] = State(5, "/main_behaviour/dragging", self)
  304. # state /main_behaviour/selected
  305. self.states["/main_behaviour/selected"] = State(6, "/main_behaviour/selected", self)
  306. # state /deleted
  307. self.states["/deleted"] = State(7, "/deleted", self)
  308. # add children
  309. self.states[""].addChild(self.states["/main_behaviour"])
  310. self.states[""].addChild(self.states["/deleted"])
  311. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/initializing"])
  312. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/creating_circle"])
  313. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
  314. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/dragging"])
  315. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/selected"])
  316. self.states[""].fixTree()
  317. self.states[""].default_state = self.states["/main_behaviour"]
  318. self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
  319. # transition /main_behaviour/initializing
  320. _main_behaviour_initializing_0 = Transition(self, self.states["/main_behaviour/initializing"], [self.states["/main_behaviour/creating_circle"]])
  321. _main_behaviour_initializing_0.setAction(self._main_behaviour_initializing_0_exec)
  322. _main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  323. self.states["/main_behaviour/initializing"].addTransition(_main_behaviour_initializing_0)
  324. # transition /main_behaviour/creating_circle
  325. _main_behaviour_creating_circle_0 = Transition(self, self.states["/main_behaviour/creating_circle"], [self.states["/main_behaviour/bouncing"]])
  326. _main_behaviour_creating_circle_0.setAction(self._main_behaviour_creating_circle_0_exec)
  327. _main_behaviour_creating_circle_0.setTrigger(Event("circle_created", None))
  328. self.states["/main_behaviour/creating_circle"].addTransition(_main_behaviour_creating_circle_0)
  329. # transition /main_behaviour/bouncing
  330. _main_behaviour_bouncing_0 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  331. _main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
  332. _main_behaviour_bouncing_0.setTrigger(Event("_0after"))
  333. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
  334. _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/selected"]])
  335. _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
  336. _main_behaviour_bouncing_1.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  337. _main_behaviour_bouncing_1.setGuard(self._main_behaviour_bouncing_1_guard)
  338. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
  339. _main_behaviour_bouncing_2 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  340. _main_behaviour_bouncing_2.setAction(self._main_behaviour_bouncing_2_exec)
  341. _main_behaviour_bouncing_2.setTrigger(Event("update_bounds", None))
  342. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_2)
  343. # transition /main_behaviour/dragging
  344. _main_behaviour_dragging_0 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/dragging"]])
  345. _main_behaviour_dragging_0.setAction(self._main_behaviour_dragging_0_exec)
  346. _main_behaviour_dragging_0.setTrigger(Event("mouse_move", self.getInPortName("ball_ui")))
  347. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_0)
  348. _main_behaviour_dragging_1 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/bouncing"]])
  349. _main_behaviour_dragging_1.setAction(self._main_behaviour_dragging_1_exec)
  350. _main_behaviour_dragging_1.setTrigger(Event("mouse_release", self.getInPortName("ball_ui")))
  351. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_1)
  352. # transition /main_behaviour/selected
  353. _main_behaviour_selected_0 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/main_behaviour/dragging"]])
  354. _main_behaviour_selected_0.setAction(self._main_behaviour_selected_0_exec)
  355. _main_behaviour_selected_0.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  356. _main_behaviour_selected_0.setGuard(self._main_behaviour_selected_0_guard)
  357. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_0)
  358. _main_behaviour_selected_1 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/deleted"]])
  359. _main_behaviour_selected_1.setAction(self._main_behaviour_selected_1_exec)
  360. _main_behaviour_selected_1.setTrigger(Event("delete_self", None))
  361. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_1)
  362. def _main_behaviour_creating_circle_enter(self):
  363. 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']]))
  364. def _main_behaviour_bouncing_enter(self):
  365. self.addTimer(0, 0.02)
  366. def _main_behaviour_bouncing_exit(self):
  367. self.removeTimer(0)
  368. def _main_behaviour_initializing_0_exec(self, parameters):
  369. association_name = parameters[0]
  370. self.association_name = association_name
  371. def _main_behaviour_creating_circle_0_exec(self, parameters):
  372. canvas_id = parameters[0]
  373. circle_id = parameters[1]
  374. self.circle_id = circle_id
  375. 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']]))
  376. 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']]))
  377. 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']]))
  378. def _main_behaviour_bouncing_0_exec(self, parameters):
  379. # Check collision with the left and right borders
  380. if self.pos['x'] - self.r < self.rect_pos['x'] - (self.rect_dim['x'] / 2):
  381. self.pos['x'] = self.rect_pos['x'] - (self.rect_dim['x'] / 2) + self.r # Correct position
  382. self.vel['x'] = -self.vel['x'] + self.rect_vel['x']
  383. elif self.pos['x'] + self.r > self.rect_pos['x'] + (self.rect_dim['x'] / 2):
  384. self.pos['x'] = self.rect_pos['x'] + (self.rect_dim['x'] / 2) - self.r # Correct position
  385. self.vel['x'] = -self.vel['x'] + self.rect_vel['x']
  386. # Check collision with the top and bottom borders
  387. if self.pos['y'] - self.r < self.rect_pos['y'] - (self.rect_dim['y'] / 2):
  388. self.pos['y'] = self.rect_pos['y'] - (self.rect_dim['y'] / 2) + self.r # Correct position
  389. self.vel['y'] = -self.vel['y'] + self.rect_vel['y']
  390. elif self.pos['y'] + self.r > self.rect_pos['y'] + (self.rect_dim['y'] / 2):
  391. self.pos['y'] = self.rect_pos['y'] + (self.rect_dim['y'] / 2) - self.r # Correct position
  392. self.vel['y'] = -self.vel['y'] + self.rect_vel['y']
  393. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
  394. self.pos['x'] += self.vel['x']
  395. self.pos['y'] += self.vel['y']
  396. def _main_behaviour_bouncing_1_exec(self, parameters):
  397. x = parameters[0]
  398. y = parameters[1]
  399. button = parameters[2]
  400. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#ff0']))
  401. def _main_behaviour_bouncing_1_guard(self, parameters):
  402. x = parameters[0]
  403. y = parameters[1]
  404. button = parameters[2]
  405. return button == ui.MOUSE_BUTTONS.LEFT
  406. def _main_behaviour_bouncing_2_exec(self, parameters):
  407. pos = parameters[0]
  408. dim = parameters[1]
  409. vel = parameters[2]
  410. self.rect_pos = pos
  411. self.rect_dim = dim
  412. self.rect_vel = vel
  413. def _main_behaviour_dragging_0_exec(self, parameters):
  414. x = parameters[0]
  415. y = parameters[1]
  416. button = parameters[2]
  417. # Always keep ball within canvas:
  418. x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
  419. y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
  420. dx = x - self.pos['x']
  421. dy = y - self.pos['y']
  422. self.vel = {
  423. 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
  424. 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
  425. }
  426. self.pos = {'x': x, 'y': y}
  427. self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, x-self.r, y-self.r]))
  428. def _main_behaviour_dragging_1_exec(self, parameters):
  429. x = parameters[0]
  430. y = parameters[1]
  431. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#f00']))
  432. def _main_behaviour_selected_0_exec(self, parameters):
  433. x = parameters[0]
  434. y = parameters[1]
  435. button = parameters[2]
  436. self.mouse_pos = {'x':x, 'y':y};
  437. def _main_behaviour_selected_0_guard(self, parameters):
  438. x = parameters[0]
  439. y = parameters[1]
  440. button = parameters[2]
  441. return button == ui.MOUSE_BUTTONS.LEFT
  442. def _main_behaviour_selected_1_exec(self, parameters):
  443. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
  444. self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.element_id]))
  445. def initializeStatechart(self):
  446. # enter default state
  447. self.default_targets = self.states["/main_behaviour"].getEffectiveTargetStates()
  448. RuntimeClassBase.initializeStatechart(self)
  449. class ObjectManager(ObjectManagerBase):
  450. def __init__(self, controller):
  451. ObjectManagerBase.__init__(self, controller)
  452. def instantiate(self, class_name, construct_params):
  453. if class_name == "MainApp":
  454. instance = MainApp(self.controller)
  455. instance.associations = {}
  456. instance.associations["elevator"] = Association("Elevator", 0, -1)
  457. elif class_name == "Elevator":
  458. instance = Elevator(self.controller, construct_params[0])
  459. instance.associations = {}
  460. instance.associations["balls"] = Association("Ball", 0, -1)
  461. instance.associations["parent"] = Association("MainApp", 1, 1)
  462. elif class_name == "Ball":
  463. instance = Ball(self.controller, construct_params[0], construct_params[1], construct_params[2])
  464. instance.associations = {}
  465. instance.associations["parent"] = Association("Field", 1, 1)
  466. else:
  467. raise Exception("Cannot instantiate class " + class_name)
  468. return instance
  469. class Controller(EventLoopControllerBase):
  470. def __init__(self, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
  471. if finished_callback == None: finished_callback = None
  472. if behind_schedule_callback == None: behind_schedule_callback = None
  473. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
  474. self.addInputPort("ui")
  475. self.addOutputPort("ui")
  476. self.object_manager.createInstance("MainApp", [])