Esempio n. 1
0
class Window(Frame):
  
	def __init__(self, parent):
		Frame.__init__(self, parent)
		 
		self.parent = parent
		self.G = nx.DiGraph()
		self.D = nx.DiGraph()
		self.initUI()
			

	# exits out of gui when clicked on 
	def exit(self, event=None):
		self.quit()

	# will update saved file if filename already exists or open up save as function 
	def save(self, event=None):
		if hasattr(self, 'filename'):
			pickle.dump(self.G, open(str(self.filename), 'w'))
			# add to log file
			s = str(self.filename)
			filename = s.split('/')
			log = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ": Saved file: " + filename[len(filename)-1]
			self.geoCanvas.appendLog(log)
		else:
			self.save_as()

	# can save network x graph (node/edges and attributes) as any type of text file
	def save_as(self, event=None):
		for node in self.G.nodes():
			self.G.node[node]['systems'] = self.geoCanvas.manager.systems
		fileExt = tkFileDialog.asksaveasfilename(defaultextension=".txt")
		if fileExt != '': # asksaveasfile returns '' if dialog closed with "cancel".
			self.filename = fileExt
			s = str(self.filename)
			filename = s.split('/')
			self.parent.title("ANCR-GUI - " + filename[len(filename)-1])
			pickle.dump(self.G, open(str(self.filename), 'w'))

		# add to log file
		log = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ": Saved file as: " + str(self.filename)
		self.geoCanvas.appendLog(log)

	# can open any previously saved network x graph and plot nodes and edges onto the canvas, and resume all gui functionality 
	def open(self, event=None):
		fileExt = tkFileDialog.askopenfilename()
		if fileExt != '':
			self.filename = fileExt
			s = str(self.filename)
			filename = s.split('/')
			self.parent.title("ANCR-GUI - " + filename[len(filename)-1])

			self.G = pickle.load(open(str(self.filename)))
			self.G = nx.convert_node_labels_to_integers(self.G, first_label=1)
			for widget in self.leftFrame.winfo_children():
				widget.destroy()
			self.geoCanvas = CanvasFrame(self.leftFrame, self.rightCanvasFrame, self.G, self.D)
			self.createTabs()

			# redraw nodes
			for nodeNum in self.G.nodes():
				r = 8
				if 'Type' in self.G.node[nodeNum] and self.G.node[nodeNum]['Type'] == 'Compartment':
					self.geoCanvas.systemsCanvas.create_oval(self.G.node[nodeNum]['x_coord']-r, self.G.node[nodeNum]['y_coord']-r, self.G.node[nodeNum]['x_coord']+r, self.G.node[nodeNum]['y_coord']+r, fill='blue', tag='node') 
				else:
					self.geoCanvas.systemsCanvas.create_oval(self.G.node[nodeNum]['x_coord']-r, self.G.node[nodeNum]['y_coord']-r, self.G.node[nodeNum]['x_coord']+r, self.G.node[nodeNum]['y_coord']+r, fill='red', tag='node') 
			# redraw edges
			for startNode, endNode in self.G.edges():
				edgeItem=self.geoCanvas.systemsCanvas.create_line(self.G.edge[startNode][endNode]['x1_coord'], self.G.edge[startNode][endNode]['y1_coord'], self.G.edge[startNode][endNode]['x2_coord'], self.G.edge[startNode][endNode]['y2_coord'], tag='edge')
				self.geoCanvas.systemsCanvas.addtag_withtag(str(startNode), edgeItem)
				self.geoCanvas.systemsCanvas.addtag_withtag(str(endNode), edgeItem)
				self.G.edge[startNode][endNode]['edgeID'] = edgeItem
			
			# reload demands
			self.geoCanvas.manager.systems = self.G.node[1]['systems']
			for key in self.geoCanvas.manager.systems:
				self.geoCanvas.optionList.insert(len(self.geoCanvas.optionList)-2, key)
				self.geoCanvas.dropdown.destroy()
				self.geoCanvas.dropdown = OptionMenu(self.geoCanvas.toolbar, self.geoCanvas.v, *self.geoCanvas.optionList, command=self.geoCanvas.newOptionMenu)
				self.geoCanvas.dropdown.configure(bg="light blue")
				self.geoCanvas.dropdown.pack(side='left')

			# add to log file
			log = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ": Opened file: " + str(self.filename)
			self.geoCanvas.appendLog(log)	
	# creates the gui menubar
	def createTabs(self):
		# Binds submenus to their shortcut key; use ctrl for windows and cmd for OS X
		if _platform == "win32":
			self.parent.bind('<Control-z>', self.geoCanvas.undo)
			self.parent.bind('<Control-Z>', self.geoCanvas.redo)
			self.parent.bind('<Control-s>', self.save)
			self.parent.bind('<Control-S>', self.save_as)
			self.parent.bind('<Control-o>', self.open)
			self.parent.bind('<Control-q>', self.exit)
			accelPrefix = "Ctrl-"
		else:
			self.parent.bind('<Command-z>', self.geoCanvas.undo)
			self.parent.bind('<Command-Z>', self.geoCanvas.redo)
			self.parent.bind('<Command-s>', self.save)
			self.parent.bind('<Command-S>', self.save_as)
			self.parent.bind('<Command-o>', self.open)
			self.parent.bind('<Command-q>', self.exit)
			accelPrefix = "Cmd-"

		# MAIN MENUBAR
		menubar = Menu(self.parent)
		self.parent.config(menu=menubar)

		# File Tab
		fileTab = Menu(menubar, tearoff=0)
		fileTab.add_command(label="Open...", command=self.open, accelerator=accelPrefix+"O")
		fileTab.add_command(label="Save", command=self.save, accelerator=accelPrefix+"S")
		fileTab.add_command(label="Save As...", command=self.save_as, accelerator=accelPrefix+"Shift-S")
		fileTab.add_command(label="Exit", command=self.exit, accelerator=accelPrefix+"Q")
		menubar.add_cascade(label="File", menu=fileTab)

		# Edit Tab
		editTab = Menu(menubar, tearoff=0)
		editTab.add_command(label="Undo", command=self.geoCanvas.undo, accelerator=accelPrefix+"Z")
		editTab.add_command(label="Redo", command=self.geoCanvas.redo, accelerator=accelPrefix+"Shift-Z")
		menubar.add_cascade(label="Edit", menu=editTab)

		#View Tab
		viewTab = Menu(menubar, tearoff=0)
		viewTab.add_command(label="Show Labels", command=self.geoCanvas.showLabels)
		viewTab.add_command(label="Hide Labels", command=self.geoCanvas.hideLabels)
		menubar.add_cascade(label="View", menu=viewTab)

		#Window Tab
		windowTab = Menu(menubar, tearoff=0)
		windowTab.add_command(label='Log Window', command=self.geoCanvas.dockedWindows.logWindow)
		windowTab.add_command(label='Component Geometry', command=lambda:viewComponentGeo(self.G)) 
		windowTab.add_command(label='Compartment Geometry', command=lambda:viewCompartmentGeo(self.G))
		menubar.add_cascade(label="Windows", menu=windowTab)

		#Analysis Tab
		analysisTab = Menu(menubar, tearoff=0)
		analysisTab.add_command(label="Node Degrees", command=self.geoCanvas.dockedWindows.nodeDegrees)
		analysisTab.add_command(label='Centrality', command=self.geoCanvas.dockedWindows.centrality)
		menubar.add_cascade(label="Analysis", menu=analysisTab)

	def initUI(self):
		self.parent.title("ANCR-GUI")

		# Create left and right frames and packs them within the parent frame
		self.leftFrame = Frame(self.parent, bg='light blue', height=700, width=700) #light colored bg to see panel
		self.rightFrame = Frame(self.parent, bg="dark gray", height=700, width=400) #dark colored bg to see panel

		self.leftFrame.pack(side="left", fill="both", expand=1)
		#self.leftFrame.pack_propagate(0)
		self.rightFrame.pack(side="right", fill="y", expand=0)
		#self.rightFrame.pack_propagate(0)
		
		# Creates a scrollbar on the right frame and corresponding window which it controls
		self.rightSideCanvas = Canvas(self.rightFrame, height=700, width=400, bg='dark gray', highlightbackground='dark gray', highlightthickness=0)
		self.rightCanvasFrame = Frame(self.rightSideCanvas, bg='dark gray')
		self.vsb = Scrollbar(self.rightFrame, orient="vertical", command=self.rightSideCanvas.yview)
		self.rightSideCanvas.configure(yscrollcommand=self.vsb.set)

		self.vsb.pack(side="right", fill="y")
		self.rightSideCanvas.pack(side="left", expand=True)
		self.rightSideCanvas.create_window((0,0), window=self.rightCanvasFrame, anchor="nw")
		
		self.geoCanvas = CanvasFrame(self.leftFrame, self.rightCanvasFrame, self.G, self.D) # handles creation of canvas and miniframes
		self.rightCanvasFrame.bind("<Configure>", self.onFrameConfigure) # enables scrollbar functionality

		self.createTabs()

	# set the right frame window to match the scroll bar configure
	def onFrameConfigure(self, event):
		self.rightSideCanvas.configure(scrollregion=self.rightSideCanvas.bbox("all"), width=400, height=700)
