Exemple #1
0
	def __init__(self):
		dypy.debug("MainWindow", "Initializing window.")
		
		self.gui_title  = "dypy: Dynamical Systems in Python"
		self.gui_width  = 360
		self.gui_height = 650
		
		wx.Frame.__init__(self, None, wx.ID_ANY, self.gui_title)
		self.SetSize((self.gui_width, self.gui_height))
		self.SetBackgroundColour("#f0f0f0")
		
		# connect to tool server
		ns = Pyro.naming.NameServerLocator().getNS(host='localhost')
		uri = ns.resolve('ToolServer')
		self.server = uri.getAttrProxy()
		dypy.debug("MainWindow", "Connected to server.")

		panel = wx.Panel(self, wx.ID_ANY)
		panel.SetBackgroundColour("#f0f0f0")
		
		self.toolbar = self.init_toolbar(panel)	
		logo = Widgets.Logo(panel)
		
		self.notebook = wx.Notebook(panel, wx.ID_ANY, style = wx.NB_BOTTOM)
		self.notebook.SetFont(Widgets.PlainFont())
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(Main Tab)")
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(System Tab)")
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(Tool Tab)")
		
		self.start_button = wx.Button(panel, wx.ID_ANY, "Start Visualization")
		self.start_button.SetFont(Widgets.BoldFont())
		wx.EVT_BUTTON(self, self.start_button.GetId(), self.on_start)

		sizer = wx.BoxSizer(wx.VERTICAL)
		sizer.Add(self.toolbar, 0, wx.ALL | wx.EXPAND, 3)
		sizer.Add(wx.StaticLine(panel, wx.ID_ANY), 0, wx.EXPAND)
		sizer.Add(logo, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
		sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 10)
		sizer.Add(self.start_button, 0, wx.ALIGN_RIGHT | wx.RIGHT | wx.BOTTOM, 10)
		
		self.systems = get_systems()
		dypy.debug("MainWindow", "Loaded %d systems." % len(self.systems))
		
		# auto loading demos not implemented
		self.demos = get_demos()
		dypy.debug("MainWindow", "Loaded %d demos." % len(self.demos))
		
		# define tools
		self.tools = [OrbitToolGUI(self.notebook), CobwebToolGUI(self.notebook), PortraitToolGUI(self.notebook)]
		self.active_tool = self.tools[0]
		dypy.debug("MainWindow", "Loaded %d tools." % len(self.tools))
		
		dypy.debug("MainWindow", "Setting up main panel.")
		self.main_panel = MainPanel(self, self.notebook)
		self.notebook.RemovePage(0)
		self.notebook.InsertPage(0, self.main_panel, "Main", True)

		# make sure to close server when window closed
		self.Bind(wx.EVT_CLOSE, self.on_exit_dypy)

		panel.SetSizerAndFit(sizer)
		self.Show()
		
		dypy.debug("MainWindow", "Initialization complete.")
