1 # -*- coding: utf-8 -*-
3 #----------------------------------------------------------------------------
5 # Author: Pierre Ratinaud
8 #comes from ListCtrl.py from the demo tool of wxPython:
9 # Author: Robin Dunn & Gary Dumer
12 # Copyright: (c) 1998 by Total Control Software
13 # Licence: wxWindows license
14 #----------------------------------------------------------------------------
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
30 from functions import exec_rcode, MessageImage, 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
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)
42 self.Alceste = Alceste
47 line1 = profclasse.pop(0)
48 classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
50 self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', ''])
51 profclasse.pop(self.lenact)
54 self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
55 profclasse.pop(self.lenact)
57 self.lenact = len(profclasse)
59 self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
60 self.lensup = self.lensup - self.lenact
61 profclasse.pop(self.lensup)
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) :
68 dictdata = dict(zip([i for i in range(0,len(classen))], classen))
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)]
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"}
84 s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
86 self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
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))
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)
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)
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))
129 listmix.ListCtrlAutoWidthMixin.__init__(self)
130 listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
132 #sort by genre (column 2), A->Z ascending order (1)
133 self.SortListItems(0, 1)
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)
142 self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
145 self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
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)
159 def OnColClick(self,event):
162 def OnItemSelected(self, event):
163 self.currentItem = event.m_itemIndex
165 def OnItemActivated(self, event):
166 self.currentItem = event.m_itemIndex
168 def getColumnText(self, index, col):
169 item = self.GetItem(index, col)
170 return item.GetText()
172 def OnItemDeselected(self, evt):
174 #---------------------------------------------------
175 # These methods are callbacks for implementing the
176 # "virtualness" of the list...
178 def OnGetItemText(self, item, col):
179 index=self.itemIndexMap[item]
180 s = self.itemDataMap[index][col]
183 def OnGetItemImage(self, item):
184 index=self.itemIndexMap[item]
185 genre=self.itemDataMap[index][2]
191 elif genre=="New Age":
196 def OnGetItemAttr(self, item):
197 index=self.itemIndexMap[item]
198 if index < self.lenact :
203 elif index >= self.lenact and index < (self.lenact + self.lensup) :
208 elif index >= (self.lenact + self.lensup) :
216 #---------------------------------------------------
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.
222 def SortItems(self,sorter=cmp):
223 items = list(self.itemDataMap.keys())
225 self.itemIndexMap = items
230 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
231 def GetListCtrl(self):
234 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
235 def GetSortImages(self):
236 return (self.sm_dn, self.sm_up)
238 def onsearch(self, evt) :
239 self.dial = SearchDial(self, self, 6, True)
240 self.dial.CenterOnParent()
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()
252 def OnRightClick(self, event):
254 # only do this part the first time so the events are only bound once
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()
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)
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...")
315 #menu.Append(self.popupID10, u"Spécificités")
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")
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)
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")
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)
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 :
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)
385 #if 'corpus' in dir(self.Source):
386 # corpus = self.Source.corpus
387 #ClasseCHD(self.parent, corpus, self.cl)
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 :
396 fileout = self.Source.pathout['export_tropes_classe_%i.txt' % self.cl]
397 corpus.export_tropes(fileout, self.cl, uci = uci)
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 :
406 repout = self.Source.pathout['export_owledge_classe_%i' % self.cl]
407 if not os.path.exists(repout) :
409 corpus.export_owledge(repout, self.cl, uci = uci)
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))
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()
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]
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]]]
444 if word in fchistable :
445 tableout.append(vchistable[fchistable.index(word)])
447 tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
448 txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
449 tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
450 file = open(tmpscript,'w')
453 exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
454 win = MessageImage(self,u"Graphique", size=(700, 500))
455 win.addsaveimage(tmpgraph)
456 txt = "<img src='%s'>" % tmpgraph
457 win.HtmlPage.SetPage(txt)
460 dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
461 dial.CenterOnParent()
465 def quest_simi(self, evt) :
466 tableau = self.Source.tableau
467 tab = tableau.make_table_from_classe(self.cl, self.la)
468 pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl)
469 if self.tmpchi is None :
470 self.tmpchi = os.path.join(pathout,'chi.csv')
471 with open(self.tmpchi, 'w') as f:
472 f.write('\n'.join([str(val) for val in self.lchi]))
473 self.filename = os.path.join(pathout,'mat01.csv')
474 tableau.printtable(self.filename, tab)
476 paramsimi = {'coeff' : 0,
499 'cola' : (200,200,200),
509 'tmpchi': self.tmpchi
513 tableau.lchi = self.lchi
514 tableau.parametre['fromprof'] = True
515 for i, val in enumerate(self.la) :
516 act[val] = [self.lfreq[i]]
517 tableau.chi[val] = [self.lchi[i]]
518 self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau)
520 def onwordgraph(self, evt):
521 word = self.getColumnText(self.GetFirstSelected(), 6)
522 if self.tmpchi is None :
523 self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
524 with open(self.tmpchi, 'w') as f:
525 f.write('\n'.join([str(val) for val in self.lchi]))
526 index = self.la.index(word)
527 parametres = {'type' : 'clustersimitxt',
528 'pathout' : self.Source.parametres['pathout'],
530 'lem' : self.Source.parametres['lem'],
531 'tmpchi' : self.tmpchi}
533 self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
537 def on_graph(self, evt):
538 if self.tmpchi is None :
539 self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
540 with open(self.tmpchi, 'w') as f:
541 f.write('\n'.join([str(val) for val in self.lchi]))
542 parametres = {'type' : 'clustersimitxt',
543 'pathout' : self.Source.parametres['pathout'],
544 'lem' : self.Source.parametres['lem'],
545 'tmpchi' : self.tmpchi}
547 self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
549 def on_segments(self,evt) :
550 dlg = progressbar(self, 2)
551 corpus = self.Source.corpus
552 uces = corpus.lc[self.cl-1]
553 if self.Source.parametres['classif_mode'] != 2 :
558 dlg.Update(1, u'Segments...')
559 for i in range(2,10) :
560 li = corpus.find_segments_in_classe(uces, i, 1000, uci = uci)
565 l.sort(reverse = True)
567 dlg.Update(2, 'Tri...')
568 for i, line in enumerate(l) :
569 d[i] = [line[1],line[0], line[2]]
571 para={'dico': d,'fline':first}
573 win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
576 def on_uce_carac(self,evt) :
577 dial = PrefUCECarac(self, self.parent)
578 dial.CenterOnParent()
579 if dial.ShowModal() == wx.ID_OK :
580 limite = dial.spin_eff.GetValue()
581 atype = dial.radio_type.GetSelection()
582 dlg = progressbar(self,maxi = 4)
583 corpus = self.Source.corpus
584 uces = corpus.lc[self.cl-1]
585 if self.Source.parametres['classif_mode'] != 2 :
589 tab = corpus.make_table_with_classe(uces, self.la, uci = uci)
591 dlg.Update(2, u'score...')
593 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
595 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]
596 ntab2 = [[ntab[i], uces[i]] for i, val in enumerate(ntab)]
598 ntab2.sort(reverse = True)
599 ntab2 = ntab2[:limite]
600 nuces = [val[1] for val in ntab2]
601 dlg.Update(3, u'concordancier...')
602 ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
603 dlg.Update(4, u'texte...')
604 win = message(self, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
605 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>'
606 win.HtmlPage.SetPage(win.html)
610 def on_tablex(self, evt):
611 if 'corpus' in dir(self.Source):
612 corpus = self.Source.corpus
614 corpus = self.Source.tableau
615 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
616 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
620 vchistable = [line[1:] for line in chistable]
621 fchistable = [line[0] for line in chistable]
622 words = self.getselectedwords()
623 tableout = [vchistable[fchistable.index(word)] for word in words]
624 tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
627 txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
628 #print 'ATTENTION TEST R'
630 #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt')
634 tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
635 file = open(tmpscript,'w')
638 exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
639 w = 100 + (20 * nbwords) + (100 * nbcl)
640 h = 100 + (nbwords * 15)
641 if w > 1100 : w = 1100
644 win = MessageImage(self, u"Graphique", size=(w, h))
645 win.addsaveimage(tmpgraph)
646 txt = "<img src='%s'>" % tmpgraph
647 win.HtmlPage.SetPage(txt)
650 def onlexdendro(self, evt):
651 if 'corpus' in dir(self.Source):
652 corpus = self.Source.corpus
654 corpus = self.Source.tableau
655 with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
656 chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
660 vchistable = [line[1:] for line in chistable]
661 fchistable = [line[0] for line in chistable]
662 words = self.getselectedwords()
663 tableout = [vchistable[fchistable.index(word)] for word in words]
664 tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
665 txttable = 'c(' + ','.join([','.join(line) for line in tableout]) + ')'
666 rownames = 'c("' + '","'.join(words) + '")'
667 colnames = 'c("' + '","'.join(title) + '")'
672 di <- matrix(data=%s, nrow=%i, byrow = TRUE)
677 height <- (30*ncol(di)) + (15*nrow(di))
678 height <- ifelse(height <= 400, 400, height)
680 open_file_graph("%s", width=width, height=height)
681 plot.dendro.lex(tree.cut1$tree.cl, di)
682 """ % (self.Source.pathout['Rdendro'], txttable, rownb, rownames, colnames, self.Source.parent.RscriptsPath['Rgraph'], ffr(tmpgraph))
683 tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
684 file = open(tmpscript,'w')
687 exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
688 win = MessageImage(self, u"Graphique", size=(700, 500))
689 win.addsaveimage(tmpgraph)
690 txt = "<img src='%s'>" % tmpgraph
691 win.HtmlPage.SetPage(txt)
694 def make_concord(self, uces, title, color = 'red') :
695 corpus = self.Source.corpus
696 ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
697 last = self.GetFirstSelected()
698 while self.GetNextSelected(last) != -1:
699 last = self.GetNextSelected(last)
700 ListWord.append(self.getColumnText(last, 6))
702 if self.Source.parametres['classif_mode'] != 2 :
703 for word in ListWord :
705 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
707 for word in ListWord :
708 ucef += list(set(corpus.getlemucis(word)).intersection(uces))
710 ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
711 win = message(self, title, size=(750, 600))
712 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>'
713 win.HtmlPage.SetPage(win.html)
716 def OnPopupTwo(self, event):
717 corpus = self.Source.corpus
718 uces = corpus.lc[self.cl-1]
719 win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
722 def OnPopupThree(self, event):
723 corpus = self.Source.corpus
724 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
725 win = self.make_concord(uces, "Concordancier - UCE classées")
728 def OnPopupFour(self, event):
729 corpus = self.Source.corpus
730 uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
731 win = self.make_concord(uces, "Concordancier - Toutes les UCE")
734 def OnPopupFive(self, event):
735 word = self.getColumnText(self.GetFirstSelected(), 6)
736 lk = "http://www.cnrtl.fr/definition/" + word
739 def OnPopupSix(self, event):
740 word = self.getColumnText(self.GetFirstSelected(), 6)
741 lk = "http://www.cnrtl.fr/etymologie/" + word
744 def OnPopupSeven(self, event):
745 word = self.getColumnText(self.GetFirstSelected(), 6)
746 lk = "http://www.cnrtl.fr/synonymie/" + word
749 def OnPopupHeight(self, event):
750 word = self.getColumnText(self.GetFirstSelected(), 6)
751 lk = "http://www.cnrtl.fr/antonymie/" + word
754 def OnPopupNine(self, event):
755 word = self.getColumnText(self.GetFirstSelected(), 6)
756 lk = "http://www.cnrtl.fr/morphologie/" + word
759 def onproxe(self, evt) :
760 word = self.getColumnText(self.GetFirstSelected(), 6)
761 lk = "http://www.cnrtl.fr/proxemie/" + word
764 def OnPopupOne(self, event):
765 corpus = self.Source.corpus
766 #print 'ATTENTION PRINT ET TABLE'
767 #corpus.make_et_table()
768 word = self.getColumnText(self.GetFirstSelected(), 6)
769 lems = corpus.getlems()
770 uces = corpus.lc[self.cl-1]
772 #FIXME : donner aussi eff reel a la place de nb uce
773 for forme in lems[word].formes :
774 if self.Source.parametres['classif_mode'] != 2 :
775 ucef = list(set(corpus.getworduces(forme)).intersection(uces))
777 ucef = list(set(corpus.getworducis(forme)).intersection(uces))
778 #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
781 rep.append([corpus.getforme(forme).forme, nb])
782 rep.sort(key = itemgetter(1), reverse = True)
783 win = message(self, u"Formes associées", wx.Size(300, 200))
784 win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
785 win.HtmlPage.SetPage(win.html)
789 class wliste(wx.Frame):
790 def __init__(self, parent, id, title, d, fline, size=(600, 500)):
791 wx.Frame.__init__(self, parent, id)
792 self.liste = ListForSpec(self, parent, d, fline, menu = False)
793 self.button_1 = wx.Button(self, -1, "Fermer")
794 self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
795 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
798 def __do_layout(self):
799 sizer_1 = wx.BoxSizer(wx.VERTICAL)
800 sizer_2 = wx.BoxSizer(wx.VERTICAL)
801 sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
802 sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
803 sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
804 self.SetAutoLayout(True)
805 self.SetSizer(sizer_1)
808 def OnCloseMe(self, event):
811 def OnCloseWindow(self, event):