source: orange/orange/OrangeWidgets/Unsupervised/OWSaveDistanceFile.py @ 8042:ffcb93bc9028

Revision 8042:ffcb93bc9028, 4.1 KB checked in by markotoplak, 3 years ago (diff)

Hierarchical clustering: also catch RuntimeError when importing matplotlib (or the documentation could not be built on server).

Line 
1"""
2<name>Save Distance File</name>
3<description>Saves a distance matrix to a file</description>
4<contact>Miha Stajdohar</contact>
5<icon>icons/SaveDistanceFile.png</icon>
6<priority>1150</priority>
7"""
8
9import orange
10import OWGUI
11from OWWidget import *
12import os.path
13import pickle
14
15class OWSaveDistanceFile(OWWidget):
16    settingsList = ["recentFiles"]
17
18    def __init__(self, parent=None, signalManager = None, name='Distance File'):
19        self.callbackDeposit = [] # deposit for OWGUI callback functions
20        OWWidget.__init__(self, parent, signalManager, name, wantMainArea = 0, resizingEnabled = 0)
21        self.inputs = [("Distance Matrix", orange.SymMatrix, self.setData)]
22
23        self.recentFiles=[]
24        self.fileIndex = 0
25        self.takeAttributeNames = False
26        self.data = None
27        self.loadSettings()
28
29        box = OWGUI.widgetBox(self.controlArea, "Distance File")
30        hbox = OWGUI.widgetBox(box, orientation = "horizontal")
31        self.filecombo = OWGUI.comboBox(hbox, self, "fileIndex")
32        self.filecombo.setMinimumWidth(250)
33        button = OWGUI.button(hbox, self, '...', callback = self.browseFile)
34        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
35        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
36       
37        fbox = OWGUI.widgetBox(self.controlArea, "Save")
38        self.save = OWGUI.button(fbox, self, "Save current data", callback = self.saveFile, default=True)
39        self.save.setDisabled(1)
40       
41        self.setFilelist()
42        self.filecombo.setCurrentIndex(0)
43       
44        OWGUI.rubber(self.controlArea)
45        self.adjustSize()
46           
47    def setData(self, data):
48        self.data = data
49        self.save.setDisabled(data == None)
50
51    def browseFile(self):
52        if self.data == None:
53            return 
54       
55        if self.recentFiles:
56            lastPath = self.recentFiles[0]
57        else:
58            lastPath = "."
59           
60        fn = str(QFileDialog.getSaveFileName(self, "Save Distance Matrix File", lastPath, "Distance files (*.dst)\nSymMatrix files (*.sym)\nAll files (*.*)"))
61       
62        if not fn or not os.path.split(fn)[1]:
63            return
64       
65        self.addFileToList(fn)
66        self.saveFile()
67       
68    def saveSymMatrix(self, matrix, file):
69        fn = open(file, 'w')
70        fn.write("%d labeled\n" % matrix.dim)
71       
72        for i in range(matrix.dim):
73            fn.write("%s" % matrix.items[i][0])
74            for j in range(i+1):
75                fn.write("\t%.6f" % matrix[i,j])
76            fn.write("\n")
77           
78        fn.close()
79        matrix.items.save(file + ".tab")
80       
81    def saveFile(self):
82        self.error()
83        if self.data is not None:
84            combotext = str(self.filecombo.currentText())
85            if combotext == "(none)":
86                QMessageBox.information( None, "Error saving data", "Unable to save data. Select first a file name by clicking the '...' button.", QMessageBox.Ok + QMessageBox.Default)
87                return
88            filename = self.recentFiles[self.filecombo.currentIndex()]
89            name, ext = os.path.splitext(filename)
90
91            try:
92                if ext == ".dst":
93                    self.saveSymMatrix(self.data, filename)
94                else:
95                    fp = open(filename, 'wb')
96                    pickle.dump(self.data, fp, -1)
97                    fp.close()
98            except Exception, (errValue):
99                self.error(str(errValue))
100                return
101            self.error()   
102
103    def addFileToList(self, fn):
104        if fn in self.recentFiles:
105            self.recentFiles.remove(fn)
106        self.recentFiles.insert(0, fn)
107        self.setFilelist()
108
109    def setFilelist(self):
110        "Set the GUI filelist"
111        self.filecombo.clear()
112
113        if self.recentFiles:
114            self.filecombo.addItems([os.path.split(file)[1] for file in self.recentFiles])
115        else:
116            self.filecombo.addItem("(none)")
117           
118if __name__=="__main__":
119    import orange
120    a = QApplication(sys.argv)
121    ow = OWDistanceFile()
122    ow.show()
123    a.exec_()
124    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.