Exemple #2
0
class MainWindow(wx.Frame):
	def __init__(self):
		dypy.debug("MainWindow", "Initializing window.")
		
		self.gui_title  = "dypy: Dynamical Systems in Python"
		self.gui_width  = 360
		self.gui_height = 650
		
		wx.Frame.__init__(self, None, wx.ID_ANY, self.gui_title)
		self.SetSize((self.gui_width, self.gui_height))
		self.SetBackgroundColour("#f0f0f0")
		
		# connect to tool server
		ns = Pyro.naming.NameServerLocator().getNS(host='localhost')
		uri = ns.resolve('ToolServer')
		self.server = uri.getAttrProxy()
		dypy.debug("MainWindow", "Connected to server.")

		panel = wx.Panel(self, wx.ID_ANY)
		panel.SetBackgroundColour("#f0f0f0")
		
		self.toolbar = self.init_toolbar(panel)	
		logo = Widgets.Logo(panel)
		
		self.notebook = wx.Notebook(panel, wx.ID_ANY, style = wx.NB_BOTTOM)
		self.notebook.SetFont(Widgets.PlainFont())
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(Main Tab)")
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(System Tab)")
		self.notebook.AddPage(wx.Panel(self.notebook, wx.ID_ANY), "(Tool Tab)")
		
		self.start_button = wx.Button(panel, wx.ID_ANY, "Start Visualization")
		self.start_button.SetFont(Widgets.BoldFont())
		wx.EVT_BUTTON(self, self.start_button.GetId(), self.on_start)

		sizer = wx.BoxSizer(wx.VERTICAL)
		sizer.Add(self.toolbar, 0, wx.ALL | wx.EXPAND, 3)
		sizer.Add(wx.StaticLine(panel, wx.ID_ANY), 0, wx.EXPAND)
		sizer.Add(logo, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
		sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 10)
		sizer.Add(self.start_button, 0, wx.ALIGN_RIGHT | wx.RIGHT | wx.BOTTOM, 10)
		
		self.systems = get_systems()
		dypy.debug("MainWindow", "Loaded %d systems." % len(self.systems))
		
		# auto loading demos not implemented
		self.demos = get_demos()
		dypy.debug("MainWindow", "Loaded %d demos." % len(self.demos))
		
		# define tools
		self.tools = [OrbitToolGUI(self.notebook), CobwebToolGUI(self.notebook), PortraitToolGUI(self.notebook)]
		self.active_tool = self.tools[0]
		dypy.debug("MainWindow", "Loaded %d tools." % len(self.tools))
		
		dypy.debug("MainWindow", "Setting up main panel.")
		self.main_panel = MainPanel(self, self.notebook)
		self.notebook.RemovePage(0)
		self.notebook.InsertPage(0, self.main_panel, "Main", True)

		# make sure to close server when window closed
		self.Bind(wx.EVT_CLOSE, self.on_exit_dypy)

		panel.SetSizerAndFit(sizer)
		self.Show()
		
		dypy.debug("MainWindow", "Initialization complete.")
	
	# note: due to display inconsistencies, toolbar has been converted
	# to a normal panel with bitmap buttons.
	def init_toolbar(self, parent):		
		toolbar = wx.Panel(parent, wx.ID_ANY)
		toolbar.SetBackgroundColour("#f0f0f0")

		load_nlds = Widgets.ToolButton(toolbar, "icon_nlds.png")
		load_demo = Widgets.ToolButton(toolbar, "icon_demo.png")
		save_demo = Widgets.ToolButton(toolbar, "icon_save.png")
		view_help = Widgets.ToolButton(toolbar, "icon_help.png")
		exit_dypy = Widgets.ToolButton(toolbar, "icon_exit.png")

		wx.EVT_BUTTON(self, load_nlds.GetId(), self.on_load_system)
		wx.EVT_BUTTON(self, load_demo.GetId(), self.on_load_demo)
		wx.EVT_BUTTON(self, save_demo.GetId(), self.on_save_demo)
		wx.EVT_BUTTON(self, view_help.GetId(), self.on_view_help)
		wx.EVT_BUTTON(self, exit_dypy.GetId(), self.on_exit_dypy)
		
		sizer = wx.BoxSizer(wx.HORIZONTAL)
		sizer.Add(load_nlds, 0, wx.RIGHT, 3)
		sizer.Add(load_demo, 0, wx.RIGHT, 3)
		sizer.Add(save_demo, 0, wx.RIGHT, 0)
		sizer.AddStretchSpacer(wx.EXPAND)
		sizer.Add(view_help, 0, wx.RIGHT, 3)
		sizer.Add(exit_dypy, 0, wx.RIGHT, 0)
		
		toolbar.SetSizerAndFit(sizer)
		return toolbar
	
	# called when start visualization clicked
	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")

	# called when stop visualization clicked
	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_load_system(self, event):
		dypy.debug("MainWindow", "Loading system from file.")

	def on_load_demo(self, event):
		dypy.debug("MainWindow", "Loading demo from file.")
		self.on_stop()

		filter = "dypy Demo files (*.db)|*.db"
		dialog = wx.FileDialog(self, message = "Choose demo file", \
		wildcard = filter, style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, \
		defaultDir = os.path.join(dypy.__path__[0], "demos"))
		
		# open dialog and get file name
		if dialog.ShowModal() == wx.ID_OK:
			dypy.debug("MainWindow", "Loading demo from file %s." % dialog.GetPath())
			shelf = shelve.open(dialog.GetPath())
			
			demo_system = shelf["demo system"]
			demo_name = shelf["demo name"]
			demo_description = shelf["demo description"]
			demo_tool = shelf["demo tool"]
			
			dypy.debug("MainWindow", "Updating system to %s." % demo_system)
			self.main_panel.set_system_by_name(demo_system)
			
			dypy.debug("MainWindow", "Updating tool to %s." % demo_tool)
			self.main_panel.set_tool_by_name(demo_tool)
			
			dypy.debug("MainWindow", "Loading tool settings") 
			self.tools[2].state_x_choice.SetSelection(shelf["pp x axis"])
			self.tools[2].state_y_choice.SetSelection(shelf["pp y axis"])
			self.tools[2].state_z_choice.SetSelection(shelf["pp z axis"])
			self.tools[2].on_state_x_selected()
			self.tools[2].on_state_y_selected()
			self.tools[2].on_state_z_selected()
			
			self.tools[0].state_choice.SetSelection(shelf["orbit state axis"])
			self.tools[0].param_choice.SetSelection(shelf["orbit parameter axis"])
			self.tools[0].on_state_selected()
			self.tools[0].on_param_selected()
			
			dypy.debug("MainWindow", "Loading demo controls." )
			self.load_control(shelf, 'state minimum controls', self.system_panel.state_min_controls)
			self.load_control(shelf, 'state maximum controls', self.system_panel.state_max_controls)
			self.load_control(shelf, 'parameter minimum controls', self.system_panel.param_min_controls)
			self.load_control(shelf, 'parameter maximum controls', self.system_panel.param_max_controls)					
			self.system_panel.update_parameters()
			self.system_panel.update_state()			
			
			shelf.close()
		else:
			dypy.debug("MainWindow", "Loading demo canceled by user.")
		
		dialog.Destroy()

	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 load_control(self, shelf, key, controls):
		values = shelf[key]
		
		for i in xrange(0, len(controls)):
			controls[i].SetValue(values[i])
	
	def save_control(self, shelf, key, controls):
		values = []
		
		for i in xrange(0, len(controls)):
			values.append(controls[i].GetValue())
				
		shelf[key] = values	
	
	def on_view_help(self, event):
		dypy.debug("MainWindow", "Displaying help.")
	
	# called when exit button clicked on toolbar
	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()

	# updates system panel for currently selected system
	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)

	# updates tool panel for currently selected tool and system
	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)

	# updates parameter values when new demo is selected
	def update_parameters(self, demo):
		dypy.debug("MainWindow", "System parameters updated for %s." % demo.name)