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