class Window(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.G = nx.DiGraph()
        self.D = nx.DiGraph()
        self.initUI()

    # exits out of gui when clicked on
    def exit(self, event=None):
        self.quit()

    # will update saved file if filename already exists or open up save as function
    def save(self, event=None):
        if hasattr(self, 'filename'):
            pickle.dump(self.G, open(str(self.filename), 'w'))
            # add to log file
            s = str(self.filename)
            filename = s.split('/')
            log = datetime.now().strftime(
                '%Y-%m-%d %H:%M:%S') + ": Saved file: " + filename[
                    len(filename) - 1]
            self.geoCanvas.appendLog(log)
        else:
            self.save_as()

    # can save network x graph (node/edges and attributes) as any type of text file
    def save_as(self, event=None):
        for node in self.G.nodes():
            self.G.node[node]['systems'] = self.geoCanvas.manager.systems
        fileExt = tkFileDialog.asksaveasfilename(defaultextension=".txt")
        if fileExt != '':  # asksaveasfile returns '' if dialog closed with "cancel".
            self.filename = fileExt
            s = str(self.filename)
            filename = s.split('/')
            self.parent.title("ANCR-GUI - " + filename[len(filename) - 1])
            pickle.dump(self.G, open(str(self.filename), 'w'))

        # add to log file
        log = datetime.now().strftime(
            '%Y-%m-%d %H:%M:%S') + ": Saved file as: " + str(self.filename)
        self.geoCanvas.appendLog(log)

    # can open any previously saved network x graph and plot nodes and edges onto the canvas, and resume all gui functionality
    def open(self, event=None):
        fileExt = tkFileDialog.askopenfilename()
        if fileExt != '':
            self.filename = fileExt
            s = str(self.filename)
            filename = s.split('/')
            self.parent.title("ANCR-GUI - " + filename[len(filename) - 1])

            self.G = pickle.load(open(str(self.filename)))
            self.G = nx.convert_node_labels_to_integers(self.G, first_label=1)
            for widget in self.leftFrame.winfo_children():
                widget.destroy()
            self.geoCanvas = CanvasFrame(self.leftFrame, self.rightCanvasFrame,
                                         self.G, self.D)
            self.createTabs()

            # redraw nodes
            for nodeNum in self.G.nodes():
                r = 8
                if 'Type' in self.G.node[nodeNum] and self.G.node[nodeNum][
                        'Type'] == 'Compartment':
                    self.geoCanvas.systemsCanvas.create_oval(
                        self.G.node[nodeNum]['x_coord'] - r,
                        self.G.node[nodeNum]['y_coord'] - r,
                        self.G.node[nodeNum]['x_coord'] + r,
                        self.G.node[nodeNum]['y_coord'] + r,
                        fill='blue',
                        tag='node')
                else:
                    self.geoCanvas.systemsCanvas.create_oval(
                        self.G.node[nodeNum]['x_coord'] - r,
                        self.G.node[nodeNum]['y_coord'] - r,
                        self.G.node[nodeNum]['x_coord'] + r,
                        self.G.node[nodeNum]['y_coord'] + r,
                        fill='red',
                        tag='node')
            # redraw edges
            for startNode, endNode in self.G.edges():
                edgeItem = self.geoCanvas.systemsCanvas.create_line(
                    self.G.edge[startNode][endNode]['x1_coord'],
                    self.G.edge[startNode][endNode]['y1_coord'],
                    self.G.edge[startNode][endNode]['x2_coord'],
                    self.G.edge[startNode][endNode]['y2_coord'],
                    tag='edge')
                self.geoCanvas.systemsCanvas.addtag_withtag(
                    str(startNode), edgeItem)
                self.geoCanvas.systemsCanvas.addtag_withtag(
                    str(endNode), edgeItem)
                self.G.edge[startNode][endNode]['edgeID'] = edgeItem

            # reload demands
            self.geoCanvas.manager.systems = self.G.node[1]['systems']
            for key in self.geoCanvas.manager.systems:
                self.geoCanvas.optionList.insert(
                    len(self.geoCanvas.optionList) - 2, key)
                self.geoCanvas.dropdown.destroy()
                self.geoCanvas.dropdown = OptionMenu(
                    self.geoCanvas.toolbar,
                    self.geoCanvas.v,
                    *self.geoCanvas.optionList,
                    command=self.geoCanvas.newOptionMenu)
                self.geoCanvas.dropdown.configure(bg="light blue")
                self.geoCanvas.dropdown.pack(side='left')

            # add to log file
            log = datetime.now().strftime(
                '%Y-%m-%d %H:%M:%S') + ": Opened file: " + str(self.filename)
            self.geoCanvas.appendLog(log)

    # creates the gui menubar
    def createTabs(self):
        # Binds submenus to their shortcut key; use ctrl for windows and cmd for OS X
        if _platform == "win32":
            self.parent.bind('<Control-z>', self.geoCanvas.undo)
            self.parent.bind('<Control-Z>', self.geoCanvas.redo)
            self.parent.bind('<Control-s>', self.save)
            self.parent.bind('<Control-S>', self.save_as)
            self.parent.bind('<Control-o>', self.open)
            self.parent.bind('<Control-q>', self.exit)
            accelPrefix = "Ctrl-"
        else:
            self.parent.bind('<Command-z>', self.geoCanvas.undo)
            self.parent.bind('<Command-Z>', self.geoCanvas.redo)
            self.parent.bind('<Command-s>', self.save)
            self.parent.bind('<Command-S>', self.save_as)
            self.parent.bind('<Command-o>', self.open)
            self.parent.bind('<Command-q>', self.exit)
            accelPrefix = "Cmd-"

        # MAIN MENUBAR
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)

        # File Tab
        fileTab = Menu(menubar, tearoff=0)
        fileTab.add_command(label="Open...",
                            command=self.open,
                            accelerator=accelPrefix + "O")
        fileTab.add_command(label="Save",
                            command=self.save,
                            accelerator=accelPrefix + "S")
        fileTab.add_command(label="Save As...",
                            command=self.save_as,
                            accelerator=accelPrefix + "Shift-S")
        fileTab.add_command(label="Exit",
                            command=self.exit,
                            accelerator=accelPrefix + "Q")
        menubar.add_cascade(label="File", menu=fileTab)

        # Edit Tab
        editTab = Menu(menubar, tearoff=0)
        editTab.add_command(label="Undo",
                            command=self.geoCanvas.undo,
                            accelerator=accelPrefix + "Z")
        editTab.add_command(label="Redo",
                            command=self.geoCanvas.redo,
                            accelerator=accelPrefix + "Shift-Z")
        menubar.add_cascade(label="Edit", menu=editTab)

        #View Tab
        viewTab = Menu(menubar, tearoff=0)
        viewTab.add_command(label="Show Labels",
                            command=self.geoCanvas.showLabels)
        viewTab.add_command(label="Hide Labels",
                            command=self.geoCanvas.hideLabels)
        menubar.add_cascade(label="View", menu=viewTab)

        #Window Tab
        windowTab = Menu(menubar, tearoff=0)
        windowTab.add_command(label='Log Window',
                              command=self.geoCanvas.dockedWindows.logWindow)
        windowTab.add_command(label='Component Geometry',
                              command=lambda: viewComponentGeo(self.G))
        windowTab.add_command(label='Compartment Geometry',
                              command=lambda: viewCompartmentGeo(self.G))
        menubar.add_cascade(label="Windows", menu=windowTab)

        #Analysis Tab
        analysisTab = Menu(menubar, tearoff=0)
        analysisTab.add_command(
            label="Node Degrees",
            command=self.geoCanvas.dockedWindows.nodeDegrees)
        analysisTab.add_command(
            label='Centrality',
            command=self.geoCanvas.dockedWindows.centrality)
        menubar.add_cascade(label="Analysis", menu=analysisTab)

    def initUI(self):
        self.parent.title("ANCR-GUI")

        # Create left and right frames and packs them within the parent frame
        self.leftFrame = Frame(self.parent,
                               bg='light blue',
                               height=700,
                               width=700)  #light colored bg to see panel
        self.rightFrame = Frame(self.parent,
                                bg="dark gray",
                                height=700,
                                width=400)  #dark colored bg to see panel

        self.leftFrame.pack(side="left", fill="both", expand=1)
        #self.leftFrame.pack_propagate(0)
        self.rightFrame.pack(side="right", fill="y", expand=0)
        #self.rightFrame.pack_propagate(0)

        # Creates a scrollbar on the right frame and corresponding window which it controls
        self.rightSideCanvas = Canvas(self.rightFrame,
                                      height=700,
                                      width=400,
                                      bg='dark gray',
                                      highlightbackground='dark gray',
                                      highlightthickness=0)
        self.rightCanvasFrame = Frame(self.rightSideCanvas, bg='dark gray')
        self.vsb = Scrollbar(self.rightFrame,
                             orient="vertical",
                             command=self.rightSideCanvas.yview)
        self.rightSideCanvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.rightSideCanvas.pack(side="left", expand=True)
        self.rightSideCanvas.create_window((0, 0),
                                           window=self.rightCanvasFrame,
                                           anchor="nw")

        self.geoCanvas = CanvasFrame(
            self.leftFrame, self.rightCanvasFrame, self.G,
            self.D)  # handles creation of canvas and miniframes
        self.rightCanvasFrame.bind(
            "<Configure>",
            self.onFrameConfigure)  # enables scrollbar functionality

        self.createTabs()

    # set the right frame window to match the scroll bar configure
    def onFrameConfigure(self, event):
        self.rightSideCanvas.configure(
            scrollregion=self.rightSideCanvas.bbox("all"),
            width=400,
            height=700)