X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=ProfList.py;h=7ac42c54a04fa040b677347ba898bc664f632744;hp=db1dbd1566a0fb4674a85df56f58a376e983c469;hb=e033f9e84abb3c12d92f1580425877aa58e9af30;hpb=8fa853a25a9d62b1446e1bc543e5a3a4d0e03dcf diff --git a/ProfList.py b/ProfList.py index db1dbd1..7ac42c5 100644 --- a/ProfList.py +++ b/ProfList.py @@ -17,44 +17,134 @@ import os import sys import wx import wx.lib.mixins.listctrl as listmix -from tabsimi import DoSimi +#from tabsimi import DoSimi from listlex import ListForSpec from chemins import ConstructPathOut, ffr -from dialog import PrefExport, PrefUCECarac, SearchDial +from dialog import PrefExport, PrefUCECarac, SearchDial, message from tableau import Tableau from search_tools import SearchFrame import webbrowser -import cStringIO +#import cStringIO import tempfile import codecs from functions import exec_rcode, MessageImage, progressbar, treat_var_mod from PrintRScript import barplot from textclassechd import ClasseCHD from shutil import copyfile +from operator import itemgetter #--------------------------------------------------------------------------- +class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin): + def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0): + wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES) -class ProfListctrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin): - def __init__(self, parent, ID, pos=wx.DefaultPosition, - size=wx.DefaultSize, style=0): - wx.ListCtrl.__init__(self, parent, ID, pos, size, style) - listmix.ListCtrlAutoWidthMixin.__init__(self) - - -class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): - def __init__(self, parent, gparent, ProfClasse, Alceste=False, cl=0): self.parent = parent - classe = ProfClasse - self.cl = cl - self.Source = gparent - if 'tableau' in dir(self.Source): - self.tableau = self.Source.tableau self.Alceste = Alceste + self.Source = gparent + self.cl = cl self.var_mod = {} + + line1 = profclasse.pop(0) + classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****'] + try : + self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', '']) + profclasse.pop(self.lenact) + except ValueError: + try : + self.lenact = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', '']) + profclasse.pop(self.lenact) + except ValueError: + self.lenact = len(profclasse) + try : + self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', '']) + self.lensup = self.lensup - self.lenact + profclasse.pop(self.lensup) + except ValueError: + self.lensup = len(profclasse) - self.lenact + self.lenet = len(profclasse) - (self.lenact + self.lensup) +# print self.lenact, self.lensup, self.lenet + for i, line in enumerate(classen) : + line[0] = i + dictdata = dict(zip([i for i in range(0,len(classen))], classen)) + + if self.lenact != 0 : + self.la = [dictdata[i][6] for i in range(0, self.lenact)] + self.lchi = [dictdata[i][4] for i in range(0, self.lenact)] + self.lfreq = [dictdata[i][1] for i in range(0, self.lenact)] + else : + self.la = [] + self.lchi = [] + self.lfreq = [] + self.tmpchi = None + + #adding some art + self.il = wx.ImageList(16, 16) + a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"} + for k,v in a.items(): + s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v) + exec(s) + self.SetImageList(self.il, wx.IMAGE_LIST_SMALL) + + #adding some attributes (colourful background for each item rows) + self.attr1 = wx.ListItemAttr() + self.attr1.SetBackgroundColour((220, 220, 220)) + self.attrsg = wx.ListItemAttr() + self.attrsg.SetBackgroundColour((230, 230, 230)) + self.attr2 = wx.ListItemAttr() + self.attr2.SetBackgroundColour((190, 249, 236)) + self.attr2s = wx.ListItemAttr() + self.attr2s.SetBackgroundColour((211, 252, 244)) + self.attr3 = wx.ListItemAttr() + self.attr3.SetBackgroundColour((245, 180, 180)) + self.attr3s = wx.ListItemAttr() + self.attr3s.SetBackgroundColour((245, 190, 190)) + + + self.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(1, "eff. uce", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT) + self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT) - wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) + self.SetColumnWidth(0, 60) + self.SetColumnWidth(1, 70) + self.SetColumnWidth(2, 80) + self.SetColumnWidth(3, 100) + self.SetColumnWidth(4, 70) + self.SetColumnWidth(5, 60) + self.SetColumnWidth(6, 140) + self.SetColumnWidth(7, wx.LIST_AUTOSIZE) + + #These two should probably be passed to init more cleanly + #setting the numbers of items = number of elements in the dictionary + self.itemDataMap = dictdata + self.itemIndexMap = dictdata.keys() + self.SetItemCount(len(dictdata)) + #mixins + listmix.ListCtrlAutoWidthMixin.__init__(self) + listmix.ColumnSorterMixin.__init__(self, len(classen[0])) + + #sort by genre (column 2), A->Z ascending order (1) + self.SortListItems(0, 1) + + #events + #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected) + #self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated) + #self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected) + self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick) + + # for wxMSW + self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick) + + # for wxGTK + self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick) + + #for searching search_id = wx.NewId() searchall_id = wx.NewId() self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id) @@ -62,159 +152,101 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id), (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)]) self.SetAcceleratorTable(self.accel_tbl) - - self.il = wx.ImageList(16, 16) -# self.idx1 = self.il.Add(images.getSmilesBitmap()) - self.sm_up = self.il.Add(getSmallUpArrowBitmap()) - self.sm_dn = self.il.Add(getSmallDnArrowBitmap()) - tID = wx.NewId() - - self.list = ProfListctrl(self, tID, - style=wx.LC_REPORT - | wx.BORDER_NONE - | wx.LC_EDIT_LABELS - | wx.LC_SORT_ASCENDING - ) - line1 = classe[0] - limit = 0 - limitsup = 0 - i = 0 - dictdata = {} - limit = [i for i,b in enumerate(classe[1:]) if b[0] == '*'] - if limit != [] : - limit = limit[0] - 1 - limitsup = [i for i,b in enumerate(classe[1:]) if b[0] == '*****'] - if limitsup == [] : - limitsup = 0 - else : - limitsup = limitsup[0] - classen = [line for line in classe[1:] if line[0] != '*' and line[0] != '*****'] - if limit == [] : - limit = len(classen) - 1 - dictdata = dict(zip([i for i in range(0,len(classen))], classen)) - #if not self.Alceste : - # limit = limit + 1 - self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL) - - self.PopulateList(dictdata, limit, limitsup, Alceste) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick) - self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) - # for wxMSW - self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick) - # for wxGTK - self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick) - self.itemDataMap = dictdata - listmix.ColumnSorterMixin.__init__(self, 8) - self.do_greyline() -#----------------------------------------------------------------------------------------- + def OnColClick(self,event): + event.Skip() - def PopulateList(self, dictdata, limit, limitsup, Alceste): - - - # for normal, simple columns, you can add them like this: - self.list.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(1, "eff. uce", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT) - self.list.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT) - - for key in dictdata : #.iteritems(): - index = self.list.InsertStringItem(sys.maxint, '%4i' % key) - i = 1 - for val in dictdata[key][1:]: - self.list.SetStringItem(index, i, str(dictdata[key][i])) - i += 1 - self.list.SetItemData(index, key) - - self.list.SetColumnWidth(0, 60) - self.list.SetColumnWidth(1, 70) - self.list.SetColumnWidth(2, 80) - self.list.SetColumnWidth(3, 100) - self.list.SetColumnWidth(4, 70) - self.list.SetColumnWidth(5, wx.LIST_AUTOSIZE) - self.list.SetColumnWidth(6, wx.LIST_AUTOSIZE) - self.list.SetColumnWidth(7, wx.LIST_AUTOSIZE) - - # show how to change the colour of a couple items - if limitsup != 0 : - for i in range(limitsup, limit): - item = self.list.GetItem(i) - item.SetTextColour(wx.RED) - self.list.SetItem(item) - else : - limit=limit+1 - - for i in range(limit, len(dictdata)): - item = self.list.GetItem(i) - item.SetTextColour(wx.BLUE) - self.list.SetItem(item) - - if limitsup != 0 : - self.la = [self.getColumnText(i,6) for i in range(0, limitsup-1)] - self.lchi = [float(self.getColumnText(i,4)) for i in range(0, limitsup-1)] - self.lfreq = [int(self.getColumnText(i,1)) for i in range(0, limitsup-1)] - else : - self.la = [self.getColumnText(i,6) for i in range(0, limit)] - self.lfreq = [int(self.getColumnText(i,1)) for i in range(0, limit)] - self.lchi = [float(self.getColumnText(i,4)) for i in range(0, limit)] - - def do_greyline(self): - for row in xrange(self.list.GetItemCount()): - if row % 2 : - self.list.SetItemBackgroundColour(row, (230, 230, 230)) - else : - self.list.SetItemBackgroundColour(row, wx.WHITE) + def OnItemSelected(self, event): + self.currentItem = event.m_itemIndex + + def OnItemActivated(self, event): + self.currentItem = event.m_itemIndex + def getColumnText(self, index, col): + item = self.GetItem(index, col) + return item.GetText() + + def OnItemDeselected(self, evt): + pass + #--------------------------------------------------- + # These methods are callbacks for implementing the + # "virtualness" of the list... + + def OnGetItemText(self, item, col): + index=self.itemIndexMap[item] + s = self.itemDataMap[index][col] + return s + + def OnGetItemImage(self, item): + index=self.itemIndexMap[item] + genre=self.itemDataMap[index][2] + + if genre=="Rock": + return self.w_idx + elif genre=="Jazz": + return self.e_idx + elif genre=="New Age": + return self.i_idx + else: + return -1 + + def OnGetItemAttr(self, item): + index=self.itemIndexMap[item] + if index < self.lenact : + if item % 2 : + return self.attr1 + else : + return self.attrsg + elif index >= self.lenact and index < (self.lenact + self.lensup) : + if item % 2 : + return self.attr2 + else : + return self.attr2s + elif index >= (self.lenact + self.lensup) : + if item % 2 : + return self.attr3 + else : + return self.attr3s + else : + return None + + #--------------------------------------------------- + # Matt C, 2006/02/22 + # Here's a better SortItems() method -- + # the ColumnSorterMixin.__ColumnSorter() method already handles the ascending/descending, + # and it knows to sort on another column if the chosen columns have the same value. + + def SortItems(self,sorter=cmp): + items = list(self.itemDataMap.keys()) + items.sort(sorter) + self.itemIndexMap = items + + # redraw the list + self.Refresh() # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py def GetListCtrl(self): - return self.list + return self # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py def GetSortImages(self): return (self.sm_dn, self.sm_up) - - def OnRightDown(self, event): - x = event.GetX() - y = event.GetY() - item, flags = self.list.HitTest((x, y)) - - if flags & wx.LIST_HITTEST_ONITEM: - self.list.Select(item) - - event.Skip() - - - def getColumnText(self, index, col): - item = self.list.GetItem(index, col) - return item.GetText() - - - def OnItemSelected(self, event): - self.currentItem = event.m_itemIndex - event.Skip() - def onsearch(self, evt) : self.dial = SearchDial(self, self, 6, True) self.dial.CenterOnParent() - self.dial.ShowModal() - self.dial.Destroy() + self.dial.Show() + #self.dial.Destroy() def onsearchall(self, evt) : if 'FrameSearch' not in dir(self.Source) : self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus) self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False) self.dial.CenterOnParent() - self.dial.ShowModal() - self.dial.Destroy() + self.dial.Show() + #self.dial.Destroy() def OnRightClick(self, event): @@ -261,8 +293,8 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): self.Bind(wx.EVT_MENU, self.onproxe, id = self.popup_proxe) self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro) self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport) - # self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes) - # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) + # self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes) + # self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3) # make a menu menu = wx.Menu() @@ -292,7 +324,7 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): menu.Append(self.popupIDgraph, u"Graphe de la classe") menu.Append(self.idseg, u"Segments répétés") menu.Append(self.iducecarac, u"UCE caractéristiques") - menu.Append(self.idexport, 'Partitionner...') + menu.Append(self.idexport, 'Exporter...') #menu.Append(self.popupID2, u"Concordancier") # menu.Append(self.popupID3, "recharger") @@ -318,13 +350,27 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): def onexport(self, evt) : if 'corpus' in dir(self.Source): corpus = self.Source.corpus - ClasseCHD(self.parent, corpus, self.cl) + corpus.export_classe(self.Source.pathout['classe_%i_export.txt' % self.cl], self.cl) + dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION) + dial.ShowModal() + dial.Destroy() + #if 'corpus' in dir(self.Source): + # corpus = self.Source.corpus + #ClasseCHD(self.parent, corpus, self.cl) + + def getselectedwords(self) : + words = [self.getColumnText(self.GetFirstSelected(), 6)] + last = self.GetFirstSelected() + while self.GetNextSelected(last) != -1: + last = self.GetNextSelected(last) + words.append(self.getColumnText(last, 6)) + return words def quest_var_mod(self, evt) : if 'corpus' in dir(self.Source): corpus = self.Source.corpus if self.var_mod == {} : - self.var_mod = treat_var_mod([val for val in corpus.make_etoiles()]) + self.var_mod = self.Source.corpus.make_etoiles_dict() else : corpus = self.Source.tableau if self.var_mod == {} : @@ -336,10 +382,11 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): chistable.pop(0) vchistable = [line[1:] for line in chistable] fchistable = [line[0] for line in chistable] - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getselectedwords()[0] if len(word.split('_')) > 1 : - var = word.split('_')[0] - words = [word for word in self.var_mod[var]] + var = word.split('_') + #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]] + words = [word for word in self.var_mod[var[0]]] words.sort() tableout = [] kwords = [] @@ -354,7 +401,7 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): file.write(txt) file.close() exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE) + win = MessageImage(self,u"Graphique", size=(700, 500)) win.addsaveimage(tmpgraph) txt = "" % tmpgraph win.HtmlPage.SetPage(txt) @@ -368,13 +415,13 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): def quest_simi(self, evt) : tableau = self.Source.tableau tab = tableau.make_table_from_classe(self.cl, self.la) - pathout = ConstructPathOut(self.Source.pathout+'/', 'simi_classe_%i' %self.cl) + pathout = ConstructPathOut(self.Source.pathout.dirout, 'simi_classe_%i' %self.cl) self.filename = os.path.join(pathout,'mat01.csv') tableau.printtable(self.filename, tab) del tab paramsimi = {'coeff' : 0, 'layout' : 2, - 'type' : 1, + 'type_graph' : 1, 'arbremax' : 1, 'coeff_tv' : 1, 'coeff_tv_nb' : 0, @@ -402,148 +449,47 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): 'keep_coord' : True, 'alpha' : 20, 'film': False, + 'com' : 0, + 'communities' : 0, + 'halo' : 0 } -# self.tableau.actives = {} -# self.tableau.lchi = self.lchi -# self.tableau.chi = {} -# for i, val in enumerate(self.la) : -# self.tableau.actives[val] = [self.lfreq[i]] -# self.tableau.chi[val] = [self.lchi[i]] - act = {} - self.tableau.chi = {} - self.tableau.lchi = self.lchi - self.tableau.parametre['fromprof'] = True + tableau.chi = {} + tableau.lchi = self.lchi + tableau.parametre['fromprof'] = True for i, val in enumerate(self.la) : act[val] = [self.lfreq[i]] - self.tableau.chi[val] = [self.lchi[i]] - DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act) + tableau.chi[val] = [self.lchi[i]] + self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau) def onwordgraph(self, evt): - word = self.getColumnText(self.list.GetFirstSelected(), 6) - dlg = progressbar(self, 2) - corpus = self.Source.corpus - uces = corpus.lc[self.cl-1] - dlg.Update(1, u'Tableau...') - #tab = corpus.make_table_with_classe(uces, self.la) - pathout = ConstructPathOut(self.Source.pathout.dirout + '/' , 'simi_%s' % word) - self.filename = os.path.join(pathout,'mat01.csv') - dlg.Update(2, u'Ecriture...') - #corpus.write_tab(tab, self.filename) - #del tab - corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename) - dlg.Destroy() - paramsimi = {'coeff' : 0, - 'layout' : 2, - 'type' : 1, - 'arbremax' : 0, - 'coeff_tv' : 1, - 'coeff_tv_nb' : 0, - 'tvprop' : 0, - 'tvmin' : 5, - 'tvmax' : 30, - 'coeff_te' : 1, - 'coeff_temin' : 1, - 'coeff_temax' : 10, - 'label_v': 1, - 'label_e': 0, - 'vcex' : 1, - 'vcexmin' : 10, - 'vcexmax' : 25, - 'cex' : 10, - 'seuil_ok' : 1, - 'seuil' : 1, - 'cols' : (255,0,0), - 'cola' : (200,200,200), - 'width' : 600, - 'height' : 600, - 'first' : True, - 'keep_coord' : True, - 'alpha' : 20, - 'film': False, - } - self.tableau = Tableau(self.parent, '') - self.tableau.listactives = self.la - self.tableau.actives = {} - for i, val in enumerate(self.la) : - self.tableau.actives[val] = [self.lfreq[i]] - DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, wordgraph = word) - - - def OnPopupOne(self, event): - corpus = self.Source.corpus - #print 'ATTENTION PRINT ET TABLE' - #corpus.make_et_table() - word = self.getColumnText(self.list.GetFirstSelected(), 6) - lems = corpus.getlems() - uces = corpus.lc[self.cl-1] - rep = [] - #FIXME : donner aussi eff reel a la place de nb uce - for forme in lems[word].formes : - ucef = list(set(corpus.getworduces(forme)).intersection(uces)) - #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces] - if ucef != [] : - nb = len(ucef) - rep.append([corpus.getforme(forme).forme, nb]) - win = message(self, -1, u"Formes associées", size=(300, 200), style=wx.DEFAULT_FRAME_STYLE) - win.html = '\n' + '
'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' - win.HtmlPage.SetPage(win.html) - win.Show(True) + word = self.getColumnText(self.GetFirstSelected(), 6) + if self.tmpchi is None : + self.tmpchi = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) + with open(self.tmpchi, 'w') as f: + f.write('\n'.join([str(val) for val in self.lchi])) + index = self.la.index(word) + parametres = {'type' : 'clustersimitxt', + 'pathout' : self.Source.parametres['pathout'], + 'word' : index , + 'lem' : self.Source.parametres['lem'], + 'tmpchi' : self.tmpchi} + #try : + self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4)) + #except : + # print 'not acitve' def on_graph(self, evt): - dlg = progressbar(self, 2) - corpus = self.Source.corpus - uces = corpus.lc[self.cl-1] - dlg.Update(1, u'Tableau...') - #tab = corpus.make_table_with_classe(uces, self.la) - pathout = ConstructPathOut(self.Source.pathout.dirout+'/', 'simi_classe_%i' %self.cl) - self.filename = os.path.join(pathout,'mat01.csv') - dlg.Update(2, u'Ecriture...') - #corpus.write_tab(tab, self.filename) - #del tab - corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename) - dlg.Destroy() - paramsimi = {'coeff' : 0, - 'layout' : 2, - 'type' : 1, - 'arbremax' : 1, - 'coeff_tv' : 1, - 'coeff_tv_nb' : 0, - 'tvprop' : 0, - 'tvmin' : 5, - 'tvmax' : 30, - 'coeff_te' : 1, - 'coeff_temin' : 1, - 'coeff_temax' : 10, - 'label_v': 1, - 'label_e': 0, - 'vcex' : 0, - 'vcexmin' : 10, - 'vcexmax' : 25, - 'cex' : 10, - 'cexfromchi' : True, - 'sfromchi': False, - 'seuil_ok' : 0, - 'seuil' : 1, - 'cols' : (255,0,0), - 'cola' : (200,200,200), - 'width' : 1000, - 'height' : 1000, - 'first' : True, - 'keep_coord' : True, - 'alpha' : 20, - 'film': False, - } - self.tableau = Tableau(self.parent, '') - self.tableau.listactives = self.la - self.tableau.actives = {} - self.tableau.lchi = self.lchi - self.tableau.chi = {} - self.tableau.parametre['fromprof'] = True - for i, val in enumerate(self.la) : - self.tableau.actives[val] = [self.lfreq[i]] - self.tableau.chi[val] = [self.lchi[i]] - DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout) + if self.tmpchi is None : + self.tmpchi = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) + with open(self.tmpchi, 'w') as f: + f.write('\n'.join([str(val) for val in self.lchi])) + parametres = {'type' : 'clustersimitxt', + 'pathout' : self.Source.parametres['pathout'], + 'lem' : self.Source.parametres['lem'], + 'tmpchi' : self.tmpchi} + + self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4)) def on_segments(self,evt) : dlg = progressbar(self, 2) @@ -588,12 +534,25 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): del ntab ntab2.sort(reverse = True) ntab2 = ntab2[:limite] + nuces = [val[1] for val in ntab2] dlg.Update(3, u'concordancier...') - ucestxt = [corpus.ucis_paras_uces[val[1][0]][val[1][1]][val[1][2]] for val in ntab2] - ucestxt = [corpus.make_concord(self.la, ' '.join(uce), 'red') for uce in ucestxt] + #ucestxt = [corpus.ucis_paras_uces[val[1][0]][val[1][1]][val[1][2]] for val in ntab2] + ucestxt1 = [row for row in corpus.getconcorde(nuces)] + ucestxt = [] + ucis_txt = [] + for uce in ucestxt1 : + ucetxt = ' '+uce[1]+' ' + ucis_txt.append(' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '
') + for lem in self.la : + listmot = corpus.getlems()[lem].formes + for id in listmot : + forme = corpus.getforme(id).forme + ucetxt = ucetxt.replace(' '+forme+' ', ' ' + forme + ' ') + ucestxt.append(ucetxt) + #ucestxt = [corpus.make_concord(self.la, ' '.join(uce), 'red') for uce in ucestxt] dlg.Update(4, u'texte...') - ucis_txt = [' '.join(corpus.ucis[val[1][0]][0]) for val in ntab2] - win = message(self, -1, u"UCE caractéristiques - Classe %i" % self.cl, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE) + #ucis_txt = [' '.join(corpus.ucis[val[1][0]][0]) for val in ntab2] + win = message(self, u"UCE caractéristiques - Classe %i" % self.cl, (750, 600)) win.html = '\n' + '

