dlg
[iramuteq] / ProfList.py
1 # -*- coding: utf-8 -*-
2
3 #----------------------------------------------------------------------------
4 # Name:         ListCtrl.py
5 # Author:       Pierre Ratinaud
6
7
8 #comes from ListCtrl.py from the demo tool of wxPython:
9 # Author:       Robin Dunn & Gary Dumer
10 #
11 # Created:
12 # Copyright:    (c) 1998 by Total Control Software
13 # Licence:      wxWindows license
14 #----------------------------------------------------------------------------
15
16 import os
17 import sys
18 import  wx
19 import  wx.lib.mixins.listctrl  as  listmix
20 #from tabsimi import DoSimi
21 from listlex import ListForSpec
22 from chemins import ConstructPathOut, ffr
23 from dialog import PrefExport, PrefUCECarac, SearchDial, message, MessageImage, BarFrame
24 from tableau import Tableau
25 from search_tools import SearchFrame
26 import webbrowser
27 #import cStringIO
28 import tempfile
29 import codecs
30 from functions import exec_rcode, progressbar, treat_var_mod, doconcorde
31 from PrintRScript import barplot
32 from textclassechd import ClasseCHD
33 from shutil import copyfile
34 from operator import itemgetter
35
36 #---------------------------------------------------------------------------
37 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
38     def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0):
39         wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
40
41         self.parent = parent
42         self.Alceste = Alceste
43         self.Source = gparent
44         self.cl = cl
45         self.var_mod = {}
46
47         line1 = profclasse.pop(0)
48         classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
49         try :
50             self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', ''])
51             profclasse.pop(self.lenact)
52         except ValueError:
53             try :
54                 self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
55                 profclasse.pop(self.lenact)
56             except ValueError:
57                 self.lenact = len(profclasse)
58         try :
59             self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
60             self.lensup = self.lensup - self.lenact
61             profclasse.pop(self.lensup)
62         except ValueError: 
63             self.lensup = len(profclasse) - self.lenact
64         self.lenet = len(profclasse) - (self.lenact + self.lensup)
65 #        print self.lenact, self.lensup, self.lenet
66         for i,  line in enumerate(classen) :
67             line[0] = i
68         dictdata = dict(zip([i for i in range(0,len(classen))], classen))
69
70         if self.lenact != 0 :
71             self.la = [dictdata[i][6] for i in range(0, self.lenact)]
72             self.lchi = [dictdata[i][4] for i in range(0, self.lenact)]
73             self.lfreq = [dictdata[i][1] for i in range(0, self.lenact)]
74         else :
75             self.la = []
76             self.lchi = []
77             self.lfreq = []
78         self.tmpchi = None
79             
80         #adding some art
81         self.il = wx.ImageList(16, 16)
82         a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"}
83         for k,v in a.items():
84             s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
85             exec(s)
86         self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
87
88         #adding some attributes (colourful background for each item rows)
89         self.attr1 = wx.ListItemAttr()
90         self.attr1.SetBackgroundColour((220, 220, 220))
91         self.attrsg = wx.ListItemAttr()
92         self.attrsg.SetBackgroundColour((230, 230, 230))
93         self.attr2 = wx.ListItemAttr()
94         self.attr2.SetBackgroundColour((190, 249, 236))
95         self.attr2s = wx.ListItemAttr()
96         self.attr2s.SetBackgroundColour((211, 252, 244))        
97         self.attr3 = wx.ListItemAttr()
98         self.attr3.SetBackgroundColour((245, 180, 180))
99         self.attr3s = wx.ListItemAttr()
100         self.attr3s.SetBackgroundColour((245, 190, 190))
101
102
103         self.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT)
104         self.InsertColumn(1, "eff. s.t.", wx.LIST_FORMAT_RIGHT)
105         self.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT)
106         self.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT)
107         self.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT)
108         self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT)
109         self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT)
110         self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT)
111         
112
113         self.SetColumnWidth(0, 60)
114         self.SetColumnWidth(1, 70)
115         self.SetColumnWidth(2, 80)
116         self.SetColumnWidth(3, 100)
117         self.SetColumnWidth(4, 70)
118         self.SetColumnWidth(5, 60)
119         self.SetColumnWidth(6, 140)
120         self.SetColumnWidth(7, wx.LIST_AUTOSIZE)
121
122         #These two should probably be passed to init more cleanly
123         #setting the numbers of items = number of elements in the dictionary
124         self.itemDataMap = dictdata
125         self.itemIndexMap = dictdata.keys()
126         self.SetItemCount(len(dictdata))
127         
128         #mixins
129         listmix.ListCtrlAutoWidthMixin.__init__(self)
130         listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
131
132         #sort by genre (column 2), A->Z ascending order (1)
133         self.SortListItems(0, 1)
134
135         #events
136         #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
137         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnPopupTwo, self)
138         #self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
139         self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
140
141         # for wxMSW
142         self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
143
144         # for wxGTK
145         self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
146
147         #for searching
148         search_id = wx.NewId()
149         searchall_id = wx.NewId()
150         concord_id = wx.NewId()
151         self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
152         self.parent.Bind(wx.EVT_MENU, self.onsearchall, id = searchall_id)
153         self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id),
154                                               (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)])
155         self.SetAcceleratorTable(self.accel_tbl)
156
157
158
159     def OnColClick(self,event):
160         event.Skip()
161
162     def OnItemSelected(self, event):
163         self.currentItem = event.m_itemIndex
164
165     def OnItemActivated(self, event):
166         self.currentItem = event.m_itemIndex
167
168     def getColumnText(self, index, col):
169         item = self.GetItem(index, col)
170         return item.GetText()
171
172     def OnItemDeselected(self, evt):
173         pass
174     #---------------------------------------------------
175     # These methods are callbacks for implementing the
176     # "virtualness" of the list...
177
178     def OnGetItemText(self, item, col):
179         index=self.itemIndexMap[item]
180         s = self.itemDataMap[index][col]
181         return s
182
183     def OnGetItemImage(self, item):
184         index=self.itemIndexMap[item]
185         genre=self.itemDataMap[index][2]
186
187         if genre=="Rock":
188             return self.w_idx
189         elif genre=="Jazz":
190             return self.e_idx
191         elif genre=="New Age":
192             return self.i_idx
193         else:
194             return -1
195
196     def OnGetItemAttr(self, item):
197         index=self.itemIndexMap[item]
198         if index < self.lenact :
199             if item % 2 :
200                 return self.attr1
201             else :
202                 return self.attrsg
203         elif index >= self.lenact and index < (self.lenact + self.lensup) :
204             if item % 2 :
205                 return self.attr2
206             else :
207                 return self.attr2s
208         elif index >= (self.lenact + self.lensup) :
209             if item % 2 :
210                 return self.attr3
211             else :
212                 return self.attr3s
213         else :
214             return None
215
216     #---------------------------------------------------
217     # Matt C, 2006/02/22
218     # Here's a better SortItems() method --
219     # the ColumnSorterMixin.__ColumnSorter() method already handles the ascending/descending,
220     # and it knows to sort on another column if the chosen columns have the same value.
221
222     def SortItems(self,sorter=cmp):
223         items = list(self.itemDataMap.keys())
224         items.sort(sorter)
225         self.itemIndexMap = items
226         
227         # redraw the list
228         self.Refresh()
229
230     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
231     def GetListCtrl(self):
232         return self
233
234     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
235     def GetSortImages(self):
236         return (self.sm_dn, self.sm_up)
237
238     def onsearch(self, evt) :
239         self.dial = SearchDial(self, self, 6, True)
240         self.dial.CenterOnParent()
241         self.dial.Show()
242         #self.dial.Destroy()
243
244     def onsearchall(self, evt) :
245         if 'FrameSearch' not in dir(self.Source) :
246             self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus)
247         self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False)
248         self.dial.CenterOnParent()
249         self.dial.Show()
250         #self.dial.Destroy()
251
252     def OnRightClick(self, event):
253
254         # only do this part the first time so the events are only bound once
255         if self.Alceste:
256             if not hasattr(self, "popupID1"):
257                 self.popupID1 = wx.NewId()
258                 self.popupID2 = wx.NewId()
259                 self.popupID3 = wx.NewId()
260                 self.popupID4 = wx.NewId()
261                 self.popupID5 = wx.NewId()
262                 self.popupID6 = wx.NewId()
263                 self.popupID7 = wx.NewId()
264                 self.popupID8 = wx.NewId()
265                 self.popupID9 = wx.NewId()
266                 #self.popupID10 = wx.NewId()
267                 self.popupIDgraph = wx.NewId()
268                 self.idseg = wx.NewId()
269                 self.iducecarac = wx.NewId()
270                 self.idtablex = wx.NewId()
271                 self.idchimod = wx.NewId()
272                 self.idwordgraph = wx.NewId()
273                 self.popup_proxe = wx.NewId()
274                 self.idlexdendro = wx.NewId()
275                 self.idcloud = wx.NewId()
276                 self.idexport = wx.NewId()
277                 self.idexporttropes = wx.NewId()
278                 self.idexportowledge = wx.NewId()
279             #    self.export_classes = wx.NewId()
280    
281                 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
282                 self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
283                 self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
284                 self.Bind(wx.EVT_MENU, self.OnPopupFour, id=self.popupID4)
285                 self.Bind(wx.EVT_MENU, self.OnPopupFive, id=self.popupID5)
286                 self.Bind(wx.EVT_MENU, self.OnPopupSix, id=self.popupID6)
287                 self.Bind(wx.EVT_MENU, self.OnPopupSeven, id=self.popupID7)
288                 self.Bind(wx.EVT_MENU, self.OnPopupHeight, id=self.popupID8)
289                 self.Bind(wx.EVT_MENU, self.OnPopupNine, id=self.popupID9)
290                 #self.Bind(wx.EVT_MENU, self.OnPopupSpec, id=self.popupID10)
291                 self.Bind(wx.EVT_MENU, self.on_graph, id=self.popupIDgraph)
292                 self.Bind(wx.EVT_MENU, self.on_segments, id=self.idseg)
293                 self.Bind(wx.EVT_MENU, self.on_uce_carac, id = self.iducecarac)
294                 self.Bind(wx.EVT_MENU, self.on_tablex, id = self.idtablex)
295                 self.Bind(wx.EVT_MENU, self.quest_var_mod, id = self.idchimod)
296                 self.Bind(wx.EVT_MENU, self.onwordgraph, id = self.idwordgraph)
297                 self.Bind(wx.EVT_MENU, self.onproxe, id = self.popup_proxe)
298                 self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro)
299                 self.Bind(wx.EVT_MENU, self.oncloud, id = self.idcloud)
300                 self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
301                 self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes)
302                 self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge)
303              #  self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes)
304    #            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
305     
306             # make a menu
307             menu = wx.Menu()
308             menu.Append(self.popupID1, u"Formes associées")
309             menu.Append(self.idtablex, u"Chi2 par classe")
310             menu.Append(self.idlexdendro, u"Chi2 par classe + dendro")
311             menu.Append(self.idchimod, u"Chi2 modalités de la variable")
312             menu.Append(self.idwordgraph, u"Graphe du mot")
313             #menu.Append(self.export_classes, u"Exporter le corpus...") 
314             
315             #menu.Append(self.popupID10, u"Spécificités")
316
317             menu_conc = wx.Menu()
318             menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe")
319             menu_conc.Append(self.popupID3, u"dans les segments de texte classés")
320             menu_conc.Append(self.popupID4, u"dans tous les segments de texte")
321             menu.AppendMenu(-1, u"Concordancier", menu_conc) 
322             menu_cnrtl = wx.Menu()      
323             menu_cnrtl.Append(self.popupID5, u"Définition")
324             menu_cnrtl.Append(self.popupID6, u"Etymologie")
325             menu_cnrtl.Append(self.popupID7, u"Synonymie")
326             menu_cnrtl.Append(self.popupID8, u"Antonymie")
327             menu_cnrtl.Append(self.popupID9, u"Morphologie")
328             menu_cnrtl.Append(self.popup_proxe, u"Proxémie")
329             menu.AppendMenu(-1, u"Outils du CNRTL", menu_cnrtl)
330             menu.AppendSeparator()
331             menu.Append(self.popupIDgraph, u"Graphe de la classe")
332             menu.Append(self.idseg, u"Segments répétés")
333             menu.Append(self.iducecarac, u"Segments de texte caractéristiques")
334             menu.Append(self.idcloud, u"Nuage de la classe")
335             menu.Append(self.idexport, u'Exporter...')
336             menu.Append(self.idexporttropes, 'Exporter pour Tropes')
337             menu.Append(self.idexportowledge, 'Exporter pour Owledge')
338             #menu.Append(self.popupID2, u"Concordancier")
339     #        menu.Append(self.popupID3, "recharger")
340     
341             self.PopupMenu(menu)
342             menu.Destroy()
343         elif 'tableau' in dir(self.Source) :
344             if not hasattr(self, "pop1"):
345                 self.pop1 = wx.NewId()
346                 self.pop2 = wx.NewId()
347                 self.pop3 = wx.NewId()
348                 self.Bind(wx.EVT_MENU, self.quest_simi, id=self.pop1)
349                 self.Bind(wx.EVT_MENU, self.on_tablex, id=self.pop2)
350                 self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3)
351
352             menu = wx.Menu()
353             menu.Append(self.pop2, u"Chi2 par classe")
354             menu.Append(self.pop3, u"Chi2 modalités de la variable")
355             menu.AppendSeparator()
356             menu.Append(self.pop1, u"Graph de la classe")
357             self.PopupMenu(menu)
358             menu.Destroy()
359
360     def oncloud(self, evt) :
361         if 'corpus' in dir(self.Source):
362             corpus = self.Source.corpus
363         prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)]
364         parametres = self.Source.parametres
365         parametres['clusterprof'] = prof
366         parametres['type'] = 'clustercloud'
367         parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl]
368         del  parametres['uuid']
369         #if not os.path.exists(self.Source.pathout['actprof_classe_%i.csv' % self.lc]) :
370         #    with open(self.Source.pathout['actprof_classe_%i.csv' % self.lc], 'w') as f :
371         #        f.write('\n'.join(prof).encode(self.parent.syscoding))
372         self.parent.OnClusterCloud(self.Source.corpus, parametres = parametres)
373
374     def onexport(self, evt) :
375         if 'corpus' in dir(self.Source):
376             corpus = self.Source.corpus
377         if self.Source.parametres['classif_mode'] != 2 :
378             uci = False
379         else :
380             uci = True
381         corpus.export_classe(self.Source.pathout['classe_%i_export.txt' % self.cl], self.cl, uci = uci)
382         dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION)
383         dial.ShowModal()
384         dial.Destroy()
385         #if 'corpus' in dir(self.Source):
386         #    corpus = self.Source.corpus
387         #ClasseCHD(self.parent, corpus, self.cl)
388     
389     def onexporttropes(self, evt) :
390         if 'corpus' in dir(self.Source):
391             corpus = self.Source.corpus
392         if self.Source.parametres['classif_mode'] != 2 :
393             uci = False
394         else :
395             uci = True
396         fileout = self.Source.pathout['export_tropes_classe_%i.txt' % self.cl]
397         corpus.export_tropes(fileout, self.cl, uci = uci)
398     
399     def onexportowledge(self, evt):
400         if 'corpus' in dir(self.Source):
401             corpus = self.Source.corpus
402         if self.Source.parametres['classif_mode'] != 2 :
403             uci = False
404         else :
405             uci = True
406         repout = self.Source.pathout['export_owledge_classe_%i' % self.cl]
407         if not os.path.exists(repout) :
408             os.mkdir(repout)
409         corpus.export_owledge(repout, self.cl, uci = uci)        
410
411     def getselectedwords(self) :
412         words = [self.getColumnText(self.GetFirstSelected(), 6)]
413         last = self.GetFirstSelected()
414         while self.GetNextSelected(last) != -1:
415             last = self.GetNextSelected(last)
416             words.append(self.getColumnText(last, 6))
417         return words
418
419     def quest_var_mod(self, evt) :
420         if 'corpus' in dir(self.Source):
421             corpus = self.Source.corpus
422             if self.var_mod == {} :
423                 self.var_mod = self.Source.corpus.make_etoiles_dict()
424         else :
425             corpus = self.Source.tableau
426             if self.var_mod == {} :
427                 self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
428         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
429             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
430         title = chistable[0]
431         title.pop(0)
432         chistable.pop(0)
433         vchistable = [line[1:] for line in chistable]
434         fchistable = [line[0] for line in chistable]
435         word = self.getselectedwords()[0]
436         if len(word.split('_')) > 1 :
437             var = word.split('_')
438             #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]]
439             words = [word for word in self.var_mod[var[0]]]
440             words.sort()
441             tableout = []
442             kwords = []
443             for word in words :
444                 if word in fchistable :
445                     tableout.append(vchistable[fchistable.index(word)])
446                     kwords.append(word)
447             BarFrame(self.Source.parent, tableout, title, kwords)
448 #             tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
449 #             txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
450 #             tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
451 #             file = open(tmpscript,'w')
452 #             file.write(txt)
453 #             file.close()
454 #             exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
455 #             win = MessageImage(self,u"Graphique", size=(700, 500))
456 #             win.addsaveimage(tmpgraph)
457 #             txt = "<img src='%s'>" % tmpgraph
458 #             win.HtmlPage.SetPage(txt)
459 #             win.Show(True)
460         else :
461             dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
462             dial.CenterOnParent()
463             dial.ShowModal()
464             dial.Destroy()
465
466     def quest_simi(self, evt) :
467         tableau = self.Source.tableau
468         tab = tableau.make_table_from_classe(self.cl, self.la)
469         pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl)
470         if self.tmpchi is None :
471             self.tmpchi = os.path.join(pathout,'chi.csv')
472             with open(self.tmpchi, 'w') as f:
473                 f.write('\n'.join([str(val) for val in self.lchi]))
474         self.filename = os.path.join(pathout,'mat01.csv')
475         tableau.printtable(self.filename, tab)
476         del tab
477         paramsimi = {'coeff' : 0,
478                           'layout' : 2,
479                           'type_graph' : 1,
480                           'arbremax' : 1,
481                           'coeff_tv' : 1,
482                           'coeff_tv_nb' : 0,
483                           'tvprop' : 0,
484                           'tvmin' : 5,
485                           'tvmax' : 30,
486                           'coeff_te' : 1,
487                           'coeff_temin' : 1,
488                           'coeff_temax' : 10,
489                           'label_v': 1,
490                           'label_e': 1,
491                           'vcex' : 0,
492                           'vcexmin' : 10,
493                           'vcexmax' : 25,
494                           'cex' : 10,
495                           'cexfromchi' : True,
496                           'sfromchi': False,
497                           'seuil_ok' : 0,
498                           'seuil' : 1,
499                           'cols' : (255,0,0),
500                           'cola' : (200,200,200),
501                           'width' : 1000,
502                           'height' : 1000,
503                           'first' : True,
504                           'keep_coord' : True,
505                           'alpha' : 20,
506                           'film': False,
507                           'com' : 0,
508                           'communities' : 0,
509                           'halo' : 0,
510                           'tmpchi': self.tmpchi
511                           }
512         act = {}
513         tableau.chi = {}
514         tableau.lchi = self.lchi
515         tableau.parametres['fromprof'] = True
516         for i, val in enumerate(self.la) :
517             act[val] = [self.lfreq[i]]
518             tableau.chi[val] = [self.lchi[i]]
519         self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau)
520
521     def onwordgraph(self, evt):
522         word = self.getColumnText(self.GetFirstSelected(), 6)
523         if self.tmpchi is None :
524             self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
525             with open(self.tmpchi, 'w') as f:
526                 f.write('\n'.join([str(val) for val in self.lchi]))
527         index = self.la.index(word)
528         parametres = {'type' : 'clustersimitxt', 
529                         'pathout' : self.Source.parametres['pathout'],
530                         'word' : index ,
531                         'lem' : self.Source.parametres['lem'],
532                         'tmpchi' : self.tmpchi}
533         #try :
534         self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
535         #except :
536         #    print 'not acitve'
537
538     def on_graph(self, evt):
539         if self.tmpchi is None :
540             self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
541             with open(self.tmpchi, 'w') as f:
542                 f.write('\n'.join([str(val) for val in self.lchi]))
543         parametres = {'type' : 'clustersimitxt', 
544                         'pathout' : self.Source.parametres['pathout'],
545                         'lem' : self.Source.parametres['lem'],
546                         'tmpchi' : self.tmpchi}
547
548         self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
549
550     def on_segments(self,evt) :
551         dlg = progressbar(self, 2)
552         corpus = self.Source.corpus
553         uces = corpus.lc[self.cl-1]
554         if self.Source.parametres['classif_mode'] != 2 :
555             uci = False
556         else :
557             uci = True
558         l = []
559         dlg.Update(1, u'Segments...')
560         for i in range(2,10) :
561             li = corpus.find_segments_in_classe(uces, i, 1000, uci = uci)
562             if li == [] :
563                 break
564             else :
565                 l += li
566         l.sort(reverse = True)
567         d = {}
568         dlg.Update(2, 'Tri...')
569         for i, line in enumerate(l) :
570             d[i] = [line[1],line[0], line[2]]
571         first = ['','','']
572         para={'dico': d,'fline':first}
573         dlg.Destroy()
574         win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
575         win.Show(True)
576
577     def on_uce_carac(self,evt) :
578         dial = PrefUCECarac(self, self.parent)
579         dial.CenterOnParent()
580         if dial.ShowModal() == wx.ID_OK :
581             limite = dial.spin_eff.GetValue()
582             atype = dial.radio_type.GetSelection()
583             dlg = progressbar(self,maxi = 4)
584             corpus = self.Source.corpus
585             uces = corpus.lc[self.cl-1]
586             if self.Source.parametres['classif_mode'] != 2 :
587                 uci = False
588             else :
589                 uci = True
590             tab = corpus.make_table_with_classe(uces, self.la, uci = uci)
591             tab.pop(0)
592             dlg.Update(2, u'score...')
593             if atype == 0 :
594                 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
595             else :
596                 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1])/float(sum(line)),2) if sum(line)!=0 else 0 for line in tab]
597             ntab2 = [[ntab[i], uces[i]] for i, val in enumerate(ntab)]
598             del ntab
599             ntab2.sort(reverse = True)
600             ntab2 = ntab2[:limite]
601             nuces = [val[1] for val in ntab2]
602             dlg.Update(3, u'concordancier...')
603             ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
604             items = dict([[i, '<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)])
605             dlg.Update(4, u'texte...')
606             win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
607             #win.html = '<html>\n' + '<br>'.join(['<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table>' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
608             #win.HtmlPage.SetPage(win.html)
609             dlg.Destroy()
610             win.Show(True)
611     
612     def on_tablex(self, evt):
613         if 'corpus' in dir(self.Source):
614             corpus = self.Source.corpus
615         else :
616             corpus = self.Source.tableau
617         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
618             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
619         title = chistable[0]
620         title.pop(0)
621         chistable.pop(0)
622         vchistable = [line[1:] for line in chistable]
623         fchistable = [line[0] for line in chistable]
624         words = self.getselectedwords()
625         tableout = [vchistable[fchistable.index(word)] for word in words]
626         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
627         nbcl = len(title)
628         nbwords = len(words)
629         BarFrame(self.Source.parent, tableout, title, words)
630 #         txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
631 #         #print 'ATTENTION TEST R'
632 #         #txt = """
633 #         #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt')
634 #         #Sys.getlocale()
635 #         #sink()
636 #         #"""
637 #         tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
638 #         file = open(tmpscript,'w')
639 #         file.write(txt)
640 #         file.close()
641 #         exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
642 #         w = 100 + (20 * nbwords) + (100 * nbcl)
643 #         h = 100 + (nbwords * 15)
644 #         if w > 1100 : w = 1100
645 #         if h > 800 : h = 800
646 #         if h < 450 : h = 450
647 #         win = MessageImage(self, u"Graphique", size=(w, h))
648 #         win.addsaveimage(tmpgraph)
649 #         txt = "<img src='%s'>" % tmpgraph
650 #         win.HtmlPage.SetPage(txt)
651 #         win.Show(True)
652
653     def onlexdendro(self, evt):
654         if 'corpus' in dir(self.Source):
655             corpus = self.Source.corpus
656         else :
657             corpus = self.Source.tableau
658         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
659             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
660         title = chistable[0]
661         title.pop(0)
662         chistable.pop(0)
663         vchistable = [line[1:] for line in chistable]
664         fchistable = [line[0] for line in chistable]
665         words = self.getselectedwords()
666         tableout = [vchistable[fchistable.index(word)] for word in words]
667         BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
668
669     def make_concord(self, uces, title, color = 'red') :
670         corpus = self.Source.corpus
671         ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
672         last = self.GetFirstSelected()
673         while self.GetNextSelected(last) != -1:
674             last = self.GetNextSelected(last)
675             ListWord.append(self.getColumnText(last, 6))
676         ucef = []
677         if self.Source.parametres['classif_mode'] != 2 :
678             for word in ListWord : 
679                 uci = False
680                 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
681         else :
682             for word in ListWord : 
683                 ucef += list(set(corpus.getlemucis(word)).intersection(uces))            
684                 uci = True
685         ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
686         items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
687         win = message(self, items, title, (800, 500))
688         #win = message(self, title, size=(750, 600))
689         #win.html = ('<html>\n<h1>%s</h1>' % ' '.join(ListWord)) + '<br>'.join(['<br>'.join([ucis_txt[i], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
690         #win.HtmlPage.SetPage(win.html)
691         return win
692
693     def OnPopupTwo(self, event):
694         if 'corpus' in dir(self.Source) :
695             corpus = self.Source.corpus
696             uces = corpus.lc[self.cl-1]
697             win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
698             win.Show(True)
699     
700     def OnPopupThree(self, event):
701         corpus = self.Source.corpus
702         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
703         win = self.make_concord(uces, "Concordancier - UCE classées")
704         win.Show(True)
705         
706     def OnPopupFour(self, event):
707         corpus = self.Source.corpus
708         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
709         win = self.make_concord(uces, "Concordancier - Toutes les UCE")
710         win.Show(True)
711
712     def OnPopupFive(self, event):
713         word = self.getColumnText(self.GetFirstSelected(), 6)
714         lk = "http://www.cnrtl.fr/definition/" + word
715         webbrowser.open(lk)
716
717     def OnPopupSix(self, event):  
718         word = self.getColumnText(self.GetFirstSelected(), 6)
719         lk = "http://www.cnrtl.fr/etymologie/" + word
720         webbrowser.open(lk)
721         
722     def OnPopupSeven(self, event):        
723         word = self.getColumnText(self.GetFirstSelected(), 6)
724         lk = "http://www.cnrtl.fr/synonymie/" + word
725         webbrowser.open(lk)
726         
727     def OnPopupHeight(self, event):  
728         word = self.getColumnText(self.GetFirstSelected(), 6)
729         lk = "http://www.cnrtl.fr/antonymie/" + word
730         webbrowser.open(lk)
731         
732     def OnPopupNine(self, event):            
733         word = self.getColumnText(self.GetFirstSelected(), 6)
734         lk = "http://www.cnrtl.fr/morphologie/" + word
735         webbrowser.open(lk)
736
737     def onproxe(self, evt) :
738         word = self.getColumnText(self.GetFirstSelected(), 6)
739         lk = "http://www.cnrtl.fr/proxemie/" + word
740         webbrowser.open(lk)
741
742     def OnPopupOne(self, event):
743         corpus = self.Source.corpus
744         #print 'ATTENTION PRINT ET TABLE'
745         #corpus.make_et_table()
746         word = self.getColumnText(self.GetFirstSelected(), 6)
747         lems = corpus.getlems()
748         uces = corpus.lc[self.cl-1]
749         rep = []
750         #FIXME : donner aussi eff reel a la place de nb uce
751         for forme in lems[word].formes :
752             if self.Source.parametres['classif_mode'] != 2 :
753                 ucef = list(set(corpus.getworduces(forme)).intersection(uces))
754             else :
755                 ucef = list(set(corpus.getworducis(forme)).intersection(uces))
756             #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
757             if ucef != [] :
758                 nb = len(ucef)
759                 rep.append([corpus.getforme(forme).forme, nb])
760         rep.sort(key = itemgetter(1), reverse = True)
761         #win = message(self, u"Formes associées", wx.Size(300, 200))
762         items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)])
763         win = message(self, items, u"Formes associées", (300, 200))
764         #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
765         #win.HtmlPage.SetPage(win.html)
766         win.Show(True)
767
768
769 class wliste(wx.Frame):
770     def __init__(self, parent, id, title, d, fline, size=(600, 500)):
771         wx.Frame.__init__(self, parent, id)
772         self.liste = ListForSpec(self, parent, d, fline[1:], menu = False)
773         self.button_1 = wx.Button(self, -1, "Fermer")
774         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
775         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
776         self.__do_layout()
777
778     def __do_layout(self):
779         sizer_1 = wx.BoxSizer(wx.VERTICAL)
780         sizer_2 = wx.BoxSizer(wx.VERTICAL)
781         sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
782         sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
783         sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
784         self.SetAutoLayout(True)
785         self.SetSizer(sizer_1)
786         self.Layout()
787         
788     def OnCloseMe(self, event):
789         self.Close(True)
790
791     def OnCloseWindow(self, event):
792         self.Destroy()