...
[iramuteq] / ProfList.py
index e882f7e..41dd3df 100644 (file)
@@ -20,18 +20,19 @@ import  wx.lib.mixins.listctrl  as  listmix
 #from tabsimi import DoSimi
 from listlex import ListForSpec
 from chemins import ConstructPathOut, ffr
 #from tabsimi import DoSimi
 from listlex import ListForSpec
 from chemins import ConstructPathOut, ffr
-from dialog import PrefExport, PrefUCECarac, SearchDial, message
-from tableau import Tableau
+from dialog import PrefExport, PrefUCECarac, SearchDial, message, MessageImage, BarFrame
+from tableau import Tableau, copymatrix
 from search_tools import SearchFrame
 import webbrowser
 #import cStringIO
 import tempfile
 import codecs
 from search_tools import SearchFrame
 import webbrowser
 #import cStringIO
 import tempfile
 import codecs
-from functions import exec_rcode, MessageImage, progressbar, treat_var_mod, doconcorde
+from functions import exec_rcode, progressbar, treat_var_mod, doconcorde
 from PrintRScript import barplot
 from textclassechd import ClasseCHD
 from shutil import copyfile
 from operator import itemgetter
 from PrintRScript import barplot
 from textclassechd import ClasseCHD
 from shutil import copyfile
 from operator import itemgetter
+from copy import copy
 
 #---------------------------------------------------------------------------
 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
 
 #---------------------------------------------------------------------------
 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
@@ -43,6 +44,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         self.Source = gparent
         self.cl = cl
         self.var_mod = {}
         self.Source = gparent
         self.cl = cl
         self.var_mod = {}
+        self.them_mod = {}
 
         line1 = profclasse.pop(0)
         classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
 
         line1 = profclasse.pop(0)
         classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
@@ -276,6 +278,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 self.idexport = wx.NewId()
                 self.idexporttropes = wx.NewId()
                 self.idexportowledge = wx.NewId()
                 self.idexport = wx.NewId()
                 self.idexporttropes = wx.NewId()
                 self.idexportowledge = wx.NewId()
+                self.onmaketgen = wx.NewId()
             #    self.export_classes = wx.NewId()
    
                 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
             #    self.export_classes = wx.NewId()
    
                 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
@@ -300,6 +303,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
                 self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes)
                 self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge)
                 self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
                 self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes)
                 self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge)
+                self.Bind(wx.EVT_MENU, self.OnMakeTgen, id=self.onmaketgen)
              #  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)
     
@@ -318,7 +322,8 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe")
             menu_conc.Append(self.popupID3, u"dans les segments de texte classés")
             menu_conc.Append(self.popupID4, u"dans tous les segments de texte")
             menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe")
             menu_conc.Append(self.popupID3, u"dans les segments de texte classés")
             menu_conc.Append(self.popupID4, u"dans tous les segments de texte")
-            menu.AppendMenu(-1, u"Concordancier", menu_conc) 
+            menu.AppendMenu(-1, u"Concordancier", menu_conc)
+            menu.Append(self.onmaketgen, _(u"Make Tgen").decode('utf8'))
             menu_cnrtl = wx.Menu()      
             menu_cnrtl.Append(self.popupID5, u"Définition")
             menu_cnrtl.Append(self.popupID6, u"Etymologie")
             menu_cnrtl = wx.Menu()      
             menu_cnrtl.Append(self.popupID5, u"Définition")
             menu_cnrtl.Append(self.popupID6, u"Etymologie")
@@ -353,7 +358,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             menu.Append(self.pop2, u"Chi2 par classe")
             menu.Append(self.pop3, u"Chi2 modalités de la variable")
             menu.AppendSeparator()
             menu.Append(self.pop2, u"Chi2 par classe")
             menu.Append(self.pop3, u"Chi2 modalités de la variable")
             menu.AppendSeparator()
-            menu.Append(self.pop1, u"Graph de la classe")
+            menu.Append(self.pop1, u"Graphe de la classe")
             self.PopupMenu(menu)
             menu.Destroy()
 
             self.PopupMenu(menu)
             menu.Destroy()
 
@@ -361,7 +366,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
         prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)]
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
         prof = [[self.la[i], self.lchi[i], self.lfreq[i]] for i, val in enumerate(self.la)]
-        parametres = self.Source.parametres
+        parametres = copy(self.Source.parametres)
         parametres['clusterprof'] = prof
         parametres['type'] = 'clustercloud'
         parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl]
         parametres['clusterprof'] = prof
         parametres['type'] = 'clustercloud'
         parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl]