'.join(['
'.join([ucis_txt[i], 'score : ' + str(ntab2[i][0]), ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n' win.HtmlPage.SetPage(win.html) dlg.Destroy() @@ -611,24 +570,29 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): chistable.pop(0) vchistable = [line[1:] for line in chistable] fchistable = [line[0] for line in chistable] - words = [self.getColumnText(self.list.GetFirstSelected(), 6)] - tableout = [vchistable[fchistable.index(words[0])]] - last = self.list.GetFirstSelected() - while self.list.GetNextSelected(last) != -1: - last = self.list.GetNextSelected(last) - word = self.getColumnText(last, 6) - words.append(word) - tableout.append(vchistable[fchistable.index(word)]) + words = self.getselectedwords() + tableout = [vchistable[fchistable.index(word)] for word in words] tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) nbcl = len(title) + nbwords = len(words) txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph) + #print 'ATTENTION TEST R' + #txt = """ + #sink('/Users/pierre/Desktop/qdfqsdfqsdfqsdf.txt') + #Sys.getlocale() + #sink() + #""" tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) file = open(tmpscript,'w') file.write(txt) file.close() - exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE) + w = 100 + (20 * nbwords) + (100 * nbcl) + h = 100 + (nbwords * 15) + if w > 1100 : w = 1100 + if h > 800 : h = 800 + if h < 450 : h = 450 + win = MessageImage(self, u"Graphique", size=(w, h)) win.addsaveimage(tmpgraph) txt = "" % tmpgraph win.HtmlPage.SetPage(txt) @@ -646,14 +610,8 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): chistable.pop(0) vchistable = [line[1:] for line in chistable] fchistable = [line[0] for line in chistable] - words = [self.getColumnText(self.list.GetFirstSelected(), 6)] - tableout = [vchistable[fchistable.index(words[0])]] - last = self.list.GetFirstSelected() - while self.list.GetNextSelected(last) != -1: - last = self.list.GetNextSelected(last) - word = self.getColumnText(last, 6) - words.append(word) - tableout.append(vchistable[fchistable.index(word)]) + words = self.getselectedwords() + tableout = [vchistable[fchistable.index(word)] for word in words] tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR) txttable = 'c(' + ','.join([','.join(line) for line in tableout]) + ')' rownames = 'c("' + '","'.join(words) + '")' @@ -678,7 +636,7 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): file.write(txt) file.close() exec_rcode(self.Source.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE) + win = MessageImage(self, u"Graphique", size=(700, 500)) win.addsaveimage(tmpgraph) txt = "" % tmpgraph win.HtmlPage.SetPage(txt) @@ -687,13 +645,13 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): def make_concord(self, uces, title, color = 'red') : corpus = self.Source.corpus - ListWord = [self.getColumnText(self.list.GetFirstSelected(), 6)] - last = self.list.GetFirstSelected() - while self.list.GetNextSelected(last) != -1: - last = self.list.GetNextSelected(last) + ListWord = [self.getColumnText(self.GetFirstSelected(), 6)] + last = self.GetFirstSelected() + while self.GetNextSelected(last) != -1: + last = self.GetNextSelected(last) ListWord.append(self.getColumnText(last, 6)) listmot = [forme for item in ListWord for forme in corpus.getlems()[item].formes] - win = message(self, -1, title, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE) + win = message(self, title, size=(750, 600)) toshow = ['\n

