scro
[iramuteq] / layout.py
index b2eeb4e..803b7ec 100644 (file)
--- a/layout.py
+++ b/layout.py
@@ -45,7 +45,7 @@ class GraphPanelAfc(wx.Panel):
         self.coding = coding
         self.itempath = itempath
         self.parent = self.GetParent()#parent
-        self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
+        self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Arial"))
         self.labels = []
         self.listimg = []
         self.buts = []
@@ -67,7 +67,11 @@ class GraphPanelAfc(wx.Panel):
                     self.listimg.append(hl.HyperLinkCtrl(self.panel_1, -1, os.path.join(self.dirout,list_graph[i][0]), URL=os.path.join(self.dirout,list_graph[i][0])))
                 else :
                     self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
-                self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1]))
+                if os.path.exists(os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')) :
+                   txt = u' - liste des points non représentés : %s' % os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')
+                else :
+                    txt = ''
+                self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1] + txt))
                 self.buts.append(wx.Button(self.panel_1, wx.ID_DELETE, name = `i - b`))
             else :
                 todel.append(i)
@@ -106,6 +110,7 @@ class GraphPanelAfc(wx.Panel):
         self.panel_1.EnableScrolling(True,True)
         #self.panel_1.SetSize((1000,1000))
         self.panel_1.SetScrollRate(20, 20)
+        self.panel_1.SetFocus()
 
     def __do_layout(self):    
         self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
@@ -251,21 +256,28 @@ class GraphPanel(wx.ScrolledWindow):
         self.Dict = dico
         self.txt = txt
         self.parent = parent
-        self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD, 0, "courier"))
+        self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Arial"))
         self.labels = []
         self.listimg = []
         self.dirout = os.path.dirname(self.Dict['ira'])
         self.deb = wx.StaticText(self, -1, txt)
         for i in range(0,len(list_graph)):
             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