@@ -416,15 +421,30 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             words.append(self.getColumnText(last, 6))
         return words
 
             words.append(self.getColumnText(last, 6))
         return words
 
-    def quest_var_mod(self, evt) :
+    def quest_var_mod(self, evt) :  
+        word = self.getselectedwords()[0]
+        if len(word.split('_')) <= 1 :
+            dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
+            dial.CenterOnParent()
+            dial.ShowModal()
+            dial.Destroy()
+            return
+            
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
-            if self.var_mod == {} :
-                self.var_mod = self.Source.corpus.make_etoiles_dict()
+            if word.startswith(u'-*') :
+                if self.them_mod == {} :
+                    self.them_mod = self.Source.corpus.make_theme_dict()
+                var_mod = self.them_mod
+            else :
+                if self.var_mod == {} :
+                    self.var_mod = self.Source.corpus.make_etoiles_dict()
+                var_mod = self.var_mod
         else :
             corpus = self.Source.tableau
             if self.var_mod == {} :
                 self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
         else :
             corpus = self.Source.tableau
             if self.var_mod == {} :
                 self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
+            var_mod = self.var_mod
         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
         title = chistable[0]
         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
         title = chistable[0]
@@ -432,35 +452,25 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         chistable.pop(0)
         vchistable = [line[1:] for line in chistable]
         fchistable = [line[0] for line in chistable]
         chistable.pop(0)
         vchistable = [line[1:] for line in chistable]
         fchistable = [line[0] for line in chistable]
-        word = self.getselectedwords()[0]
-        if len(word.split('_')) > 1 :
-            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 = []
-            for word in words :
-                if word in fchistable :
-                    tableout.append(vchistable[fchistable.index(word)])
-                    kwords.append(word)
-            tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
-            txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
-            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,u"Graphique", size=(700, 500))
-            win.addsaveimage(tmpgraph)
-            txt = "<img src='%s'>" % tmpgraph
-            win.HtmlPage.SetPage(txt)
-            win.Show(True)
-        else :
-            dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
+
+        var = word.split('_')
+        #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]]
+        try :
+            words = [word for word in var_mod[var[0]]]
+        except KeyError:
+            dial = wx.MessageDialog(self, _(u"This is not a meta-data"), u"Problème", wx.OK | wx.ICON_WARNING)
             dial.CenterOnParent()
             dial.ShowModal()
             dial.Destroy()
             dial.CenterOnParent()
             dial.ShowModal()
             dial.Destroy()
+            return            
+        words.sort()
+        tableout = []
+        kwords = []
+        for word in words :
+            if word in fchistable :
+                tableout.append(vchistable[fchistable.index(word)])
+                kwords.append(word)
+        BarFrame(self.Source.parent, tableout, title, kwords)
 
     def quest_simi(self, evt) :
         tableau = self.Source.tableau
 
     def quest_simi(self, evt) :
         tableau = self.Source.tableau
@@ -506,16 +516,22 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                           'com' : 0,
                           'communities' : 0,
                           'halo' : 0,
                           'com' : 0,
                           'communities' : 0,
                           'halo' : 0,
-                          'tmpchi': self.tmpchi
+                          'tmpchi': self.tmpchi,
+                          'fromprof' : True,
+                          'edgecurved' : True,
                           }
         act = {}
                           }
         act = {}
+        tableau = copymatrix(tableau)
         tableau.chi = {}
         tableau.lchi = self.lchi
         tableau.chi = {}
         tableau.lchi = self.lchi
-        tableau.parametres['fromprof'] = True
+        #tableau.parametres['fromprof'] = True
         for i, val in enumerate(self.la) :
             act[val] = [self.lfreq[i]]
             tableau.chi[val] = [self.lchi[i]]
         for i, val in enumerate(self.la) :
             act[val] = [self.lfreq[i]]
             tableau.chi[val] = [self.lchi[i]]
-        self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act, tableau = tableau)
+        paramsimi['listactives'] = copy(self.la)
+        paramsimi['actives'] = copy(act)
+        paramsimi['pathout'] = pathout
+        self.parent.SimiCluster(parametres = paramsimi, fromprof = ffr(self.filename), tableau = tableau)
 
     def onwordgraph(self, evt):
         word = self.getColumnText(self.GetFirstSelected(), 6)
 
     def onwordgraph(self, evt):
         word = self.getColumnText(self.GetFirstSelected(), 6)
