particle_interaction_vis_runner.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. '''
  2. Created on 27-jul.-2014
  3. @author: Simon
  4. '''
  5. import time, threading
  6. from Queue import Empty
  7. import Tkinter as tk
  8. from tkinter_widget import TkinterWidget
  9. import particle_interaction_vis
  10. from particle_interaction import *
  11. from python_runtime.statecharts_core import Event
  12. from python_runtime.tkinter_eventloop import *
  13. class Root(tk.Tk):
  14. def __init__(self, framerate):
  15. tk.Tk.__init__(self)
  16. self.framerate = framerate
  17. def set_controller(self, controller):
  18. self.controller = controller
  19. self.ui_reply_port = self.controller.addOutputListener('output')
  20. def set_sim(self, sim):
  21. self.sim = sim
  22. def handle_output_pos(self, msgs):
  23. for msg_contents in msgs:
  24. event = None
  25. if msg_contents[0] == "delete":
  26. event = Event("delete_particle", "input", [msg_contents[1]])
  27. elif msg_contents[0] == "created":
  28. event = Event("create_particle", "input", [msg_contents[1:]])
  29. else:
  30. event = Event("move_particle", "input", [msg_contents])
  31. self.controller.addInput(event)
  32. def handle_output_color(self, msgs):
  33. for msg_contents in msgs:
  34. event = Event("color_particle", "input", [msg_contents])
  35. self.controller.addInput(event)
  36. def handle_output_time(self, msgs):
  37. for msg_contents in msgs:
  38. self.controller.addInput(Event("update_time", "input", ["%.2f" % (float(msg_contents) / self.framerate)]))
  39. def check_output(self):
  40. while True:
  41. reply_msg = self.ui_reply_port.fetch(0)
  42. if reply_msg == None:
  43. break
  44. event_name = reply_msg.getName()
  45. parameters = reply_msg.getParameters()
  46. if event_name == "particle_clicked":
  47. self.sim.realtime_interrupt("INTERRUPT %i" % parameters[0])
  48. elif event_name == "delete_selected":
  49. self.sim.realtime_interrupt("INTERRUPT delete_selected")
  50. self.after(100, self.check_output)
  51. if __name__ == '__main__':
  52. try:
  53. opts, args = getopt.getopt(sys.argv[1:], "w:h:f:s:d:r:", ["width=", "height=", "framerate=", "spawn_chance=", "die_chance=", "random_seed="])
  54. except getopt.GetoptError, e:
  55. print e
  56. sys.exit(2)
  57. width, height, framerate, spawn_chance, die_chance, random_seed = [None] * 6
  58. for opt, arg in opts:
  59. if opt in ("--width", "-w"):
  60. width = int(arg)
  61. elif opt in ("--height", "-h"):
  62. height = int(arg)
  63. elif opt in ("--framerate", "-f"):
  64. framerate = int(arg)
  65. elif opt in ("--spawn_chance", "-s"):
  66. spawn_chance = float(arg)
  67. elif opt in ("--die_chance", "-d"):
  68. die_chance = float(arg)
  69. elif opt in ("--random_seed", "-r"):
  70. random_seed = int(arg)
  71. resolution = (width or 800, height or 600)
  72. framerate = framerate or 30
  73. spawn_chance = 0.2 if spawn_chance is None else spawn_chance
  74. die_chance = 0.01 if die_chance is None else die_chance
  75. root = Root(framerate)
  76. root.withdraw()
  77. model = Field(Canvas(resolution), framerate, spawn_chance, die_chance)
  78. sim = Simulator(model)
  79. sim.setRealTime(True, 1.0 / framerate)
  80. sim.setRealTimeInputFile(None)
  81. sim.setRealTimePorts({'INTERRUPT': model.INTERRUPT})
  82. sim.setRealTimePlatformTk(root)
  83. sim.setDSDEVS(True)
  84. sim.setClassicDEVS(True)
  85. sim.setTerminationTime(60 * framerate)
  86. #sim.setVerbose("myOutputFile")
  87. controller = particle_interaction_vis.Controller(root, resolution, TkEventLoop(root))
  88. TkinterWidget.controller = controller
  89. root.set_controller(controller)
  90. root.set_sim(sim)
  91. sim.setListenPorts(model.POS_OUT, root.handle_output_pos)
  92. sim.setListenPorts(model.COLOR_OUT, root.handle_output_color)
  93. sim.setListenPorts(model.TIME_OUT, root.handle_output_time)
  94. root.check_output()
  95. controller.start()
  96. sim.simulate()
  97. root.mainloop()