-                self.listimg.append(wx.StaticBitmap(self, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
+                filename, ext = os.path.splitext(list_graph[i][0])
+                if ext == '.svg' :
+                    self.listimg.append(hl.HyperLinkCtrl(self, -1, os.path.join(self.dirout,list_graph[i][0]), URL=os.path.join(self.dirout,list_graph[i][0])))
+                else :
+                    self.listimg.append(wx.StaticBitmap(self, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
                 self.labels.append(wx.StaticText(self, -1, list_graph[i][1]))
-                
+        self.Bind(wx.EVT_MOTION, self.onMouseMove) 
         self.__set_properties()
         self.__do_layout()
 
     def __set_properties(self):
+        self.EnableScrolling(True,True)
         self.SetScrollRate(20, 20)   
+        self.SetFocus()
+
 
     def __do_layout(self):
         self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
@@ -278,6 +290,9 @@ class GraphPanel(wx.ScrolledWindow):
         self.sizer_2.Add(self.sizer_1, 1, wx.EXPAND, 0)
         self.SetSizer(self.sizer_1)
         self.sizer_1.Fit(self)
+
+    def onMouseMove(self, event):
+        self.SetFocus()
        
 
 def open_antiprofil(panel, AntiProfile, encoding) :
@@ -290,6 +305,12 @@ def open_antiprofil(panel, AntiProfile, encoding) :
 
 
 
+def getlemgram(corpus, lem) :
+    if not lem[6] in corpus.lems :
+        return lem[5]
+    else :
+        return corpus.lems[lem[6]].gram
+
 class OpenCHDS():
     def __init__(self, parent, corpus, parametres, Alceste=False):
        #sep = u'\n ' 
@@ -341,6 +362,7 @@ class OpenCHDS():
            panel.corpus = self.corpus
        else :
            panel.tableau = self.corpus
+           #self.parent.tableau = panel.tableau
        panel.dictpathout = self.DictPathOut
        panel.pathout = self.DictPathOut
        panel.parent = self.parent
@@ -392,7 +414,9 @@ class OpenCHDS():
             prof_seg = ReadProfileAsDico(DictPathOut['prof_seg'], False, self.encoding)
             self.prof_seg_nb = aui.AuiNotebook(panel, -1, wx.DefaultPosition)
        for i in range(0, clnb):
-            self.cluster_size.append(DictProfile[str(i + 1)][0][0:3]) 
+            self.cluster_size.append(DictProfile[str(i + 1)][0][0:3])
+            if isinstance(self.corpus, Corpus) :
+                DictProfile[str(i + 1)][1:] = [val[0:5] + [getlemgram(self.corpus, val)] + val[6:] for val in DictProfile[str(i + 1)][1:]]
             dlg.Update(3+i, 'Classe %i' %(i+1))
             ind = '/'.join(DictProfile[str(i + 1)][0][0:2])
             indpour = ' - '.join([ind, DictProfile[str(i + 1)][0][2]])
@@ -456,77 +480,6 @@ class OpenCHDS():
         outfile = print_simi3d(self)
         error = exec_rcode(self.parent.RPath, outfile, wait = True)
 
-#    def ongetrapport(self, event) :
-#        dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': 'Rapport'})
-#        dial.fbb.SetValue(self.DictPathOut['rapport'])
-#        dial.CenterOnParent()
-#        res = dial.ShowModal()
-#        if res == wx.ID_OK :
-#            fileout = dial.fbb.GetValue()
-#            dial.Destroy()
-#            with open(fileout, 'w') as f :
-#                f.write(self.debtext + '\n' + GetTxtProfile(self.DictProfile, self.cluster_size))
-#            msg = u"Fini !"
-#            dlg = wx.MessageDialog(self.parent, msg, u"Rapport", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
-#            dlg.CenterOnParent()
-#            dlg.ShowModal()
-#            dlg.Destroy()
-#        else :
-#            dial.Destroy()
-
-#    def on_export_classes(self, event) :
-#        corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
-#        dial = PrefExport(self, self.parent)
-#        dial.fbb.SetValue(os.path.join(os.path.dirname(corpus.dictpathout['ira']), 'export_corpus.txt'))
-#        dial.CenterOnParent()
-#        res = dial.ShowModal()
-#        if res == wx.ID_OK :
-#            if dial.radio_type.GetSelection() == 0 : alc = True
-#            else : alc = False
-#            if dial.radio_lem.GetSelection() == 0 : lem = True
-#            else : lem = False
-#            self.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem)
-#            msg = u"Fini !"
-#            dial.Destroy()
-#            dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
-#            dlg.CenterOnParent()
-#            dlg.ShowModal()
-#            dlg.Destroy()
-
-#    def onprofseg(self, event):
-#        #try :
-#            print 'plus de bug profseg'
-#            print self.parametres
-#            corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
-#            ProfileSegment(self.parent, self.dictpathout, self.parametres, corpus)
-#        #except :
-#        #    BugReport(self.parent)
-#
-#    def onproftype(self, event):
-#        try :
-#            corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
-#            ProfilType(self.parent, corpus)
-#        except :
-#            BugReport(self.parent)
-#
-#    def oncolored(self,evt) :
-#        dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': 'Corpus en couleur'})
-#        dial.fbb.SetValue(os.path.join(os.path.dirname(self.corpus.dictpathout['ira']), 'corpus_couleur.html'))
-#        dial.CenterOnParent()
-#        res = dial.ShowModal()
-#        if res == wx.ID_OK :
-#            fileout = dial.fbb.GetValue()
-#            dial.Destroy()
-#            txt = self.corpus.make_colored_corpus()
-#            with open(fileout, 'w') as f :
-#                f.write(txt)
-#            msg = u"Fini !\nVoulez-vous ouvrir le corpus dans votre navigateur ?"
-#            dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
-#            dlg.CenterOnParent()
-#            if dlg.ShowModal() == wx.ID_YES :
-#                webbrowser.open(fileout)
-#            dlg.Destroy()
-
     def onclusterstat(self, evt) :
         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': 'Stat par classe'})
         dial.fbb.SetValue( os.path.join(os.path.dirname(self.corpus.dictpathout['ira']), 'stat_par_classe.csv'))
@@ -535,7 +488,6 @@ class OpenCHDS():
         if res == wx.ID_OK :
             fileout = dial.fbb.GetValue()
             dial.Destroy()
-            print fileout
             self.corpus.get_stat_by_cluster(fileout)
             msg = u"Fini !"
             dlg = wx.MessageDialog(self.parent, msg, u"Stat par classe", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
@@ -573,7 +525,7 @@ def PrintRapport(self, corpus, parametres, istxt = True):
         txt += u'nombre de formes actives: %i%s' % (corpus.getactivesnb(1), sep)
         txt += u'nombre de formes supplémentaires: %i%s' % (corpus.getactivesnb(2), sep)
         txt += u'nombre de formes actives de fréquence >= %i: %i%s' % (parametres['eff_min_forme'], parametres['nbactives'], sep)
-        txt += u'moyenne d\'occurrences par uce :%f%s' % (float(totocc) / float(corpus.getucenb()), sep)
+        txt += u'moyenne d\'occurrences par segments :%f%s' % (float(totocc) / float(corpus.getucenb()), sep)
         if 'tailleuc1' in parametres :
             if parametres['classif_mode'] == 0 :
                 txt += u'taille rst1 / rst2: %i / %i - %i / %i%s' % (parametres['tailleuc1'], parametres['tailleuc2'], parametres['lenuc1'], parametres['lenuc2'], sep)
@@ -588,7 +540,7 @@ def PrintRapport(self, corpus, parametres, istxt = True):
         elif self.parametres['classif_mode'] == 2 :
             txt += u'%i textes classés sur %i (%.2f%%)%s' % (sum([len(cl) for cl in corpus.lc]), corpus.getucinb(), (float(sum([len(cl) for cl in corpus.lc]))) / float(corpus.getucinb()) * 100, sep)
     else :
-        txt += u'%i uce classées sur %i (%.2f%%)%s' % (self.ucecla, self.Ucenb, (float(self.ucecla) / float(self.Ucenb)) * 100, sep)
+        txt += u'%i segments classées sur %i (%.2f%%)%s' % (self.ucecla, self.Ucenb, (float(self.ucecla) / float(self.Ucenb)) * 100, sep)
  
     txt += """
 ###########################
@@ -655,20 +607,21 @@ class StatLayout:
         self.read_result()
         self.TabStat = aui.AuiNotebook(ira.nb, -1, wx.DefaultPosition)
         self.TabStat.parametres = parametres
+        self.TabStat.corpus = corpus
+        self.TabStat.pathout = self.pathout
 #        CHD = GraphPanel(panel.TabChdSim, DictPathOut, list_graph, txt = self.debtext)
          #      panel.TabChdSim.AddPage(CHD,'CHD')
 
         #self.TabStatTot = wx.TextCtrl(self.TabStat, -1, style=wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2)
         list_graph = [['zipf.png', 'zipf']]
         self.TabStatTot = GraphPanel(ira.nb, self.pathout, list_graph, self.result['glob'])
-        #self.TabStatTot.write(self.result['glob'])
         self.TabStat.AddPage(self.TabStatTot, 'global')
         for item in self.result:
             if item != 'glob':
                 datam = [['forme', 'nb']]
                 self.ListPan = ListPanel(ira, self, self.result[item])
-                self.TabStat.AddPage(self.ListPan, item
-        ira.nb.AddPage(self.TabStat, 'Stat')
+                self.TabStat.AddPage(self.ListPan, ' '.join(item.split('_'))
+        ira.nb.AddPage(self.TabStat, '%s' % parametres['name'])
         ira.nb.SetSelection(ira.nb.GetPageCount() - 1)
         ira.ShowAPane("Tab_content")
 
@@ -713,6 +666,7 @@ class GraphPanelDendro(wx.Panel):
         self.panel_1.EnableScrolling(True,True)
         #self.panel_1.SetSize((1000,1000))
         self.panel_1.SetScrollRate(20, 20)
+        self.panel_1.SetFocus()
         self.Bind(wx.EVT_BUTTON, self.ondendro, self.butdendro)
         self.param = {'width' : 700,
                        'height': 500,
@@ -892,23 +846,17 @@ class DefaultTextLayout :
 
 class WordCloudLayout(DefaultTextLayout):
     def dolayout(self):
-        #self.dictpathout = parent.corpus.dictpathout
-        #self.pathout = os.path.dirname(filename)
-        #self.corpus = parent.corpus
-    #    self.read_result()
         self.pathout.basefiles(simipath)
         self.Tab = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
-#        if os.path.exists(self.pathout['liste_graph']) :
-#            list_graph = read_list_file(self.pathout['liste_graph'])
-#        else : 
-#            list_graph = [['','']]
-        list_graph = [['nuage_1.png', 'Nuage']]
+        if self.parametres['svg'] :
+            list_graph = [['nuage_1.svg', 'Nuage']]
+        else :
+            list_graph = [['nuage_1.png', 'Nuage']]
         self.TabStatTot = GraphPanel(self.ira.nb, self.pathout, list_graph)
-        #self.TabStatTot.write(self.result['glob'])
         self.Tab.AddPage(self.TabStatTot, 'Nuage')
         self.Tab.corpus = self.corpus
         self.Tab.parametres = self.parametres
-        self.ira.nb.AddPage(self.Tab, 'WordCloud %s' % self.parametres.get('corpus_name','corpus_name'))
+        self.ira.nb.AddPage(self.Tab, '%s' % self.parametres['name'])
         self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         self.ira.ShowAPane("Tab_content")
 
@@ -943,7 +891,13 @@ class SimiLayout(DefaultTextLayout) :
             with codecs.open(self.pathout['actives.csv'], 'r', self.parametres['encoding']) as f :
                 self.actives = f.read()
             self.actives = self.actives.splitlines()#[act for act in self.actives.splitlines()]
-        dictcol = dict([[i, [act, self.corpus.getlemeff(act)]] for i, act in enumerate(self.actives)])
+        if os.path.exists(self.pathout['actives_nb.csv']) :
+            with open(self.pathout['actives_nb.csv'], 'r') as f :
+                act_nb = f.read()
+                act_nb = act_nb.splitlines()
+            dictcol = dict([[i, [self.actives[i], int(act_nb[i])]] for i, val in enumerate(self.actives)])
+        else :
+            dictcol = dict([[i, [act, self.corpus.getlemeff(act)]] for i, act in enumerate(self.actives)])
         #res = SelectColumn(self.ira, dictcol, self.actives, self.pathout['selected.csv'], selected = selected, dlg = True) 
         #if res.ok :
         prep = PrepSimi(self.ira, self, self.parametres,self.pathout['selected.csv'], self.actives, indices_simi, wordlist = dictcol, selected = selected)
@@ -1044,7 +998,11 @@ class SimiMatLayout(DefaultMatLayout) :
         #    with codecs.open(self.pathout['actives.csv'], 'r', self.parametres['encoding']) as f :
         #        self.actives = f.read()
         #    self.actives = self.actives.splitlines()#[act for act in self.actives.splitlines()]
-        actives = [[val, self.tableau.actives[val][0]] for val in self.tableau.actives]
+        try :
+            actives = [[val, self.tableau.actives[val][0]] for val in self.tableau.actives]
+        except :
+            actives = [[val, self.tableau.actives[val]] for val in self.tableau.actives]
+
         #self.tableau.make_listactives()
         actives = dict([[i, val] for i, val in enumerate(actives)])
         #dictcol = dict([[i, [act, self.corpus.getlemeff(act)]] for i, act in enumerate(self.actives)])
@@ -1214,7 +1172,7 @@ class GraphPanelSimi(wx.Panel):
                 else :
                     self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
                 self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1]))
-                
+        self.panel_1.Bind(wx.EVT_MOTION, self.onMouseMove) 
         self.__set_properties()
         self.__do_layout()
 
@@ -1222,6 +1180,7 @@ class GraphPanelSimi(wx.Panel):
         self.panel_1.EnableScrolling(True,True)
         #self.panel_1.SetSize((1000,1000))
         self.panel_1.SetScrollRate(20, 20)
+        self.panel_1.SetFocus()
 
     def __do_layout(self):    
         self.sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
@@ -1236,3 +1195,6 @@ class GraphPanelSimi(wx.Panel):
         self.sizer_1.Add(self.sizer_2, 0, wx.EXPAND, 0)
         self.sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
         self.SetSizer(self.sizer_1) 
+
+    def onMouseMove(self, event):
+        self.panel_1.SetFocus()