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
31 from PrintRScript import barplot
32 from textclassechd import ClasseCHD
33 from shutil import copyfile
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)
41 self.Alceste = Alceste
46 line1 = profclasse.pop(0)
47 classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
49 self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', ''])
50 profclasse.pop(self.lenact)
53 self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
54 profclasse.pop(self.lenact)
56 self.lenact = len(profclasse)
58 self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
59 self.lensup = self.lensup - self.lenact
60 profclasse.pop(self.lensup)
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) :
67 dictdata = dict(zip([i for i in range(0,len(classen))], classen))
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)]
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"}
83 s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
85 self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
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))
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)
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)
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))
128 listmix.ListCtrlAutoWidthMixin.__init__(self)
129 listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
131 #sort by genre (column 2), A->Z ascending order (1)
132 self.SortListItems(0, 1)
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)
141 self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
144 self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
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)
157 def OnColClick(self,event):
160 def OnItemSelected(self, event):
161 self.currentItem = event.m_itemIndex
163 def OnItemActivated(self, event):
164 self.currentItem = event.m_itemIndex
166 def getColumnText(self, index, col):
167 item = self.GetItem(index, col)
168 return item.GetText()
170 def OnItemDeselected(self, evt):
172 #---------------------------------------------------
173 # These methods are callbacks for implementing the
174 # "virtualness" of the list...
176 def OnGetItemText(self, item, col):
177 index=self.itemIndexMap[item]
178 s = self.itemDataMap[index][col]
181 def OnGetItemImage(self, item):
182 index=self.itemIndexMap[item]
183 genre=self.itemDataMap[index][2]
189 elif genre=="New Age":
194 def OnGetItemAttr(self, item):
195 index=self.itemIndexMap[item]
196 if index < self.lenact :
201 elif index >= self.lenact and index < (self.lenact + self.lensup) :
206 elif index >= (self.lenact + self.lensup) :
214 #---------------------------------------------------
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.
220 def SortItems(self,sorter=cmp):
221 items = list(self.itemDataMap.keys())
223 self.itemIndexMap = items
228 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
229 def GetListCtrl(self):
232 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
233 def GetSortImages(self):
234 return (self.sm_dn, self.sm_up)
236 def onsearch(self, evt) :
237 self.dial = SearchDial(self, self, 6, True)
238 self.dial.CenterOnParent()
239 self.dial.ShowModal()
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()
250 def OnRightClick(self, event):
252 # only do this part the first time so the events are only bound once
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()
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)
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...")
307 #menu.Append(self.popupID10, u"Spécificités")
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")
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)
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")
349 def onexport(self, evt) :
350 if 'corpus' in dir(self.Source):
351 corpus = self.Source.corpus
352 ClasseCHD(self.parent, corpus, self.cl)
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))
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()
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]
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]]]
387 if word in fchistable :
388 tableout.append(vchistable[fchistable.index(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')
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)
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()
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)
415 paramsimi = {'coeff' : 0,
438 'cola' : (200,200,200),
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]]
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)
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'],
475 'lem' : self.Source.parametres['lem'],
476 'tmpchi' : self.tmpchi}
478 self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
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}
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)
503 #corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename)
505 #paramsimi = {'coeff' : 0,
516 # 'coeff_temax' : 10,
523 # 'cexfromchi' : True,
527 # 'cols' : (255,0,0),
528 # 'cola' : (200,200,200),
532 # 'keep_coord' : True,
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)
547 def on_segments(self,evt) :
548 dlg = progressbar(self, 2)
549 corpus = self.Source.corpus
550 uces = corpus.lc[self.cl-1]
552 dlg.Update(1, u'Segments...')
553 for i in range(2,10) :
554 li = corpus.find_segments_in_classe(uces, i, 1000)
559 l.sort(reverse = True)
561 dlg.Update(2, 'Tri...')
562 for i, line in enumerate(l) :
563 d[i] = [line[1],line[0], line[2]]
565 para={'dico': d,'fline':first}
567 win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
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)
581 dlg.Update(2, u'score...')
583 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
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)]
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)]
596 for uce in ucestxt1 :
597 ucetxt = ' '+uce[1]+' '
598 ucis_txt.append(' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>')
600 listmot = corpus.getlems()[lem].formes
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)
614 def on_tablex(self, evt):
615 if 'corpus' in dir(self.Source):
616 corpus = self.Source.corpus
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]
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)
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')
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
642 win = MessageImage(self, u"Graphique", size=(w, h))
643 win.addsaveimage(tmpgraph)
644 txt = "<img src='%s'>" % tmpgraph
645 win.HtmlPage.SetPage(txt)
648 def onlexdendro(self, evt):
649 if 'corpus' in dir(self.Source):
650 corpus = self.Source.corpus
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]
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) + '")'
670 di <- matrix(data=%s, nrow=%i, byrow = TRUE)
675 height <- (30*ncol(di)) + (15*nrow(di))
676 height <- ifelse(height <= 400, 400, height)
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')
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)
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>')
706 for word in ListWord :
707 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
708 ucef = list(set(ucef))
710 res = corpus.getconcorde(ucef)
711 txt = '<br>'.join(toshow) +'<br><br>'
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)
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)
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")
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")
740 def OnPopupFive(self, event):
741 word = self.getColumnText(self.GetFirstSelected(), 6)
742 lk = "http://www.cnrtl.fr/definition/" + word
745 def OnPopupSix(self, event):
746 word = self.getColumnText(self.GetFirstSelected(), 6)
747 lk = "http://www.cnrtl.fr/etymologie/" + word
750 def OnPopupSeven(self, event):
751 word = self.getColumnText(self.GetFirstSelected(), 6)
752 lk = "http://www.cnrtl.fr/synonymie/" + word
755 def OnPopupHeight(self, event):
756 word = self.getColumnText(self.GetFirstSelected(), 6)
757 lk = "http://www.cnrtl.fr/antonymie/" + word
760 def OnPopupNine(self, event):
761 word = self.getColumnText(self.GetFirstSelected(), 6)
762 lk = "http://www.cnrtl.fr/morphologie/" + word
765 def onproxe(self, evt) :
766 word = self.getColumnText(self.GetFirstSelected(), 6)
767 lk = "http://www.cnrtl.fr/proxemie/" + word
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]
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]
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)
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)
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)
810 def OnCloseMe(self, event):
813 def OnCloseWindow(self, event):