@@ -600,12 +616,11 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             nuces = [val[1] for val in ntab2]
             dlg.Update(3, u'concordancier...')
             ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
             nuces = [val[1] for val in ntab2]
             dlg.Update(3, u'concordancier...')
             ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
-            items = dict([[i, '<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[i][0], ucestxt[i]])] for i in range(0,len(ucestxt))])
-            dlg.Update(4, u'texte...')
-            win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600))
+            items = dict([[i, '<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)])
+            dlg.Destroy()
+            win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600), uceids = nuces)
             #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>'
             #win.HtmlPage.SetPage(win.html)
             #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>'
             #win.HtmlPage.SetPage(win.html)
-            dlg.Destroy()
             win.Show(True)
     
     def on_tablex(self, evt):
             win.Show(True)
     
     def on_tablex(self, evt):
@@ -625,28 +640,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
         nbcl = len(title)
         nbwords = len(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)
-        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 = "<img src='%s'>" % tmpgraph
-        win.HtmlPage.SetPage(txt)
-        win.Show(True)
+        BarFrame(self.Source.parent, tableout, title, words)
 
     def onlexdendro(self, evt):
         if 'corpus' in dir(self.Source):
 
     def onlexdendro(self, evt):
         if 'corpus' in dir(self.Source):
@@ -662,35 +656,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         fchistable = [line[0] for line in chistable]
         words = self.getselectedwords()
         tableout = [vchistable[fchistable.index(word)] for word in words]
         fchistable = [line[0] for line in chistable]
         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) + '")'
-        colnames = 'c("' + '","'.join(title) + '")'
-        nbcl = len(title)
-        rownb = len(words)
-        txt = """
-        load("%s")
-        di <- matrix(data=%s, nrow=%i, byrow = TRUE)
-        rownames(di)<- %s
-        colnames(di) <- %s
-        library(ape)
-        source("%s")
-        height <- (30*ncol(di)) + (15*nrow(di))
-        height <- ifelse(height <= 400, 400, height)
-        width <- 500
-        open_file_graph("%s", width=width, height=height)
-        plot.dendro.lex(tree.cut1$tree.cl, di)
-        """ % (self.Source.pathout['Rdendro'], txttable, rownb, rownames, colnames, self.Source.parent.RscriptsPath['Rgraph'], ffr(tmpgraph))
-        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, u"Graphique", size=(700, 500))
-        win.addsaveimage(tmpgraph)
-        txt = "<img src='%s'>" % tmpgraph
-        win.HtmlPage.SetPage(txt)
-        win.Show(True)
+        BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
 
     def make_concord(self, uces, title, color = 'red') :
         corpus = self.Source.corpus
 
     def make_concord(self, uces, title, color = 'red') :
         corpus = self.Source.corpus
@@ -710,10 +676,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 uci = True
         ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
         items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
                 uci = True
         ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
         items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
-        win = message(self, items, title, (800, 500))
-        #win = message(self, title, size=(750, 600))
-        #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>'
-        #win.HtmlPage.SetPage(win.html)
+        win = message(self, items, title, (800, 500), uceids = ucef)
         return win
 
     def OnPopupTwo(self, event):
         return win
 
     def OnPopupTwo(self, event):
@@ -726,13 +689,13 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
     def OnPopupThree(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
     def OnPopupThree(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
-        win = self.make_concord(uces, "Concordancier - UCE classées")
+        win = self.make_concord(uces, "Concordancier - Segments de texte classés")
         win.Show(True)
         
     def OnPopupFour(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
         win.Show(True)
         
     def OnPopupFour(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
-        win = self.make_concord(uces, "Concordancier - Toutes les UCE")
+        win = self.make_concord(uces, "Concordancier - Tous les segments de texte")
         win.Show(True)
 
     def OnPopupFive(self, event):
         win.Show(True)
 
     def OnPopupFive(self, event):
@@ -790,12 +753,15 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
         #win.HtmlPage.SetPage(win.html)
         win.Show(True)
         #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
         #win.HtmlPage.SetPage(win.html)
         win.Show(True)
+    
+    def OnMakeTgen(self, evt):
+        self.parent.tree.OnTgenEditor(self.getselectedwords())    
 
 
 class wliste(wx.Frame):
     def __init__(self, parent, id, title, d, fline, size=(600, 500)):
         wx.Frame.__init__(self, parent, id)
 
 
 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, menu = False)
+        self.liste = ListForSpec(self, parent, d, fline[1:], 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)
         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)