def init_demos(self): nlds_index = self.system_combo.GetSelection() nlds = self.main_window.systems[nlds_index] # get system prefix from demo name # should be SystemName_DemoName.py system_prefix = nlds.__module__.split('.')[-1] names = [] # checks each loaded demo for name match for demo in self.main_window.demos: demo_module = demo.__module__.split('.')[-1] demo_prefix = demo_module.split('_')[0] if demo_prefix == system_prefix: names.append(demo.name) names.append("Custom Parameter Settings") self.demo_combo.SetItems(names) self.demo_combo.SetSelection(0) dypy.debug("MainPanel", "Found %d demos for %s." %(len(names), nlds.name)) # update description of current demo self.update_demo()
def show(): gui = wx.PySimpleApp() frame = MainWindow() dypy.debug("MainWindow", "Starting event loop.\n") gui.MainLoop() dypy.debug("MainWindow", "Exiting event loop.")
def init_systems(self): names = [ system.name for system in self.main_window.systems ] self.system_combo.SetItems(names) self.system_combo.SetSelection(0) dypy.debug("MainPanel", "System selection initialized.") self.update_system()
def __init__(self, **kwds): Tool.__init__(self, name='Orbit Visualization', description='An animated orbit diagram.', server=kwds['server']) dypy.debug('OrbitTool', 'Initialized.') self.age_max = 1000 self.density = 3 self.clear_each_frame = True
def init_tools(self): names = [ tool.name for tool in self.main_window.tools ] self.tool_combo.SetItems(names) self.tool_combo.SetSelection(0) dypy.debug("MainPanel", "Tool selection initialized.") self.update_tool()
def __init__(self, main_window, parent): wx.Panel.__init__(self, parent, wx.ID_ANY) self.main_window = main_window # gui components # combo components contain loaded module/class names # about components contain description of current selection self.system_label = Widgets.LabelText(self, "Select a dynamical system:") self.system_combo = Widgets.ChoiceList(self) self.system_about = Widgets.AboutText(self) self.demo_label = Widgets.LabelText(self, "Select a demo:") self.demo_combo = Widgets.ChoiceList(self) self.demo_about = Widgets.AboutText(self) self.tool_label = Widgets.LabelText(self, "Select a visualization tool:") self.tool_combo = Widgets.ChoiceList(self) self.tool_about = Widgets.AboutText(self) # begin component layout sizer = wx.BoxSizer(wx.VERTICAL) # add system components (nlds: nonlinear dynamical system) sizer.Add(self.system_label, 0, wx.ALIGN_LEFT | wx.TOP | wx.LEFT, 4) sizer.AddSpacer(2) sizer.Add(self.system_combo, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(self.system_about, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(10) # add demo components sizer.Add(self.demo_label, 0, wx.ALIGN_LEFT | wx.TOP | wx.LEFT, 4) sizer.AddSpacer(2) sizer.Add(self.demo_combo, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(self.demo_about, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(10) # add tool components sizer.Add(self.tool_label, 0, wx.ALIGN_LEFT | wx.TOP | wx.LEFT, 4) sizer.AddSpacer(2) sizer.Add(self.tool_combo, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(self.tool_about, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(10) self.SetSizer(sizer) # set event handlers for choices wx.EVT_CHOICE(self, self.system_combo.GetId(), self.update_system) wx.EVT_CHOICE(self, self.demo_combo.GetId(), self.update_demo) wx.EVT_CHOICE(self, self.tool_combo.GetId(), self.update_tool) # populate the system, demo, and tool choices # init_systems will populate the demo choices self.init_systems() self.init_tools() dypy.debug("MainPanel", "Panel initialized.")
def on_exit_dypy(self, event): dypy.debug("MainWindow", "Exiting dypy.") try: # signal server to close visualization window self.server.on_close() finally: #close gui window self.Destroy()
def set_state_index(self, axis_index, state_index): self.points_lock.acquire() try: self.state_indices[axis_index] = state_index self.server.update_tool(self) dypy.debug("DynamicsTool", "State index updated.") finally: self.points_lock.release()
def set_parameter_index(self, axis_index, parameter_index): self.points_lock.acquire() try: self.parameter_indices[axis_index] = parameter_index self.server.update_tool(self) dypy.debug("DynamicsTool", "Parameter index updated.") finally: self.points_lock.release()
def __init__(self, **kwds): Tool.__init__( self, name="Phase Portrait Visualization", description="An animated phase space portrait.", server=kwds["server"], ) dypy.debug("PortraitTool", "initialized") self.density = 150 self.use_lines = False # if false, draw unconnected points
def run(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.s.bind(('', self.port)) dypy.debug(self.device_name, 'Started server on port ' + str(self.port)) while not self.stopped: data, address = self.s.recvfrom(1024) self.parse_function(data) dypy.debug(self.device_name, 'Stopped server')
def update_tool_panel(self, system, tool): # set active tool self.active_tool = tool # set system for active tool self.active_tool.update_system(system) # insert tool gui into notebook display self.notebook.RemovePage(2) self.notebook.InsertPage(2, self.active_tool, self.active_tool.name) dypy.debug("MainWindow", "Tool panel changed to %s." % tool.name)
def update_system(self, event = wx.CommandEvent()): nlds_index = self.system_combo.GetSelection() nlds = self.main_window.systems[nlds_index] self.system_about.SetValue(nlds.description) dypy.debug("MainPanel", "System is now %s." % nlds.name) # populate demos for selected system self.init_demos() # let main window update the system panel self.main_window.update_system_panel(nlds)
def update_system_panel(self, system): # create system panel and trigger layout self.system_panel = SystemPanel(self, self.notebook, system) self.system_panel.Layout() # reinsert system panel into notebook display self.notebook.RemovePage(1) self.notebook.InsertPage(1, self.system_panel, system.name) dypy.debug("MainWindow", "System panel changed to %s." % system.name) # update active tool's system self.active_tool.update_system(system)
def on_browse(self, event): filter = "dypy Demo files (*.db)|*.db" dialog = wx.FileDialog(self, message = "Select Save Location", \ wildcard = filter, style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, \ defaultDir = self.default_dir, defaultFile = self.default_file) if dialog.ShowModal() == wx.ID_OK: self.location_text.Clear() self.location_text.SetValue(dialog.GetPath()) dypy.debug("SaveDialog", "Save location set to %s." % dialog.GetPath()) else: dypy.debug("SaveDialog", "Location selection canceled.")
def set_system(self, system): dypy.debug("DynamicsTool", "Attempting to update system.") self.points_lock.acquire() try: self.server.window.set_caption(system.name) self.system = system self.parameter_indices = [0, 1, 2] self.state_indices = [0, 1, 2] self.server.update_tool(self) dypy.debug("DynamicsTool", "System set to %s." % system.name) finally: self.points_lock.release()
def set_state_ranges(self, state_ranges): self.points_lock.acquire() try: self.state_ranges = state_ranges self.server.update_tool(self) x_bounds, y_bounds, z_bounds = self.get_bounds() self.server.set_bounds(x_bounds, y_bounds, z_bounds) self.server.set_axes_center(sum(x_bounds)/2.0, sum(y_bounds)/2.0, sum(z_bounds)/2.0) dypy.debug("DynamicsTool", "State ranges updated.") finally: self.points_lock.release()
def on_stop(self, event = wx.CommandEvent()): # enable selecting system and tool self.main_panel.unlock() # change stop button text and event handling self.start_button.SetLabel("Start Visualization") self.start_button.SetFont(Widgets.BoldFont()) wx.EVT_BUTTON(self, self.start_button.GetId(), self.on_start) # make system panel active self.notebook.SetSelection(0) self.server.pause() dypy.debug("MainWindow", "Visualization stopped.\n")
def on_start(self, event): # disable changing system and tool self.main_panel.lock() # change start button text and event handling self.start_button.SetLabel("Stop Visualization") self.start_button.SetFont(Widgets.ItalicFont()) wx.EVT_BUTTON(self, self.start_button.GetId(), self.on_stop) # make tool panel active self.notebook.SetSelection(2) self.server.unpause() dypy.debug("MainWindow", "Visualization started.\n")
def update_parameters(self, event = wx.CommandEvent()): ranges = [] # get range strings and convert to floating point numbers for i in range(len(self.param_names)): min = float(self.param_min_controls[i].GetValue()) max = float(self.param_max_controls[i].GetValue()) ranges.append((min, max)) dypy.debug("SystemPanel", "Parameter ranges updated.") # update ranges for the active tool self.main_window.active_tool.set_parameter_ranges(ranges)
def update_tool(self, event = wx.CommandEvent()): tool_index = self.tool_combo.GetSelection() tool = self.main_window.tools[tool_index] system_index = self.system_combo.GetSelection() system = self.main_window.systems[system_index] self.tool_about.SetValue(tool.description) dypy.debug("MainPanel", "Tool is now %s" % tool.name) # let main window update the tool panel self.main_window.update_tool_panel(system, tool) self.main_window.system_panel.update_state() self.main_window.system_panel.update_parameters()
def update_demo(self, event = wx.CommandEvent()): demo_name = self.demo_combo.GetStringSelection() dypy.debug("MainPanel", "Demo is now %s." % demo_name) # set custom parameter settings about message if demo_name == "Custom Parameter Settings": self.demo_about.SetValue("Manually enter custom parameter settings on the %s tab." % self.system_combo.GetStringSelection()) return # find demo class reference by name for demo in self.main_window.demos: if demo.name == demo_name: self.demo_about.SetValue(demo.description) self.main_window.update_parameters(demo) return
def update_system(self, system): # update state axis choices self.state_choice.SetItems(system.get_state_names()) self.state_choice.SetSelection(0) # update parameter choices self.param_choice.SetItems(system.get_parameter_names()) self.param_choice.SetSelection(0) dypy.debug("OrbitToolGUI", "Updated for system %s." % system.name) # set system in tool self.tool.set_system(system) # trigger state/param choice event handling self.on_state_selected() self.on_param_selected()
def __init__(self, parent, name): wx.Panel.__init__(self, parent) # get tool from tool server ns = Pyro.naming.NameServerLocator().getNS(host='localhost') uri = ns.resolve(name) self.tool = uri.getAttrProxy() dypy.debug(name + 'GUI', 'Connected to server.') self.name = self.tool.name self.description = self.tool.description self.set_parameter_ranges = self.tool.set_parameter_ranges self.set_state_ranges = self.tool.set_state_ranges # stay hidden when created self.Hide()
def __init__(self, parent): ToolGUI.__init__(self, parent, 'PortraitTool') # gui components: labels state_x_label = Widgets.LabelText(self, "Select State for x-Axis:") state_y_label = Widgets.LabelText(self, "Select State for y-Axis:") state_z_label = Widgets.LabelText(self, "Select State for z-Axis:") mode_label = Widgets.LabelText(self, "Select Visualization Mode:") # gui components: selection self.state_x_choice = Widgets.ChoiceList(self) self.state_y_choice = Widgets.ChoiceList(self) self.state_z_choice = Widgets.ChoiceList(self) self.mode_check = Widgets.Checkbox(self, "Draw Lines") sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(state_x_label, 0, wx.ALIGN_LEFT | wx.ALL, 4) sizer.Add(self.state_x_choice, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(state_y_label, 0, wx.ALIGN_LEFT | wx.ALL, 4) sizer.Add(self.state_y_choice, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(state_z_label, 0, wx.ALIGN_LEFT | wx.ALL, 4) sizer.Add(self.state_z_choice, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4) sizer.AddSpacer(2) sizer.Add(mode_label, 0, wx.ALIGN_LEFT | wx.ALL, 4) sizer.Add(self.mode_check, 0, wx.LEFT, 30) sizer.AddStretchSpacer(1) # register event handling wx.EVT_CHOICE(self, self.state_x_choice.GetId(), self.on_state_x_selected) wx.EVT_CHOICE(self, self.state_y_choice.GetId(), self.on_state_y_selected) wx.EVT_CHOICE(self, self.state_z_choice.GetId(), self.on_state_z_selected) wx.EVT_CHECKBOX(self, self.mode_check.GetId(), self.on_mode_selected) self.SetSizerAndFit(sizer) dypy.debug("PortraitToolGUI", "Initialized.")
def update_system(self, system): # update state axis choices state_names = system.get_state_names() self.state_x_choice.SetItems(state_names) self.state_x_choice.SetSelection(0) self.state_y_choice.SetItems(state_names) self.state_y_choice.SetSelection(1 if len(state_names) > 0 else 0) self.state_z_choice.SetItems(state_names) self.state_z_choice.SetSelection(2 if len(state_names) > 1 else 0) dypy.debug("PortraitToolGUI", "Updated for system %s." % system.name) # set system in tool self.tool.set_system(system) # trigger state/param choice event handling self.on_state_x_selected() self.on_state_y_selected() self.on_state_z_selected()
def on_save_demo(self, event): dypy.debug("MainWindow", "Saving demo to file.") dialog = Widgets.SaveDialog(self) if dialog.ShowModal() == wx.ID_OK: dypy.debug("MainWindow", "Saving demo as file %s." % dialog.location_text.GetValue()) shelf = shelve.open(dialog.location_text.GetValue()) shelf["demo system"] = self.main_panel.get_system_name() shelf["demo name"] = dialog.name_text.GetValue() shelf["demo description"] = dialog.description_text.GetValue() shelf["demo tool"] = self.main_panel.get_tool_name() self.save_control(shelf, "state minimum controls", self.system_panel.state_min_controls) self.save_control(shelf, "state maximum controls", self.system_panel.state_max_controls) self.save_control(shelf, "parameter minimum controls", self.system_panel.param_min_controls) self.save_control(shelf, "parameter maximum controls", self.system_panel.param_max_controls) shelf["pp x axis"] = self.tools[2].state_x_choice.GetSelection() shelf["pp y axis"] = self.tools[2].state_y_choice.GetSelection() shelf["pp z axis"] = self.tools[2].state_z_choice.GetSelection() shelf["orbit state axis"] = self.tools[0].state_choice.GetSelection() shelf["orbit parameter axis"] = self.tools[0].param_choice.GetSelection() shelf.close() else: dypy.debug("MainWindow", "Saving demo canceled by user.") dialog.Destroy()
def __init__(self, **kwds): Tool.__init__(self, name="Cobweb Visualization", description="", server=kwds["server"]) dypy.debug("CobwebTool", "initialized")
def on_param_selected(self, event = wx.CommandEvent()): index = self.param_choice.GetSelection() self.tool.set_parameter_index(0, index) dypy.debug("OrbitToolGUI", "Parameter is now %s." \ % self.param_choice.GetStringSelection())
def on_state_selected(self, event = wx.CommandEvent()): index = self.state_choice.GetSelection() self.tool.set_state_index(0, index) dypy.debug("OrbitToolGUI", "State axis is now %s." \ % self.state_choice.GetStringSelection())