source: orange/orange/OrangeWidgets/Unsupervised/OWNetworkFile.py @ 8155:3b3c8228397c

Revision 8155:3b3c8228397c, 17.2 KB checked in by miha <miha.stajdohar@…>, 3 years ago (diff)

Deleted the header text, made the widgets obsolete.

Line 
1"""
2THIS WIDGET IS OBSOLETE; USE OWNxFile.py
3"""
4
5#
6# OWNetworkFile.py
7# The Network File Widget
8# A widget for opening Network related files
9#
10import OWGUI, string, os.path, user, sys
11import orngNetwork
12
13from OWWidget import *
14from orange import Graph
15from orange import GraphAsList
16
17class OWNetworkFile(OWWidget):
18   
19    settingsList=["recentFiles", "recentDataFiles", "recentEdgesFiles"]
20   
21    def __init__(self,parent=None, signalManager = None):
22        OWWidget.__init__(self, parent, signalManager, "Network File", wantMainArea=False)
23
24        self.inputs = []
25        self.outputs = [("Network", orngNetwork.Network), ("Items", ExampleTable)]
26   
27        #set default settings
28        self.recentFiles = ["(none)"]
29        self.recentDataFiles = ["(none)"]
30        self.recentEdgesFiles = ["(none)"]
31       
32        self.domain = None
33        self.graph = None
34        #get settings from the ini file, if they exist
35        self.loadSettings()
36
37        #GUI
38        self.controlArea.layout().setMargin(4)
39        self.box = OWGUI.widgetBox(self.controlArea, box = "Graph File", orientation = "horizontal")
40        self.filecombo = OWGUI.comboBox(self.box, self, "filename")
41        self.filecombo.setMinimumWidth(250)
42        button = OWGUI.button(self.box, self, '...', callback = self.browseNetFile, disabled=0)
43        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
44        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
45       
46        self.databox = OWGUI.widgetBox(self.controlArea, box = "Vertices Data File", orientation = "horizontal")
47        self.datacombo = OWGUI.comboBox(self.databox, self, "dataname")
48        self.datacombo.setMinimumWidth(250)
49        button = OWGUI.button(self.databox, self, '...', callback = self.browseDataFile, disabled=0)
50        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
51        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
52       
53        self.edgesbox = OWGUI.widgetBox(self.controlArea, box = "Edges Data File", orientation = "horizontal")
54        self.edgescombo = OWGUI.comboBox(self.edgesbox, self, "edgesname")
55        self.edgescombo.setMinimumWidth(250)
56        button = OWGUI.button(self.edgesbox, self, '...', callback = self.browseEdgesFile, disabled=0)
57        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
58        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
59       
60        # info
61        box = OWGUI.widgetBox(self.controlArea, "Info")
62        self.infoa = OWGUI.widgetLabel(box, 'No data loaded.')
63        self.infob = OWGUI.widgetLabel(box, ' ')
64        self.infoc = OWGUI.widgetLabel(box, ' ')
65        self.infod = OWGUI.widgetLabel(box, ' ')
66
67        OWGUI.rubber(self.controlArea)
68        self.resize(150,100)
69        self.activateLoadedSettings()
70
71        # connecting GUI to code
72        self.connect(self.filecombo, SIGNAL('activated(int)'), self.selectNetFile)
73        self.connect(self.datacombo, SIGNAL('activated(int)'), self.selectDataFile)
74        self.connect(self.edgescombo, SIGNAL('activated(int)'), self.selectEdgesFile)
75       
76    # set the comboboxes
77    def setFileLists(self):
78        self.filecombo.clear()
79        if not self.recentFiles:
80            self.filecombo.addItem("(none)")
81        for file in self.recentFiles:
82            if file == "(none)":
83                self.filecombo.addItem("(none)")
84            else:
85                self.filecombo.addItem(os.path.split(file)[1])
86        self.filecombo.addItem("Browse documentation networks...")
87       
88        self.datacombo.clear()
89        if not self.recentDataFiles:
90            self.datacombo.addItem("(none)")
91        for file in self.recentDataFiles:
92            if file == "(none)":
93                self.datacombo.addItem("(none)")
94            else:
95                self.datacombo.addItem(os.path.split(file)[1])
96               
97        self.edgescombo.clear()
98        if not self.recentEdgesFiles:
99            self.edgescombo.addItem("(none)")
100        for file in self.recentEdgesFiles:
101            if file == "(none)":
102                self.edgescombo.addItem("(none)")
103            else:
104                self.edgescombo.addItem(os.path.split(file)[1])
105           
106        self.filecombo.updateGeometry()
107        self.datacombo.updateGeometry()
108        self.edgescombo.updateGeometry()
109     
110    def activateLoadedSettings(self):
111        # remove missing data set names
112        self.recentFiles = filter(os.path.exists, self.recentFiles)
113        self.recentDataFiles = filter(os.path.exists, self.recentDataFiles)
114        self.recentEdgesFiles = filter(os.path.exists, self.recentEdgesFiles)
115       
116        self.recentFiles.append("(none)")
117        self.recentDataFiles.append("(none)")
118        self.recentEdgesFiles.append("(none)")
119        self.setFileLists()
120       
121        if len(self.recentFiles) > 0 and os.path.exists(self.recentFiles[0]):
122            self.selectNetFile(0)
123
124        if len(self.recentDataFiles) > 1 and os.path.exists(self.recentDataFiles[1]):
125            self.selectDataFile(1)
126           
127        if len(self.recentEdgesFiles) > 1 and os.path.exists(self.recentEdgesFiles[1]):
128            self.selectEdgesFile(1)
129       
130    # user selected a graph file from the combo box
131    def selectNetFile(self, n):
132        if n < len(self.recentFiles) :
133            name = self.recentFiles[n]
134            self.recentFiles.remove(name)
135            self.recentFiles.insert(0, name)
136        elif n:
137            self.browseNetFile(1)
138           
139        if len(self.recentFiles) > 0:
140            self.setFileLists() 
141            self.openFile(self.recentFiles[0])
142   
143    # user selected a data file from the combo box
144    def selectEdgesFile(self, n):
145        if n < len(self.recentEdgesFiles) :
146            name = self.recentEdgesFiles[n]
147            self.recentEdgesFiles.remove(name)
148            self.recentEdgesFiles.insert(0, name)
149
150        if len(self.recentEdgesFiles) > 0:
151            self.setFileLists()
152            self.addEdgesFile(self.recentEdgesFiles[0])
153   
154    def selectDataFile(self, n):
155        if n < len(self.recentDataFiles) :
156            name = self.recentDataFiles[n]
157            self.recentDataFiles.remove(name)
158            self.recentDataFiles.insert(0, name)
159
160        if len(self.recentDataFiles) > 0:
161            self.setFileLists()
162            self.addDataFile(self.recentDataFiles[0])
163   
164    def openFile(self, fn):
165        """Read network from file."""
166       
167        # read network file
168        if fn != "(none)":
169            fileExt = lower(os.path.splitext(fn)[1])
170            if not fileExt in (".net", ".gml"):
171                self.graph = None
172                self.send("Network", None)
173                self.send("Items", None)
174                self.infoa.setText('No data loaded')
175                self.infob.setText('File extension does not match')
176                self.infoc.setText('')           
177                self.infod.setText('')
178                return
179           
180            data = self.readNetFile(fn)
181           
182            if data == None:
183                self.graph = None
184                self.send("Network", None)
185                self.send("Items", None)
186                self.infoa.setText('No data loaded')
187                self.infob.setText('Error reading file')
188                self.infoc.setText('')           
189                self.infod.setText('')
190                return
191
192            self.infoa.setText("%d nodes" % data.nVertices)
193           
194            if data.directed:
195                self.infob.setText("Directed graph")
196            else:
197                self.infob.setText("Undirected graph")
198           
199            # make new data and send it
200            fName = os.path.split(fn)[1]
201            if "." in fName:
202                #data.name = string.join(string.split(fName, '.')[:-1], '.')
203                pass
204            else:
205                #data.name = fName
206                pass
207               
208            self.graph = data
209        else:
210            self.graph = None
211            self.send("Network", None)
212            self.send("Items", None)
213            self.infoa.setText('No data loaded')
214            self.infob.setText('')
215            self.infoc.setText('')           
216            self.infod.setText('')
217       
218        # Find items data file for selected network
219        items_candidate = os.path.splitext(fn)[0] + ".tab"
220        if os.path.exists(items_candidate):
221            self.readDataFile(items_candidate)
222            self.recentDataFiles.insert(0, items_candidate)
223        elif os.path.exists(os.path.splitext(fn)[0] + "_items.tab"):
224            items_candidate = os.path.splitext(fn)[0] + "_items.tab"
225            self.readDataFile(items_candidate)
226            self.recentDataFiles.insert(0, items_candidate)
227        else:
228            if '(none)' in self.recentDataFiles: 
229                self.recentDataFiles.remove('(none)')
230            self.recentDataFiles.insert(0, '(none)')
231       
232        # Find links data file for selected network
233        links_candidate = os.path.splitext(fn)[0] + "_links.tab" 
234        if os.path.exists(links_candidate):
235            self.readEdgesFile(links_candidate)
236            self.recentEdgesFiles.insert(0, links_candidate)
237        else:
238            if '(none)' in self.recentEdgesFiles: 
239                self.recentEdgesFiles.remove('(none)')
240            self.recentEdgesFiles.insert(0, '(none)')
241       
242        self.setFileLists()
243       
244        self.send("Network", self.graph)
245        if self.graph != None and self.graph.items != None:
246            self.send("Items", self.graph.items)
247        else:
248            self.send("Items", None)
249       
250    def addDataFile(self, fn):
251        if fn == "(none)" or self.graph == None:
252            self.infoc.setText("No vertices data file specified")
253            self.send("Network", None)
254            self.send("Items", None)
255            return
256         
257        self.readDataFile(fn)
258       
259        self.send("Network", self.graph)
260        self.send("Items", self.graph.items)
261       
262    def readDataFile(self, fn):
263        table = ExampleTable(fn)
264       
265        if len(table) != self.graph.nVertices:
266            self.infoc.setText("Vertices data length does not match number of vertices")
267           
268            if '(none)' in self.recentDataFiles: 
269                self.recentDataFiles.remove('(none)')
270               
271            self.recentDataFiles.insert(0, '(none)')
272            self.setFileLists()
273            return
274       
275        self.graph.setattr("items", table)
276        self.infoc.setText("Vertices data file added")
277       
278    def addEdgesFile(self, fn):
279        if fn == "(none)" or self.graph == None:
280            self.infod.setText("No edges data file specified")
281            #self.graph.setattr("links", None)
282            self.send("Network", self.graph)
283            self.send("Items", None)
284            return
285       
286        self.readEdgesFile(fn)
287       
288        self.send("Network", self.graph)
289        self.send("Items", self.graph.items)
290       
291    def readEdgesFile(self, fn):
292        table = ExampleTable(fn)
293        if self.graph.directed:
294            nEdges = len(self.graph.getEdges())
295        else:
296            nEdges = len(self.graph.getEdges()) / 2
297           
298        if len(table) != nEdges:
299            self.infod.setText("Edges data length does not match number of edges")
300           
301            if '(none)' in self.recentEdgesFiles: 
302                self.recentEdgesFiles.remove('(none)')
303               
304            self.recentEdgesFiles.insert(0, '(none)')
305            self.setFileLists()
306            return
307       
308        self.graph.setattr("links", table)
309        self.infod.setText("Edges data file added")
310       
311    def browseNetFile(self, inDemos=0):
312        """user pressed the '...' button to manually select a file to load"""
313       
314        "Display a FileDialog and select a file"
315        if inDemos:
316            import os
317            try:
318                import orngConfiguration
319                startfile = orngConfiguration.datasetsPath
320            except:
321                startfile = ""
322               
323            if not startfile or not os.path.exists(startfile):
324                try:
325                    import win32api, win32con
326                    t = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, "SOFTWARE\\Python\\PythonCore\\%i.%i\\PythonPath\\Orange" % sys.version_info[:2], 0, win32con.KEY_READ)
327                    t = win32api.RegQueryValueEx(t, "")[0]
328                    startfile = t[:t.find("orange")] + "orange\\doc\\networks"
329                except:
330                    startfile = ""
331
332            if not startfile or not os.path.exists(startfile):
333                d = OWGUI.__file__
334                if d[-8:] == "OWGUI.py":
335                    startfile = d[:-22] + "doc/networks"
336                elif d[-9:] == "OWGUI.pyc":
337                    startfile = d[:-23] + "doc/networks"
338
339            if not startfile or not os.path.exists(startfile):
340                d = os.getcwd()
341                if d[-12:] == "OrangeCanvas":
342                    startfile = d[:-12]+"doc/networks"
343                else:
344                    if d[-1] not in ["/", "\\"]:
345                        d+= "/"
346                    startfile = d+"doc/networks"
347
348            if not os.path.exists(startfile):
349                QMessageBox.information( None, "File", "Cannot find the directory with example networks", QMessageBox.Ok + QMessageBox.Default)
350                return
351        else:
352            if len(self.recentFiles) == 0 or self.recentFiles[0] == "(none)":
353                if sys.platform == "darwin":
354                    startfile = user.home
355                else:
356                    startfile = "."
357            else:
358                startfile = self.recentFiles[0]
359               
360        filename = str(QFileDialog.getOpenFileName(self, 'Open a Network File', startfile, "Pajek files (*.net)\nGML files (*.gml)\nAll files (*.*)"))
361       
362        if filename == "": return
363        if filename in self.recentFiles: self.recentFiles.remove(filename)
364        self.recentFiles.insert(0, filename)
365        self.setFileLists()
366        self.selectNetFile(0)
367       
368    def browseDataFile(self, inDemos=0):
369        if self.graph == None:
370            return
371       
372        #Display a FileDialog and select a file
373        if len(self.recentDataFiles) == 0 or self.recentDataFiles[0] == "(none)":
374            if len(self.recentFiles) == 0 or self.recentFiles[0] == "(none)":
375                if sys.platform == "darwin":
376                    startfile = user.home
377                else:
378                    startfile="."
379            else:
380                startfile = os.path.dirname(self.recentFiles[0])
381               
382        else:
383            startfile = self.recentDataFiles[0]
384               
385        filename = str(QFileDialog.getOpenFileName(self, 'Open a Vertices Data File', startfile, 'Data files (*.tab)\nAll files(*.*)'))
386   
387        if filename == "": return
388        if filename in self.recentDataFiles: self.recentDataFiles.remove(filename)
389        self.recentDataFiles.insert(0, filename)
390        self.setFileLists()
391        self.addDataFile(self.recentDataFiles[0])
392       
393    def browseEdgesFile(self, inDemos=0):
394        if self.graph == None:
395            return
396       
397        #Display a FileDialog and select a file
398        if len(self.recentEdgesFiles) == 0 or self.recentEdgesFiles[0] == "(none)":
399            if len(self.recentFiles) == 0 or self.recentFiles[0] == "(none)":
400                if sys.platform == "darwin":
401                    startfile = user.home
402                else:
403                    startfile="."
404            else:
405                startfile = os.path.dirname(self.recentFiles[0])
406               
407        else:
408            startfile = self.recentEdgesFiles[0]
409               
410        filename = str(QFileDialog.getOpenFileName(self, 'Open a Edges Data File', startfile, 'Data files (*.tab)\nAll files(*.*)'))
411   
412        if filename == "": return
413        if filename in self.recentEdgesFiles: self.recentEdgesFiles.remove(filename)
414        self.recentEdgesFiles.insert(0, filename)
415        self.setFileLists()
416        self.addEdgesFile(self.recentEdgesFiles[0])
417
418    def setInfo(self, info):
419        for (i, s) in enumerate(info):
420            self.info[i].setText(s)           
421
422    def readNetFile(self, fn):
423        try:
424            net = orngNetwork.Network.read(fn)
425            self.infoc.setText("Vertices data generated and added automatically")
426        except:
427            self.infoa.setText("Could not read file")
428            self.infob.setText("")
429            self.infoc.setText("")
430            self.infod.setText("")
431            return None
432       
433        return net
434
435    def sendReport(self):
436        self.reportSettings("Network file",
437                            [("File name", self.filecombo.currentText()),
438                             ("Vertices", self.graph.nVertices),
439                             hasattr(self.graph, "directed") and ("Directed", OWGUI.YesNo[self.graph.directed])])
440        self.reportSettings("Vertices meta data", [("File name", self.datacombo.currentText())])
441        self.reportData(self.graph.items, None)
442        self.reportSettings("Edges meta data", [("File name", self.edgescombo.currentText())])
443        self.reportData(self.graph.links, None, None)
444       
445if __name__ == "__main__":
446    a=QApplication(sys.argv)
447    owf=OWNetworkFile()
448    owf.activateLoadedSettings()
449    owf.show() 
450    a.exec_()
451    owf.saveSettings()
Note: See TracBrowser for help on using the repository browser.