target.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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.dim = {'x': 80, 'y': 150};
  120. self.vel = {'x': 0, 'y': -2};
  121. self.pos = {'x': 400, 'y': 75};
  122. self.smooth = 0.6; # value between 0 and 1
  123. def user_defined_destructor(self):
  124. pass
  125. # builds Statechart structure
  126. def build_statechart_structure(self):
  127. # state <root>
  128. self.states[""] = State(0, "", self)
  129. # state /root
  130. self.states["/root"] = State(1, "/root", self)
  131. # state /root/waiting
  132. self.states["/root/waiting"] = State(2, "/root/waiting", self)
  133. # state /root/creating_elevator
  134. self.states["/root/creating_elevator"] = State(3, "/root/creating_elevator", self)
  135. self.states["/root/creating_elevator"].setEnter(self._root_creating_elevator_enter)
  136. # state /root/running
  137. self.states["/root/running"] = State(4, "/root/running", self)
  138. self.states["/root/running"].setEnter(self._root_running_enter)
  139. self.states["/root/running"].setExit(self._root_running_exit)
  140. # add children
  141. self.states[""].addChild(self.states["/root"])
  142. self.states["/root"].addChild(self.states["/root/waiting"])
  143. self.states["/root"].addChild(self.states["/root/creating_elevator"])
  144. self.states["/root"].addChild(self.states["/root/running"])
  145. self.states[""].fixTree()
  146. self.states[""].default_state = self.states["/root"]
  147. self.states["/root"].default_state = self.states["/root/waiting"]
  148. # transition /root/waiting
  149. _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_elevator"]])
  150. _root_waiting_0.setAction(self._root_waiting_0_exec)
  151. _root_waiting_0.setTrigger(Event("set_association_name", None))
  152. self.states["/root/waiting"].addTransition(_root_waiting_0)
  153. # transition /root/creating_elevator
  154. _root_creating_elevator_0 = Transition(self, self.states["/root/creating_elevator"], [self.states["/root/running"]])
  155. _root_creating_elevator_0.setAction(self._root_creating_elevator_0_exec)
  156. _root_creating_elevator_0.setTrigger(Event("rectangle_created", None))
  157. self.states["/root/creating_elevator"].addTransition(_root_creating_elevator_0)
  158. # transition /root/running
  159. _root_running_0 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  160. _root_running_0.setAction(self._root_running_0_exec)
  161. _root_running_0.setTrigger(Event("_0after"))
  162. self.states["/root/running"].addTransition(_root_running_0)
  163. _root_running_1 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  164. _root_running_1.setAction(self._root_running_1_exec)
  165. _root_running_1.setTrigger(Event("right_click", self.getInPortName("elevator_ui")))
  166. self.states["/root/running"].addTransition(_root_running_1)
  167. _root_running_2 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
  168. _root_running_2.setAction(self._root_running_2_exec)
  169. _root_running_2.setTrigger(Event("instance_created", None))
  170. self.states["/root/running"].addTransition(_root_running_2)
  171. def _root_creating_elevator_enter(self):
  172. 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']]))
  173. def _root_running_enter(self):
  174. self.addTimer(0, 0.03)
  175. def _root_running_exit(self):
  176. self.removeTimer(0)
  177. def _root_waiting_0_exec(self, parameters):
  178. association_name = parameters[0]
  179. canvas_id = parameters[1]
  180. window_id = parameters[2]
  181. self.association_name = association_name
  182. self.canvas_id = canvas_id
  183. self.window_id = window_id
  184. def _root_creating_elevator_0_exec(self, parameters):
  185. canvas_id = parameters[0]
  186. rect_id = parameters[1]
  187. self.elevator_id = rect_id
  188. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['elevator_ui']]))
  189. def _root_running_0_exec(self, parameters):
  190. # Invert velocity when colliding with canvas border:
  191. if self.pos['y']-(self.dim['y']/2) <= 0 or self.pos['y']+(self.dim['y']/2) >= CANVAS_HEIGHT:
  192. self.vel['y'] = -self.vel['y'];
  193. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.elevator_id, self.vel['x'], self.vel['y']]))
  194. self.pos['x'] += self.vel['x']
  195. self.pos['y'] += self.vel['y']
  196. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'balls', Event("update_bounds", None, [self.pos, self.dim, self.vel])]))
  197. def _root_running_1_exec(self, parameters):
  198. x = parameters[0]
  199. y = parameters[1]
  200. button = parameters[2]
  201. self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, x, y]))
  202. def _root_running_2_exec(self, parameters):
  203. association_name = parameters[0]
  204. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  205. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  206. def initializeStatechart(self):
  207. # enter default state
  208. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  209. RuntimeClassBase.initializeStatechart(self)
  210. class Ball(RuntimeClassBase):
  211. def __init__(self, controller, canvas_id, x, y):
  212. RuntimeClassBase.__init__(self, controller)
  213. self.inports["ball_ui"] = controller.addInputPort("ball_ui", self)
  214. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  215. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  216. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  217. self.semantics.priority = StatechartSemantics.SourceParent
  218. self.semantics.concurrency = StatechartSemantics.Single
  219. # build Statechart structure
  220. self.build_statechart_structure()
  221. # user defined attributes
  222. self.canvas_id = None
  223. self.pos = None
  224. # call user defined constructor
  225. Ball.user_defined_constructor(self, canvas_id, x, y)
  226. def user_defined_constructor(self, canvas_id, x, y):
  227. self.canvas_id = canvas_id;
  228. self.r = 5.0;
  229. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  230. self.pos = {'x': x, 'y': y};
  231. self.smooth = 0.6; # value between 0 and 1
  232. def user_defined_destructor(self):
  233. pass
  234. # builds Statechart structure
  235. def build_statechart_structure(self):
  236. # state <root>
  237. self.states[""] = State(0, "", self)
  238. # state /main_behaviour
  239. self.states["/main_behaviour"] = State(1, "/main_behaviour", self)
  240. # state /main_behaviour/initializing
  241. self.states["/main_behaviour/initializing"] = State(2, "/main_behaviour/initializing", self)
  242. # state /main_behaviour/creating_circle
  243. self.states["/main_behaviour/creating_circle"] = State(3, "/main_behaviour/creating_circle", self)
  244. self.states["/main_behaviour/creating_circle"].setEnter(self._main_behaviour_creating_circle_enter)
  245. # state /main_behaviour/bouncing
  246. self.states["/main_behaviour/bouncing"] = State(4, "/main_behaviour/bouncing", self)
  247. self.states["/main_behaviour/bouncing"].setEnter(self._main_behaviour_bouncing_enter)
  248. self.states["/main_behaviour/bouncing"].setExit(self._main_behaviour_bouncing_exit)
  249. # state /main_behaviour/dragging
  250. self.states["/main_behaviour/dragging"] = State(5, "/main_behaviour/dragging", self)
  251. # state /main_behaviour/selected
  252. self.states["/main_behaviour/selected"] = State(6, "/main_behaviour/selected", self)
  253. # state /deleted
  254. self.states["/deleted"] = State(7, "/deleted", self)
  255. # add children
  256. self.states[""].addChild(self.states["/main_behaviour"])
  257. self.states[""].addChild(self.states["/deleted"])
  258. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/initializing"])
  259. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/creating_circle"])
  260. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
  261. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/dragging"])
  262. self.states["/main_behaviour"].addChild(self.states["/main_behaviour/selected"])
  263. self.states[""].fixTree()
  264. self.states[""].default_state = self.states["/main_behaviour"]
  265. self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
  266. # transition /main_behaviour/initializing
  267. _main_behaviour_initializing_0 = Transition(self, self.states["/main_behaviour/initializing"], [self.states["/main_behaviour/creating_circle"]])
  268. _main_behaviour_initializing_0.setAction(self._main_behaviour_initializing_0_exec)
  269. _main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  270. self.states["/main_behaviour/initializing"].addTransition(_main_behaviour_initializing_0)
  271. # transition /main_behaviour/creating_circle
  272. _main_behaviour_creating_circle_0 = Transition(self, self.states["/main_behaviour/creating_circle"], [self.states["/main_behaviour/bouncing"]])
  273. _main_behaviour_creating_circle_0.setAction(self._main_behaviour_creating_circle_0_exec)
  274. _main_behaviour_creating_circle_0.setTrigger(Event("circle_created", None))
  275. self.states["/main_behaviour/creating_circle"].addTransition(_main_behaviour_creating_circle_0)
  276. # transition /main_behaviour/bouncing
  277. _main_behaviour_bouncing_0 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  278. _main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
  279. _main_behaviour_bouncing_0.setTrigger(Event("_0after"))
  280. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
  281. _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/selected"]])
  282. _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
  283. _main_behaviour_bouncing_1.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  284. _main_behaviour_bouncing_1.setGuard(self._main_behaviour_bouncing_1_guard)
  285. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
  286. _main_behaviour_bouncing_2 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
  287. _main_behaviour_bouncing_2.setAction(self._main_behaviour_bouncing_2_exec)
  288. _main_behaviour_bouncing_2.setTrigger(Event("update_bounds", None))
  289. self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_2)
  290. # transition /main_behaviour/dragging
  291. _main_behaviour_dragging_0 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/dragging"]])
  292. _main_behaviour_dragging_0.setAction(self._main_behaviour_dragging_0_exec)
  293. _main_behaviour_dragging_0.setTrigger(Event("mouse_move", self.getInPortName("ball_ui")))
  294. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_0)
  295. _main_behaviour_dragging_1 = Transition(self, self.states["/main_behaviour/dragging"], [self.states["/main_behaviour/bouncing"]])
  296. _main_behaviour_dragging_1.setAction(self._main_behaviour_dragging_1_exec)
  297. _main_behaviour_dragging_1.setTrigger(Event("mouse_release", self.getInPortName("ball_ui")))
  298. self.states["/main_behaviour/dragging"].addTransition(_main_behaviour_dragging_1)
  299. # transition /main_behaviour/selected
  300. _main_behaviour_selected_0 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/main_behaviour/dragging"]])
  301. _main_behaviour_selected_0.setAction(self._main_behaviour_selected_0_exec)
  302. _main_behaviour_selected_0.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
  303. _main_behaviour_selected_0.setGuard(self._main_behaviour_selected_0_guard)
  304. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_0)
  305. _main_behaviour_selected_1 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/deleted"]])
  306. _main_behaviour_selected_1.setAction(self._main_behaviour_selected_1_exec)
  307. _main_behaviour_selected_1.setTrigger(Event("delete_self", None))
  308. self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_1)
  309. def _main_behaviour_creating_circle_enter(self):
  310. 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']]))
  311. def _main_behaviour_bouncing_enter(self):
  312. self.addTimer(0, 0.02)
  313. def _main_behaviour_bouncing_exit(self):
  314. self.removeTimer(0)
  315. def _main_behaviour_initializing_0_exec(self, parameters):
  316. association_name = parameters[0]
  317. self.association_name = association_name
  318. def _main_behaviour_creating_circle_0_exec(self, parameters):
  319. canvas_id = parameters[0]
  320. circle_id = parameters[1]
  321. self.circle_id = circle_id
  322. 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']]))
  323. 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']]))
  324. 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']]))
  325. def _main_behaviour_bouncing_0_exec(self, parameters):
  326. # Invert velocity when colliding with canvas border:
  327. if self.pos['x']-self.r <= self.rect_pos['x'] - (self.rect_dim['x'] / 2) or self.pos['x']+self.r >= self.rect_pos['x'] + (self.rect_dim['x'] / 2):
  328. self.vel['x'] = -self.vel['x'] + self.rect_vel['x'];
  329. if self.pos['y']-self.r <= self.rect_pos['y'] - (self.rect_dim['y'] / 2) or self.pos['y']+self.r >= self.rect_pos['y'] + (self.rect_dim['y'] / 2):
  330. self.vel['y'] = -self.vel['y'] + self.rect_vel['y'];
  331. self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, self.vel['x'], self.vel['y']]))
  332. self.pos['x'] += self.vel['x']
  333. self.pos['y'] += self.vel['y']
  334. def _main_behaviour_bouncing_1_exec(self, parameters):
  335. x = parameters[0]
  336. y = parameters[1]
  337. button = parameters[2]
  338. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#ff0']))
  339. def _main_behaviour_bouncing_1_guard(self, parameters):
  340. x = parameters[0]
  341. y = parameters[1]
  342. button = parameters[2]
  343. return button == ui.MOUSE_BUTTONS.LEFT
  344. def _main_behaviour_bouncing_2_exec(self, parameters):
  345. pos = parameters[0]
  346. dim = parameters[1]
  347. vel = parameters[2]
  348. self.rect_pos = pos
  349. self.rect_dim = dim
  350. self.rect_vel = vel
  351. def _main_behaviour_dragging_0_exec(self, parameters):
  352. x = parameters[0]
  353. y = parameters[1]
  354. button = parameters[2]
  355. # Always keep ball within canvas:
  356. x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
  357. y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
  358. dx = x - self.pos['x']
  359. dy = y - self.pos['y']
  360. self.vel = {
  361. 'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
  362. 'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
  363. }
  364. self.pos = {'x': x, 'y': y}
  365. self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, x-self.r, y-self.r]))
  366. def _main_behaviour_dragging_1_exec(self, parameters):
  367. x = parameters[0]
  368. y = parameters[1]
  369. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.circle_id, '#f00']))
  370. def _main_behaviour_selected_0_exec(self, parameters):
  371. x = parameters[0]
  372. y = parameters[1]
  373. button = parameters[2]
  374. self.mouse_pos = {'x':x, 'y':y};
  375. def _main_behaviour_selected_0_guard(self, parameters):
  376. x = parameters[0]
  377. y = parameters[1]
  378. button = parameters[2]
  379. return button == ui.MOUSE_BUTTONS.LEFT
  380. def _main_behaviour_selected_1_exec(self, parameters):
  381. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
  382. self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.element_id]))
  383. def initializeStatechart(self):
  384. # enter default state
  385. self.default_targets = self.states["/main_behaviour"].getEffectiveTargetStates()
  386. RuntimeClassBase.initializeStatechart(self)
  387. class ObjectManager(ObjectManagerBase):
  388. def __init__(self, controller):
  389. ObjectManagerBase.__init__(self, controller)
  390. def instantiate(self, class_name, construct_params):
  391. if class_name == "MainApp":
  392. instance = MainApp(self.controller)
  393. instance.associations = {}
  394. instance.associations["elevator"] = Association("Elevator", 0, -1)
  395. elif class_name == "Elevator":
  396. instance = Elevator(self.controller, construct_params[0])
  397. instance.associations = {}
  398. instance.associations["balls"] = Association("Ball", 0, -1)
  399. instance.associations["parent"] = Association("MainApp", 1, 1)
  400. elif class_name == "Ball":
  401. instance = Ball(self.controller, construct_params[0], construct_params[1], construct_params[2])
  402. instance.associations = {}
  403. instance.associations["parent"] = Association("Field", 1, 1)
  404. else:
  405. raise Exception("Cannot instantiate class " + class_name)
  406. return instance
  407. class Controller(EventLoopControllerBase):
  408. def __init__(self, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
  409. if finished_callback == None: finished_callback = None
  410. if behind_schedule_callback == None: behind_schedule_callback = None
  411. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
  412. self.addInputPort("ui")
  413. self.addOutputPort("ui")
  414. self.object_manager.createInstance("MainApp", [])