09ba0b4bb02cced3d84cc3b772f8f9cdcaa5c052
[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             orderuce = [[uce, i] for i, uce in enumerate(nuces)]
603             dlg.Update(3, u'concordancier...')
604             ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
605             items = dict([[uce[1], '<br>'.join([ucis_txt[uce[1]], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[uce[1]][0], ucestxt[uce[1]]])] for uce in orderuce])
606             dlg.Update(4, u'texte...')
607             win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
608             #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>'
609             #win.HtmlPage.SetPage(win.html)
610             dlg.Destroy()
611             win.Show(True)
612     
613     def on_tablex(self, evt):
614         if 'corpus' in dir(self.Source):
615             corpus = self.Source.corpus
616         else :
617             corpus = self.Source.tableau
618         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
619             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
620         title = chistable[0]
621         title.pop(0)
622         chistable.pop(0)
623         vchistable = [line[1:] for line in chistable]
624         fchistable = [line[0] for line in chistable]
625         words = self.getselectedwords()
626         tableout = [vchistable[fchistable.index(word)] for word in words]
627         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
628         nbcl = len(title)
629         nbwords = len(words)
630         BarFrame(self.Source.parent, tableout, title, words)
631 #         txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
632 #         #print 'ATTENTION TEST R'
633 #         #txt = """
634 #         #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt')
635 #         #Sys.getlocale()
636 #         #sink()
637 #         #"""
638 #         tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
639 #         file = open(tmpscript,'w')
640 #         file.write(txt)
641 #         file.close()
642 #         exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
643 #         w = 100 + (20 * nbwords) + (100 * nbcl)
644 #         h = 100 + (nbwords * 15)
645 #         if w > 1100 : w = 1100
646 #         if h > 800 : h = 800
647 #         if h < 450 : h = 450
648 #         win = MessageImage(self, u"Graphique", size=(w, h))
649 #         win.addsaveimage(tmpgraph)
650 #         txt = "<img src='%s'>" % tmpgraph
651 #         win.HtmlPage.SetPage(txt)
652 #         win.Show(True)
653
654     def onlexdendro(self, evt):
655         if 'corpus' in dir(self.Source):
656             corpus = self.Source.corpus
657         else :
658             corpus = self.Source.tableau
659         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
660             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
661         title = chistable[0]
662         title.pop(0)
663         chistable.pop(0)
664         vchistable = [line[1:] for line in chistable]
665         fchistable = [line[0] for line in chistable]
666         words = self.getselectedwords()
667         tableout = [vchistable[fchistable.index(word)] for word in words]
668         BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
669
670     def make_concord(self, uces, title, color = 'red') :
671         corpus = self.Source.corpus
672         ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
673         last = self.GetFirstSelected()
674         while self.GetNextSelected(last) != -1:
675             last = self.GetNextSelected(last)
676             ListWord.append(self.getColumnText(last, 6))
677         ucef = []
678         if self.Source.parametres['classif_mode'] != 2 :
679             for word in ListWord : 
680                 uci = False
681                 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
682         else :
683             for word in ListWord : 
684                 ucef += list(set(corpus.getlemucis(word)).intersection(uces))            
685                 uci = True
686         ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
687         items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
688         win = message(self, items, title, (800, 500))
689         #win = message(self, title, size=(750, 600))
690         #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>'
691         #win.HtmlPage.SetPage(win.html)
692         return win
693
694     def OnPopupTwo(self, event):
695         if 'corpus' in dir(self.Source) :
696             corpus = self.Source.corpus
697             uces = corpus.lc[self.cl-1]
698             win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
699             win.Show(True)
700     
701     def OnPopupThree(self, event):
702         corpus = self.Source.corpus
703         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
704         win = self.make_concord(uces, "Concordancier - UCE classées")
705         win.Show(True)
706         
707     def OnPopupFour(self, event):
708         corpus = self.Source.corpus
709         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
710         win = self.make_concord(uces, "Concordancier - Toutes les UCE")
711         win.Show(True)
712
713     def OnPopupFive(self, event):
714         word = self.getColumnText(self.GetFirstSelected(), 6)
715         lk = "http://www.cnrtl.fr/definition/" + word
716         webbrowser.open(lk)
717
718     def OnPopupSix(self, event):  
719         word = self.getColumnText(self.GetFirstSelected(), 6)
720         lk = "http://www.cnrtl.fr/etymologie/" + word
721         webbrowser.open(lk)
722         
723     def OnPopupSeven(self, event):        
724         word = self.getColumnText(self.GetFirstSelected(), 6)
725         lk = "http://www.cnrtl.fr/synonymie/" + word
726         webbrowser.open(lk)
727         
728     def OnPopupHeight(self, event):  
729         word = self.getColumnText(self.GetFirstSelected(), 6)
730         lk = "http://www.cnrtl.fr/antonymie/" + word
731         webbrowser.open(lk)
732         
733     def OnPopupNine(self, event):            
734         word = self.getColumnText(self.GetFirstSelected(), 6)
735         lk = "http://www.cnrtl.fr/morphologie/" + word
736         webbrowser.open(lk)
737
738     def onproxe(self, evt) :
739         word = self.getColumnText(self.GetFirstSelected(), 6)
740         lk = "http://www.cnrtl.fr/proxemie/" + word
741         webbrowser.open(lk)
742
743     def OnPopupOne(self, event):
744         corpus = self.Source.corpus
745         #print 'ATTENTION PRINT ET TABLE'
746         #corpus.make_et_table()
747         word = self.getColumnText(self.GetFirstSelected(), 6)
748         lems = corpus.getlems()
749         uces = corpus.lc[self.cl-1]
750         rep = []
751         #FIXME : donner aussi eff reel a la place de nb uce
752         for forme in lems[word].formes :
753             if self.Source.parametres['classif_mode'] != 2 :
754                 ucef = list(set(corpus.getworduces(forme)).intersection(uces))
755             else :
756                 ucef = list(set(corpus.getworducis(forme)).intersection(uces))
757             #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
758             if ucef != [] :
759                 nb = len(ucef)
760                 rep.append([corpus.getforme(forme).forme, nb])
761         rep.sort(key = itemgetter(1), reverse = True)
762         #win = message(self, u"Formes associées", wx.Size(300, 200))
763         items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)])
764         win = message(self, items, u"Formes associées", (300, 200))
765         #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
766         #win.HtmlPage.SetPage(win.html)
767         win.Show(True)
768
769
770 class wliste(wx.Frame):
771     def __init__(self, parent, id, title, d, fline, size=(600, 500)):
772         wx.Frame.__init__(self, parent, id)
773         self.liste = ListForSpec(self, parent, d, fline[1:], menu = False)
774         self.button_1 = wx.Button(self, -1, "Fermer")
775         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
776         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
777         self.__do_layout()
778
779     def __do_layout(self):
780         sizer_1 = wx.BoxSizer(wx.VERTICAL)
781         sizer_2 = wx.BoxSizer(wx.VERTICAL)
782         sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
783         sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
784         sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
785         self.SetAutoLayout(True)
786         self.SetSizer(sizer_1)
787         self.Layout()
788         
789     def OnCloseMe(self, event):
790         self.Close(True)
791
792     def OnCloseWindow(self, event):
793         self.Destroy()