Concordancier

\n'] toshow.append('

' % color + ' '.join(ListWord) + '


') duce = {} @@ -733,47 +691,61 @@ class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin): win.Show(True) def OnPopupFive(self, event): - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/definition/" + word webbrowser.open(lk) def OnPopupSix(self, event): - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/etymologie/" + word webbrowser.open(lk) def OnPopupSeven(self, event): - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/synonymie/" + word webbrowser.open(lk) def OnPopupHeight(self, event): - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/antonymie/" + word webbrowser.open(lk) def OnPopupNine(self, event): - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/morphologie/" + word webbrowser.open(lk) def onproxe(self, evt) : - word = self.getColumnText(self.list.GetFirstSelected(), 6) + word = self.getColumnText(self.GetFirstSelected(), 6) lk = "http://www.cnrtl.fr/proxemie/" + word webbrowser.open(lk) - def OnSize(self, event): - w, h = self.GetClientSizeTuple() - self.list.SetDimensions(0, 0, w, h) - - def OnColClick(self, event): - self.do_greyline() + def OnPopupOne(self, event): + corpus = self.Source.corpus + #print 'ATTENTION PRINT ET TABLE' + #corpus.make_et_table() + word = self.getColumnText(self.GetFirstSelected(), 6) + lems = corpus.getlems() + uces = corpus.lc[self.cl-1] + rep = [] + #FIXME : donner aussi eff reel a la place de nb uce + for forme in lems[word].formes : + ucef = list(set(corpus.getworduces(forme)).intersection(uces)) + #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces] + if ucef != [] : + nb = len(ucef) + rep.append([corpus.getforme(forme).forme, nb]) + rep.sort(key = itemgetter(1), reverse = True) + win = message(self, u"Formes associées", wx.Size(300, 200)) + win.html = '\n' + '
'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' + win.HtmlPage.SetPage(win.html) + win.Show(True) class wliste(wx.Frame): def __init__(self, parent, id, title, d, fline, size=(600, 500)): wx.Frame.__init__(self, parent, id) - self.liste = ListForSpec(self, parent, d, fline) + self.liste = ListForSpec(self, parent, d, fline, menu = False) self.button_1 = wx.Button(self, -1, "Fermer") self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) @@ -794,82 +766,3 @@ class wliste(wx.Frame): def OnCloseWindow(self, event): self.Destroy() - -class message(wx.Frame): - def __init__(self, *args, **kwds): - kwds["style"] = wx.DEFAULT_FRAME_STYLE - wx.Frame.__init__(self, *args, **kwds) - self.html = "" - self.HtmlPage=wx.html.HtmlWindow(self, -1) - if "gtk2" in wx.PlatformInfo: - self.HtmlPage.SetStandardFonts() - self.HtmlPage.SetFonts('Courier','Courier') - self.button_1 = wx.Button(self, -1, "Fermer") - self.button_2 = wx.Button(self, -1, u"Enregistrer...") - - self.Bind(wx.EVT_BUTTON, self.OnSavePage, self.button_2) - self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) - self.__do_layout() - - def __do_layout(self): - sizer_1 = wx.BoxSizer(wx.VERTICAL) - sizer_2 = wx.BoxSizer(wx.VERTICAL) - sizer_2.Add(self.HtmlPage, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) - sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0) - sizer_2.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0) - sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) - self.SetAutoLayout(True) - self.SetSizer(sizer_1) - self.Layout() - - def OnSavePage(self, evt) : - dlg = wx.FileDialog( - self, message="Enregistrer sous...", defaultDir=os.getcwd(), - defaultFile="concordancier.html", wildcard="html|*.html", style=wx.SAVE | wx.OVERWRITE_PROMPT - ) - dlg.SetFilterIndex(2) - dlg.CenterOnParent() - if dlg.ShowModal() == wx.ID_OK: - path = dlg.GetPath() - with open(path, 'w') as f : - f.write(self.html) - - def OnCloseMe(self, event): - self.Close(True) - - def OnCloseWindow(self, event): - self.Destroy() - -def getSmallUpArrowData(): - return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ -\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ -\x00\x00C\xb0\x89\ -\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\ -?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82" - -def getSmallDnArrowBitmap(): - return wx.BitmapFromImage(getSmallDnArrowImage()) - -def getSmallDnArrowImage(): - stream = cStringIO.StringIO(getSmallDnArrowData()) - return wx.ImageFromStream(stream)