new tgen
[iramuteq] / layout.py
index 6050d2e..73d8e04 100644 (file)
--- a/layout.py
+++ b/layout.py
@@ -17,12 +17,12 @@ from ProfList import ProfListctrlPanel
 from guiparam3d import param3d, simi3d
 from PrintRScript import write_afc_graph, print_simi3d, PrintSimiScript
 from profile_segment import ProfileSegment
 from guiparam3d import param3d, simi3d
 from PrintRScript import write_afc_graph, print_simi3d, PrintSimiScript
 from profile_segment import ProfileSegment
-from functions import ReadList
+from functions import ReadList, launchcommand
 from listlex import *
 from Liste import *
 from search_tools import SearchFrame
 from listlex import *
 from Liste import *
 from search_tools import SearchFrame
-from dialog import PrefGraph, PrefExport, PrefSimpleFile, PrefDendro, SimpleDialog
-from guifunct import SelectColumn, PrepSimi, PrefSimi
+from dialog import PrefGraph, PrefExport, PrefSimpleFile, PrefDendro, SimpleDialog, ImageViewer
+from guifunct import SelectColumn, PrepSimi, PrefSimi, redosimi
 from webexport import WebExport
 from corpus import Corpus
 from sheet import MySheet
 from webexport import WebExport
 from corpus import Corpus
 from sheet import MySheet
@@ -33,6 +33,9 @@ from time import sleep
 import shutil
 import codecs
 import logging
 import shutil
 import codecs
 import logging
+import gettext
+from graph_to_json import GraphToJson
+_ = gettext.gettext
 
 log = logging.getLogger('iramuteq.layout')
 
 
 log = logging.getLogger('iramuteq.layout')
 
@@ -67,7 +70,8 @@ class GraphPanelAfc(wx.Panel):
                 if ext == '.svg' or ext == '.html':
                     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 :
                 if ext == '.svg' or ext == '.html':
                     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.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY), name=`i-b`))
+                    self.listimg[-1].Bind(wx.EVT_RIGHT_DOWN, self.onrightclick)
                 if os.path.exists(os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')) :
                     txt = _(u"List of not plotted points : ").decode('utf8') + '%s' % os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')
                 else :
                 if os.path.exists(os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')) :
                     txt = _(u"List of not plotted points : ").decode('utf8') + '%s' % os.path.join(self.dirout,list_graph[i][0] + '_notplotted.csv')
                 else :
@@ -144,6 +148,7 @@ class GraphPanelAfc(wx.Panel):
             oldbut.Show(False)
             for i, but in enumerate(self.buts) :
                 but.SetName(`i`)
             oldbut.Show(False)
             for i, but in enumerate(self.buts) :
                 but.SetName(`i`)
+                self.listimg[i].SetName(`i`)
             todel = self.list_graph.pop(image_id)
             os.remove(os.path.join(self.dirout, todel[0]))
             print_liste(self.Dict[self.itempath], self.list_graph)
             todel = self.list_graph.pop(image_id)
             os.remove(os.path.join(self.dirout, todel[0]))
             print_liste(self.Dict[self.itempath], self.list_graph)
@@ -151,7 +156,14 @@ class GraphPanelAfc(wx.Panel):
             self.Layout()
         else :
             dial.Destroy()
             self.Layout()
         else :
             dial.Destroy()
-        
+    
+    def onrightclick(self, event):
+        image_id = int(event.GetEventObject().GetName())
+        image_path = self.list_graph[image_id][0]
+        viewer = ImageViewer(self, {'tmpgraph' : os.path.join(self.dirout,image_path), 'svg': 'FALSE', 'wildcard': '*.*'}, self.labels[image_id].GetLabelText(), self.listimg[image_id].GetSize())
+        viewer.Show()
+        #print image_path        
+        #print self.labels[image_id].GetLabelText()
 
     def afc_graph(self,event):
         #dirout = os.path.dirname(self.Dict['ira'])
 
     def afc_graph(self,event):
         #dirout = os.path.dirname(self.Dict['ira'])
@@ -172,6 +184,8 @@ class GraphPanelAfc(wx.Panel):
                 typegraph = 2
             if typegraph == 2:
                 typefile = '.gexf'
                 typegraph = 2
             if typegraph == 2:
                 typefile = '.gexf'
+            if typegraph == 3 :
+                typefile = ''
             while os.path.exists(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+typefile)):
                 self.afcnb +=1
             self.fileout = ffr(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+typefile))
             while os.path.exists(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+typefile)):
                 self.afcnb +=1
             self.fileout = ffr(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+typefile))
@@ -225,7 +239,7 @@ class GraphPanelAfc(wx.Panel):
                 f.write(txt)
             pid = exec_rcode(self.ira.RPath, filetmp)
             check_Rresult(self.ira, pid)
                 f.write(txt)
             pid = exec_rcode(self.ira.RPath, filetmp)
             check_Rresult(self.ira, pid)
-            if self.param['typegraph'] in [0,2] :
+            if self.param['typegraph'] != 1 :
                 txt = 'Variables '
                 if self.param['qui'] == 0 : value = u'actives'
                 if self.param['qui'] == 1 : value = u'supplémentaires'
                 txt = 'Variables '
                 if self.param['qui'] == 0 : value = u'actives'
                 if self.param['qui'] == 1 : value = u'supplémentaires'
@@ -253,13 +267,20 @@ class GraphPanelAfc(wx.Panel):
                     }
                     web = WebExport(self.ira, parametres)
                     self.fileout = web.exportafc()              
                     }
                     web = WebExport(self.ira, parametres)
                     self.fileout = web.exportafc()              
-                self.list_graph.append([os.path.basename(self.fileout), txt])
+                if self.param['typegraph'] == 3 :
+                    fileout = os.path.join(os.path.basename(self.fileout), 'index.html')
+                else : 
+                    fileout = os.path.basename(self.fileout)
+                self.list_graph.append([fileout, txt])
                 print_liste(self.DictPathOut[self.itempath], self.list_graph)
                 if self.param['svg'] or self.param['typegraph'] == 2:
                     self.listimg.append(hl.HyperLinkCtrl(self.panel_1, -1, self.fileout, URL=self.fileout))
                 print_liste(self.DictPathOut[self.itempath], self.list_graph)
                 if self.param['svg'] or self.param['typegraph'] == 2:
                     self.listimg.append(hl.HyperLinkCtrl(self.panel_1, -1, self.fileout, URL=self.fileout))
-
+                elif self.param['typegraph'] == 3 :
+                    fileout = os.path.join(self.fileout,'index.html')
+                    self.listimg.append(hl.HyperLinkCtrl(self.panel_1, -1, fileout, URL=fileout))
                 else :
                 else :
-                    self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(self.fileout, wx.BITMAP_TYPE_ANY)))
+                    self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(self.fileout, wx.BITMAP_TYPE_ANY), name=`len(self.list_graph) - 1`))
+                    self.listimg[-1].Bind(wx.EVT_RIGHT_DOWN, self.onrightclick)
                 self.sizer_3.Add( self.listimg[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
                 self.labels.append(wx.StaticText(self.panel_1,-1, txt))
                 self.sizer_3.Add(self.labels[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
                 self.sizer_3.Add( self.listimg[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
                 self.labels.append(wx.StaticText(self.panel_1,-1, txt))
                 self.sizer_3.Add(self.labels[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
@@ -548,7 +569,7 @@ class OpenCHDS():
             dial.Destroy()
             self.corpus.get_stat_by_cluster(fileout)
             msg = u"Fini !"
             dial.Destroy()
             self.corpus.get_stat_by_cluster(fileout)
             msg = u"Fini !"
-            dlg = wx.MessageDialog(self.parent, msg, _(u"Stat by cluster").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
+            dlg = wx.MessageDialog(self.parent, msg, _(u"Stat by cluster").decode('utf8'), wx.OK | wx.ICON_INFORMATION)
             dlg.CenterOnParent()
             if dlg.ShowModal() == wx.ID_OK :
                 dlg.Destroy()
             dlg.CenterOnParent()
             if dlg.ShowModal() == wx.ID_OK :
                 dlg.Destroy()
@@ -569,37 +590,34 @@ def PrintRapport(self, corpus, parametres, istxt = True):
 """ % datetime.datetime.now().ctime()
     if istxt :
         totocc = corpus.gettotocc()
 """ % datetime.datetime.now().ctime()
     if istxt :
         totocc = corpus.gettotocc()
-        txt += u'nombre de textes: %i%s' % (corpus.getucinb(), sep)
-        txt += u'nombre de segments de textes: %i%s' % (corpus.getucenb(), sep)
-        txt += u'nombre de formes: %i%s' % (len(corpus.formes), sep)
-        txt += u'nombre d\'occurrences: %i%s' % (totocc, sep)
-        txt += u'moyenne d\'occurrences par forme: %f%s' % (float(totocc) / float(len(self.corpus.formes)), sep)
-        txt += u'nombre de lemmes: %i%s' % (len(corpus.lems), sep)
-        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 segments :%f%s' % (float(totocc) / float(corpus.getucenb()), sep)
+        txt += ': '.join([_(u'Number of texts').decode('utf8'),  u'%i%s' % (corpus.getucinb(), sep)])
+        txt += ': '.join([_(u'Number of text segments').decode('utf8'),  '%i%s' % (corpus.getucenb(), sep)])
+        txt += ': '.join([_(u'Number of forms').decode('utf8'), '%i%s' % (len(corpus.formes), sep)])
+        txt += ': '.join([_(u'Number of occurrences').decode('utf8'), '%i%s' % (totocc, sep)])
+        #txt += u'moyenne d\'occurrences par forme: %f%s' % (float(totocc) / float(len(self.corpus.formes)), sep)
+        txt += ': '.join([_(u'Number of lemmas').decode('utf8'), '%i%s' % (len(corpus.lems), sep)])
+        txt += ': '.join([_(u'Number of active forms').decode('utf8'), '%i%s' % (corpus.getactivesnb(1), sep)])
+        txt += ': '.join([_(u'Number of supplementary forms').decode('utf8'), '%i%s' % (corpus.getactivesnb(2), sep)])
+        txt += ' >= '.join([_(u'Number of active forms with a frequency').decode('utf8'), '%i: %i%s' % (parametres['eff_min_forme'], parametres['nbactives'], sep)])
+        txt += ': '.join([_(u'Mean of forms by segment').decode('utf8'), '%f%s' % (float(totocc) / float(corpus.getucenb()), sep)])
         if 'tailleuc1' in parametres :
             if parametres['classif_mode'] == 0 :
         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)
+                txt += ': '.join([_(u'Size of rst1 / rst2').decode('utf8'), '%i / %i - %i / %i%s' % (parametres['tailleuc1'], parametres['tailleuc2'], parametres['lenuc1'], parametres['lenuc2'], sep)])
     else :
         self.Ucenb = self.nbind
     else :
         self.Ucenb = self.nbind
-        txt += u'nombre d\'individus : %i%s' % (self.nbind, sep)
-        txt += u'nombre de classes : %i%s' % (self.clnb, sep)
+        txt += ': '.join([_(u'Number of lines').decode('utf8'), '%i%s' % (self.nbind, sep)])
+        txt += ': '.join([_(u'Number of clusters').decode('utf8'), '%i%s' % (self.clnb, sep)])
     if istxt :
     if istxt :
-        txt += u'nombre de classes : %i%s' % (parametres['clnb'], sep)
+        txt += ': '.join([_(u'Number of clusters').decode('utf8'), '%i%s' % (parametres['clnb'], sep)])
         if parametres['classif_mode'] == 0 or parametres['classif_mode'] == 1 :
         if parametres['classif_mode'] == 0 or parametres['classif_mode'] == 1 :
-            txt += u'%i segments classés sur %i (%.2f%%)%s' % (sum([len(cl) for cl in corpus.lc]), corpus.getucenb(), (float(sum([len(cl) for cl in corpus.lc])) / float(corpus.getucenb())) * 100, sep)
+            txt += ' '.join(['%i' % sum([len(cl) for cl in corpus.lc]), _(u'segments classified on').decode('utf8'), '%i (%.2f%%)%s' % (corpus.getucenb(), (float(sum([len(cl) for cl in corpus.lc])) / float(corpus.getucenb())) * 100, sep)])
         elif self.parametres['classif_mode'] == 2 :
         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)
+            txt += ' '.join([u'%i' % sum([len(cl) for cl in corpus.lc]), _(u'texts classified on').decode('utf8'), '%i (%.2f%%)%s' % (corpus.getucinb(), (float(sum([len(cl) for cl in corpus.lc]))) / float(corpus.getucinb()) * 100, sep)])
     else :
     else :
-        txt += u'%i segments classées sur %i (%.2f%%)%s' % (self.ucecla, self.Ucenb, (float(self.ucecla) / float(self.Ucenb)) * 100, sep)
+        txt += ' '.join(['%i' % self.ucecla, _(u'line classified on').decode('utf8'), '%i (%.2f%%)%s' % (self.Ucenb, (float(self.ucecla) / float(self.Ucenb)) * 100, sep)])
  
  
-    txt += """
-###########################
-temps d'analyse : %s
-###########################
-""" % parametres.get('time', '')
+    txt += ''.join([sep, u'###########################', sep, _(u'time').decode('utf8'), ' : %s' % parametres.get('time', ''), sep, u'###########################', sep])
+
     with open(self.pathout['pre_rapport'], 'w') as f :
         f.write(txt)
 
     with open(self.pathout['pre_rapport'], 'w') as f :
         f.write(txt)
 
@@ -667,6 +685,10 @@ class TgenLayout :
         self.page.tgens, etoiles =  ReadList(parametres['tgenspec'], ira.syscoding, sep="\t")
         tgen = TGen(path = tgenpath, encoding = parametres['encoding'])
         tgen.read()
         self.page.tgens, etoiles =  ReadList(parametres['tgenspec'], ira.syscoding, sep="\t")
         tgen = TGen(path = tgenpath, encoding = parametres['encoding'])
         tgen.read()
+        tgenlempath = os.path.join(parametres['pathout'], 'tgenlemchi2.csv')
+        if os.path.exists(tgenlempath) :
+            self.page.parametres['tgenlemspec'] = tgenlempath
+            self.page.tgenlem, etoiles = ReadList(self.page.parametres['tgenlemspec'], ira.syscoding, sep="\t")
         tgentab = False
         gparent = None
         if 'TabChdSim' in dir(page) :
         tgentab = False
         gparent = None
         if 'TabChdSim' in dir(page) :
@@ -684,12 +706,15 @@ class TgenLayout :
         if tgentab :
             self.page.tgentab.RefreshData(self.page.tgens)
             self.page.tgentab.tgens = tgen.tgen
         if tgentab :
             self.page.tgentab.RefreshData(self.page.tgens)
             self.page.tgentab.tgens = tgen.tgen
+            self.page.tgentab.tgenlem = self.page.tgenlem
             page.SetSelection(i)
         else :
             self.page.tgentab = ListForSpec(ira, gparent, self.page.tgens, etoiles[1:])
             self.page.tgentab.tgen = True
             self.page.tgentab.tgens = tgen.tgen
             page.SetSelection(i)
         else :
             self.page.tgentab = ListForSpec(ira, gparent, self.page.tgens, etoiles[1:])
             self.page.tgentab.tgen = True
             self.page.tgentab.tgens = tgen.tgen
-            page.AddPage(self.page.tgentab, u'Tgens Specificities')
+            if os.path.exists(tgenlempath) :
+                self.page.tgentab.tgenlem = self.page.tgenlem
+            page.AddPage(self.page.tgentab, _(u'Tgens Specificities').decode('utf8'))
             page.SetSelection(page.GetPageCount() - 1)
 
 class dolexlayout :
             page.SetSelection(page.GetPageCount() - 1)
 
 class dolexlayout :
@@ -726,25 +751,25 @@ class dolexlayout :
         self.ListPanEffRelForme = ListForSpec(ira, self, self.DictEffRelForme, self.etoiles)
         self.ListPanEffRelType = ListForSpec(ira, self, self.DictEffRelType, self.etoiles)
         
         self.ListPanEffRelForme = ListForSpec(ira, self, self.DictEffRelForme, self.etoiles)
         self.ListPanEffRelType = ListForSpec(ira, self, self.DictEffRelType, self.etoiles)
         
-        self.TabStat.AddPage(self.ListPan, u'formes'
+        self.TabStat.AddPage(self.ListPan, _(u'Forms').decode('utf8')
         if os.path.exists(self.pathout['banalites.csv']) :
         if os.path.exists(self.pathout['banalites.csv']) :
-            self.TabStat.AddPage(self.listban, u'banalités')
-        self.TabStat.AddPage(self.ListPant, u'Types')
-        self.TabStat.AddPage(self.ListPanEff, u'Effectifs formes')
-        self.TabStat.AddPage(self.ListPanEffType, u'Effectifs Type')
-        self.TabStat.AddPage(self.ListPanEffRelForme, u'Effectifs relatifs formes')
-        self.TabStat.AddPage(self.ListPanEffRelType, u'Effectifs relatifs Type')
+            self.TabStat.AddPage(self.listban, _(u'Banal forms').decode('utf8'))
+        self.TabStat.AddPage(self.ListPant, _(u'POS').decode('utf8'))
+        self.TabStat.AddPage(self.ListPanEff, _(u'Forms frequencies').decode('utf8'))
+        self.TabStat.AddPage(self.ListPanEffType, _(u'POS frequencies').decode('utf8'))
+        self.TabStat.AddPage(self.ListPanEffRelForme, _(u'Forms relative frequencies').decode('utf8'))
+        self.TabStat.AddPage(self.ListPanEffRelType, _(u'POS relative frequencies').decode('utf8'))
         if self.parametres['clnb'] > 2 :
             self.TabAFC = aui.AuiNotebook(self.TabStat, -1, wx.DefaultPosition)
             list_graph=read_list_file(self.dictpathout['liste_graph_afcf'], encoding = self.encoding)
             self.tabAFCGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afcf', coding = self.encoding)
         if self.parametres['clnb'] > 2 :
             self.TabAFC = aui.AuiNotebook(self.TabStat, -1, wx.DefaultPosition)
             list_graph=read_list_file(self.dictpathout['liste_graph_afcf'], encoding = self.encoding)
             self.tabAFCGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afcf', coding = self.encoding)
-            self.TabAFC.AddPage(self.tabAFCGraph, 'AFC formes')
+            self.TabAFC.AddPage(self.tabAFCGraph, _(u'CA forms').decode('utf8'))
             list_graph=read_list_file(self.dictpathout['liste_graph_afct'], encoding = self.encoding)
             self.tabAFCTGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afct', coding=self.encoding)
             list_graph=read_list_file(self.dictpathout['liste_graph_afct'], encoding = self.encoding)
             self.tabAFCTGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afct', coding=self.encoding)
-            self.TabAFC.AddPage(self.tabAFCTGraph, 'AFC type')
-            self.TabStat.AddPage(self.TabAFC, 'AFC')
+            self.TabAFC.AddPage(self.tabAFCTGraph, _(u'CA POS').decode('utf8'))
+            self.TabStat.AddPage(self.TabAFC, _(u'CA').decode('utf8'))
         
         
-        ira.nb.AddPage(self.TabStat, u'Spécificités')
+        ira.nb.AddPage(self.TabStat, ' - '.join([_(u'Specificities').decode('utf8'), self.parametres['name']]))
         self.ira = ira
         
         self.TabStat.corpus = self.corpus
         self.ira = ira
         
         self.TabStat.corpus = self.corpus
@@ -772,12 +797,19 @@ class StatLayout:
         #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 = 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.TabStat.AddPage(self.TabStatTot, 'global')
+        self.TabStat.AddPage(self.TabStatTot, _(u'Abstract').decode('utf8'))
+        
+        dictlabel = {'total' : _(u'Total').decode('utf8'),
+                     u'formes_actives' : _(u'Actives forms').decode('utf8'),
+                     u'formes_supplémentaires': _(u'Supplementary forms').decode('utf8'),
+                     u'hapax' : _(u'Hapax').decode('utf8'),
+                     }
+        
         for item in self.result:
             if item != 'glob':
                 datam = [['forme', 'nb']]
                 self.ListPan = ListPanel(ira, self, self.result[item])
         for item in self.result:
             if item != 'glob':
                 datam = [['forme', 'nb']]
                 self.ListPan = ListPanel(ira, self, self.result[item])
-                self.TabStat.AddPage(self.ListPan, ' '.join(item.split('_'))
+                self.TabStat.AddPage(self.ListPan, dictlabel[item]
         ira.nb.AddPage(self.TabStat, '%s' % parametres['name'])
         ira.nb.SetSelection(ira.nb.GetPageCount() - 1)
         ira.ShowAPane("Tab_content")
         ira.nb.AddPage(self.TabStat, '%s' % parametres['name'])
         ira.nb.SetSelection(ira.nb.GetPageCount() - 1)
         ira.ShowAPane("Tab_content")
@@ -866,10 +898,11 @@ class GraphPanelDendro(wx.Panel):
         self.param['width'] = dial.m_spinCtrl2.GetValue()
         self.param['height'] = dial.m_spinCtrl1.GetValue()
         self.param['type_dendro'] = dial.m_choice1.GetSelection()
         self.param['width'] = dial.m_spinCtrl2.GetValue()
         self.param['height'] = dial.m_spinCtrl1.GetValue()
         self.param['type_dendro'] = dial.m_choice1.GetSelection()
-        self.param['color_nb'] = dial.m_radioBox1.GetSelection()
-        self.param['taille_classe'] = dial.m_checkBox1.GetValue()
-        self.param['type_tclasse'] = dial.m_radioBox2.GetSelection()
         self.param['svg'] = dial.choice_format.GetSelection()
         self.param['svg'] = dial.choice_format.GetSelection()
+        if self.param['typedendro'] == 'classique' :
+            self.param['color_nb'] = dial.m_radioBox1.GetSelection()
+            self.param['taille_classe'] = dial.m_checkBox1.GetValue()
+            self.param['type_tclasse'] = dial.m_radioBox2.GetSelection()
 
     def make_dendro(self, dendro = 'simple') :
         if self.param['svg'] :
 
     def make_dendro(self, dendro = 'simple') :
         if self.param['svg'] :
@@ -957,6 +990,7 @@ class GraphPanelDendro(wx.Panel):
 
 
     def ondendro(self, evt):
 
 
     def ondendro(self, evt):
+        self.param['typedendro'] = 'classique'
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
@@ -964,6 +998,7 @@ class GraphPanelDendro(wx.Panel):
             self.make_dendro()
     
     def ondendrotexte(self, evt):
             self.make_dendro()
     
     def ondendrotexte(self, evt):
+        self.param['typedendro'] = 'texte'
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
@@ -971,6 +1006,7 @@ class GraphPanelDendro(wx.Panel):
             self.make_dendro(dendro = 'texte')
 
     def ondendrocloud(self, evt):
             self.make_dendro(dendro = 'texte')
 
     def ondendrocloud(self, evt):
+        self.param['typedendro'] = 'cloud'
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
         dial = PrefDendro(self.ira, self.param)
         val = dial.ShowModal()
         if val == wx.ID_OK :
@@ -1005,7 +1041,7 @@ class CopusPanel(wx.Panel) :
         fgSizer5.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )        
         self.fgSizer5 = fgSizer5
         
         fgSizer5.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )        
         self.fgSizer5 = fgSizer5
         
-        self.m_staticText18 = wx.StaticText( self, wx.ID_ANY, u"Description du corpus", wx.DefaultPosition, wx.DefaultSize, 0 )
+        self.m_staticText18 = wx.StaticText( self, wx.ID_ANY, _(u"Description of corpus").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 )
 
         self.m_staticText18.Wrap( -1 )
         fgSizer5.Add( self.m_staticText18, 0, wx.ALL, 5 )
 
         self.m_staticText18.Wrap( -1 )
         fgSizer5.Add( self.m_staticText18, 0, wx.ALL, 5 )
@@ -1022,12 +1058,12 @@ class CopusPanel(wx.Panel) :
         self.m_staticText21.Wrap( -1 )
         fgSizer5.Add( self.m_staticText21, 0, wx.ALL, 5 )
 
         self.m_staticText21.Wrap( -1 )
         fgSizer5.Add( self.m_staticText21, 0, wx.ALL, 5 )
 
-        description = {'lang' : u'langue',
-                       'encoding' : u'encodage',
-                       'ucinb' : u'Nombre de textes',
-                       'ucenb' : u'Nombre de segments de texte',
-                       'formesnb' : u'Nombre de formes',
-                       'hapax' : u'Nombre d\'hapax'
+        description = {'lang' : _(u'Language').decode('utf8'),
+                       'encoding' : _(u'Characters set').decode('utf8'),
+                       'ucinb' : _(u'Number of texts').decode('utf8'),
+                       'ucenb' : _(u'Number of text segments').decode('utf8'),
+                       'formesnb' : _(u'Number of forms').decode('utf8'),
+                       'hapax' : _(u'Number of hapax').decode('utf8'),
                       }
 
         keys = ['lang', 'encoding', 'originalpath', 'pathout', 'date', 'time']
                       }
 
         keys = ['lang', 'encoding', 'originalpath', 'pathout', 'date', 'time']
@@ -1073,15 +1109,16 @@ class CopusPanel(wx.Panel) :
             self.fgSizer5.Add( text, 0, wx.ALL, 5 )
 
 class DefaultTextLayout :
             self.fgSizer5.Add( text, 0, wx.ALL, 5 )
 
 class DefaultTextLayout :
-    def __init__(self, ira, corpus, parametres) :
+    def __init__(self, ira, corpus, parametres, cmd = False) :
         self.pathout = PathOut(dirout = parametres['pathout'])
         self.ira = ira
         self.parent = ira
         self.parametres = parametres
         self.corpus = corpus
         self.pathout = PathOut(dirout = parametres['pathout'])
         self.ira = ira
         self.parent = ira
         self.parametres = parametres
         self.corpus = corpus
+        self.cmd = cmd
         self.dolayout()
     
         self.dolayout()
     
-    def dolayout(self) :
+    def dolayout(self, cmd) :
         log.info('no layout yet')
 
 class WordCloudLayout(DefaultTextLayout):
         log.info('no layout yet')
 
 class WordCloudLayout(DefaultTextLayout):
@@ -1100,6 +1137,35 @@ class WordCloudLayout(DefaultTextLayout):
         self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         self.ira.ShowAPane("Tab_content")
 
         self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         self.ira.ShowAPane("Tab_content")
 
+def blender(self):
+    nodesfile = self.pathout['nodes.csv']
+    edgesfile = self.pathout['edges.csv']
+    jsonout = self.pathout.makenew('graphe_json', 'json')
+    txt = """
+    library(igraph)
+    load("%s")
+    source("%s")
+    """ % (ffr(self.pathout['RData.RData']), ffr(self.parent.RscriptsPath['Rgraph']))
+    txt += """
+    nodesf <- "%s"
+    edgesf <- "%s"
+    """ % (ffr(nodesfile), ffr(edgesfile))
+    txt += """
+    if ("communities" %in% names(graph.simi)) {
+        community = TRUE
+    } else {
+        community = FALSE
+    }
+    graph.to.file(graph.simi, nodesfile = nodesf, edgesfile = edgesf, community = community)       
+    """
+    filetmp = tempfile.mktemp()
+    with open(filetmp, 'w') as f :
+        f.write(txt)
+    exec_rcode(self.ira.RPath, filetmp)        
+    GraphToJson(nodesfile, edgesfile, jsonout)
+    launchcommand(['/home/pierre/prog/blender-2.73-linux-glibc211-x86_64/blender', '-P', os.path.join(self.ira.AppliPath, 'network_to_blender.py'), jsonout])
+
+
 class SimiLayout(DefaultTextLayout) :
     def dolayout(self) :
         self.pathout.basefiles(simipath)
 class SimiLayout(DefaultTextLayout) :
     def dolayout(self) :
         self.pathout.basefiles(simipath)
@@ -1109,78 +1175,81 @@ class SimiLayout(DefaultTextLayout) :
             list_graph = read_list_file(self.pathout['liste_graph'])
         else : 
             list_graph = [['','']]
             list_graph = read_list_file(self.pathout['liste_graph'])
         else : 
             list_graph = [['','']]
-        notebook_flags =  aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT
-        self.tabsimi = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
-        self.tabsimi.SetAGWWindowStyleFlag(notebook_flags)
-        self.tabsimi.SetArtProvider(aui.ChromeTabArt())
-        self.tabsimi.corpus = self.corpus
-        self.tabsimi.parametres = self.parametres
-        self.graphpan = GraphPanelSimi(self.tabsimi, self.pathout, list_graph)
-        self.graphpan.Bind(wx.EVT_BUTTON, self.redosimi, self.graphpan.butafc)
-        self.graphpan.Bind(wx.EVT_BUTTON, self.export, self.graphpan.butexport)
-        self.tabsimi.AddPage(self.graphpan, 'Graph')
-        self.ira.nb.AddPage(self.tabsimi, 'Analyse de graph')
-        self.ira.ShowTab(True)
-        self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
+        if not self.cmd : 
+            notebook_flags =  aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT
+            self.tabsimi = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
+            self.tabsimi.SetAGWWindowStyleFlag(notebook_flags)
+            self.tabsimi.SetArtProvider(aui.ChromeTabArt())
+            self.tabsimi.corpus = self.corpus
+            self.tabsimi.parametres = self.parametres
+            self.graphpan = GraphPanelSimi(self.tabsimi, self.pathout, list_graph)
+            self.graphpan.Bind(wx.EVT_BUTTON, self.redosimi, self.graphpan.butafc)
+            self.graphpan.Bind(wx.EVT_BUTTON, self.export, self.graphpan.butexport)
+            self.graphpan.Bind(wx.EVT_BUTTON, self.blender, self.graphpan.butblender)
+            self.tabsimi.AddPage(self.graphpan, 'Graph')
+            self.ira.nb.AddPage(self.tabsimi, _(u'Graph analysis').decode('utf8'))
+            self.ira.ShowTab(True)
+            self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         
     def redosimi(self, evt) :
         
     def redosimi(self, evt) :
-        with open(self.pathout['selected.csv'],'r') as f :
-            selected = f.read()
-        selected = [int(val) for val in selected.splitlines()]
-        if self.actives is None :
-            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()]
-        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)
-        if prep.val == wx.ID_OK :
-            self.parametres = prep.parametres
-
-            script = PrintSimiScript(self)
-            script.make_script()
-            pid = exec_rcode(self.ira.RPath, script.scriptout, wait = True)
-            check_Rresult(self.ira, pid)
-            if self.parametres['type_graph'] in [1,3] :
-                if self.parametres['svg'] :
-                    filename, ext = os.path.splitext(script.filename)
-                    fileout = filename + '.svg'
-                elif self.parametres['type_graph'] == 3 :
-                    fileout = script.filename
-                    parametres = {'gexffile' :  fileout,
-                                  'dirout' : os.path.dirname(fileout),
-                                  'titre': 'Le titre',
-                                  #'nodemin': self.param['txt_min'],
-                                  #'nodemax': self.param['txt_max'],
-                                  #'bargraphw' : 60*int(self.param['clnb']),
-                    }
-                    web = WebExport(self.ira, parametres)
-                    fileout = web.exportsimi()                         
-                else :
-                    fileout = script.filename
-                if os.path.exists(self.pathout['liste_graph']):
-                    graph_simi = read_list_file(self.pathout['liste_graph'])
-                    graph_simi.append([os.path.basename(fileout), script.txtgraph])
-                else :
-                    graph_simi = [[os.path.basename(fileout), script.txtgraph]]
-                print_liste(self.pathout['liste_graph'], graph_simi)
-            DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
-            if self.parametres['type_graph'] in [1,3] :
-                if self.parametres['svg'] or self.parametres['type_graph'] == 3 :
-                    self.graphpan.sizer_3.Add(hl.HyperLinkCtrl(self.graphpan.panel_1, -1, fileout, URL = fileout), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
-                else :
-                    self.graphpan.sizer_3.Add(wx.StaticBitmap(self.graphpan.panel_1, -1, wx.Bitmap(fileout, wx.BITMAP_TYPE_ANY)), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
-                self.graphpan.sizer_3.Add(wx.StaticText(self.graphpan.panel_1,-1, script.txtgraph), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
-                self.graphpan.sizer_3.Fit(self.graphpan.panel_1)
-                self.graphpan.Layout()
-                self.graphpan.panel_1.Scroll(0,self.graphpan.panel_1.GetScrollRange(wx.VERTICAL))
+        redosimi(self, evt)
+#         with open(self.pathout['selected.csv'],'r') as f :
+#             selected = f.read()
+#         selected = [int(val) for val in selected.splitlines()]
+#         if self.actives is None :
+#             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()]
+#         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)
+#         if prep.val == wx.ID_OK :
+#             self.parametres = prep.parametres
+# 
+#             script = PrintSimiScript(self)
+#             script.make_script()
+#             pid = exec_rcode(self.ira.RPath, script.scriptout, wait = True)
+#             check_Rresult(self.ira, pid)
+#             if self.parametres['type_graph'] in [1,3] :
+#                 if self.parametres['svg'] :
+#                     filename, ext = os.path.splitext(script.filename)
+#                     fileout = filename + '.svg'
+#                 elif self.parametres['type_graph'] == 3 :
+#                     fileout = script.filename
+#                     parametres = {'gexffile' :  fileout,
+#                                   'dirout' : os.path.dirname(fileout),
+#                                   'titre': 'Le titre',
+#                                   #'nodemin': self.param['txt_min'],
+#                                   #'nodemax': self.param['txt_max'],
+#                                   #'bargraphw' : 60*int(self.param['clnb']),
+#                     }
+#                     web = WebExport(self.ira, parametres)
+#                     fileout = web.exportsimi()                         
+#                 else :
+#                     fileout = script.filename
+#                 if os.path.exists(self.pathout['liste_graph']):
+#                     graph_simi = read_list_file(self.pathout['liste_graph'])
+#                     graph_simi.append([os.path.basename(fileout), script.txtgraph])
+#                 else :
+#                     graph_simi = [[os.path.basename(fileout), script.txtgraph]]
+#                 print_liste(self.pathout['liste_graph'], graph_simi)
+#             DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
+#             if self.parametres['type_graph'] in [1,3] :
+#                 if self.parametres['svg'] or self.parametres['type_graph'] == 3 :
+#                     self.graphpan.sizer_3.Add(hl.HyperLinkCtrl(self.graphpan.panel_1, -1, fileout, URL = fileout), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
+#                 else :
+#                     self.graphpan.sizer_3.Add(wx.StaticBitmap(self.graphpan.panel_1, -1, wx.Bitmap(fileout, wx.BITMAP_TYPE_ANY)), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
+#                 self.graphpan.sizer_3.Add(wx.StaticText(self.graphpan.panel_1,-1, script.txtgraph), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
+#                 self.graphpan.sizer_3.Fit(self.graphpan.panel_1)
+#                 self.graphpan.Layout()
+#                 self.graphpan.panel_1.Scroll(0,self.graphpan.panel_1.GetScrollRange(wx.VERTICAL))
 
     def export(self, evt) :
         nb = 1
 
     def export(self, evt) :
         nb = 1
@@ -1200,21 +1269,25 @@ class SimiLayout(DefaultTextLayout) :
         } else {
             V(graph)$weight <- graph.simi$label.cex
         }
         } else {
             V(graph)$weight <- graph.simi$label.cex
         }
-        V(graph)$color <- vertex.label.color
+        V(graph)$rcolor <- vertex.label.color
         V(graph)$frequences <- graph.simi$mat.eff
         V(graph)$label <- as.character(graph.simi$v.label)
         E(graph)$weight <- graph.simi$we.width
         write.graph(graph, fileout, format = 'graphml')
         #saveAsGEXF(graph, filepath = fileout)
         V(graph)$frequences <- graph.simi$mat.eff
         V(graph)$label <- as.character(graph.simi$v.label)
         E(graph)$weight <- graph.simi$we.width
         write.graph(graph, fileout, format = 'graphml')
         #saveAsGEXF(graph, filepath = fileout)
-        """ % (self.pathout['RData.RData'], self.parent.RscriptsPath['simi'], fileout)
+        """ % (ffr(self.pathout['RData.RData']), ffr(self.parent.RscriptsPath['simi']), fileout)
         filetmp = tempfile.mktemp()
         with open(filetmp, 'w') as f :
             f.write(txt)
         exec_rcode(self.ira.RPath, filetmp)
         filetmp = tempfile.mktemp()
         with open(filetmp, 'w') as f :
             f.write(txt)
         exec_rcode(self.ira.RPath, filetmp)
-        mss = wx.MessageDialog(self.ira, fileout, u'Fichier exporté', wx.OK)
+        mss = wx.MessageDialog(self.ira, fileout, _(u'File exported').decode('utf8'), wx.OK)
         mss.CenterOnParent()
         mss.ShowModal()
         mss.Destroy()
         mss.CenterOnParent()
         mss.ShowModal()
         mss.Destroy()
+    
+    def blender(self, evt):
+        blender(self)
+    
 
 class DefaultMatLayout :
     def __init__(self, parent, tableau, parametres) :
 
 class DefaultMatLayout :
     def __init__(self, parent, tableau, parametres) :
@@ -1235,10 +1308,12 @@ class DefaultMatLayout :
 class FreqLayout(DefaultMatLayout) :
     def dolayout(self) :
         self.tab = wx.html.HtmlWindow(self.ira.nb, -1)
 class FreqLayout(DefaultMatLayout) :
     def dolayout(self) :
         self.tab = wx.html.HtmlWindow(self.ira.nb, -1)
+        #self.tab = wx.html2.WebView.New(self)
         res = normpath_win32(self.pathout['resultats.html']).replace('\\','/')
         self.tab.LoadPage(res)
         res = normpath_win32(self.pathout['resultats.html']).replace('\\','/')
         self.tab.LoadPage(res)
+        #self.tab.LoadURL(res)
         self.tab.parametres = self.parametres
         self.tab.parametres = self.parametres
-        self.ira.nb.AddPage(self.tab, u"Fréquences")
+        self.ira.nb.AddPage(self.tab, ' - '.join([_(u"Frequency").decode('utf8'), self.parametres['name']]))
 
 
 class Chi2Layout(DefaultMatLayout) :
 
 
 class Chi2Layout(DefaultMatLayout) :
@@ -1249,14 +1324,14 @@ class Chi2Layout(DefaultMatLayout) :
         res = normpath_win32(self.pathout['resultats-chi2.html']).replace('\\','/')
         self.tab.LoadPage(res)
         self.tab.parametres = self.parametres
         res = normpath_win32(self.pathout['resultats-chi2.html']).replace('\\','/')
         self.tab.LoadPage(res)
         self.tab.parametres = self.parametres
-        self.ira.nb.AddPage(self.tab, ' - '.join([u"Chi2", "%s" % self.parametres['name']]))
+        self.ira.nb.AddPage(self.tab, ' - '.join([u"Chi2", self.parametres['name']]))
         #self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         #self.ira.ShowAPane("Tab_content")  
 
 
 class ProtoLayout(DefaultMatLayout) :
     def dolayout(self) :
         #self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         #self.ira.ShowAPane("Tab_content")  
 
 
 class ProtoLayout(DefaultMatLayout) :
     def dolayout(self) :
-        list_graph = [['proto.png', 'Analyse prototypique']]
+        list_graph = [['proto.png', _(u'Prototypical analysis').decode('utf8')]]
         #self.Tab = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
         #if self.parametres['svg'] :
         #    list_graph = [['nuage_1.svg', 'Nuage']]
         #self.Tab = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
         #if self.parametres['svg'] :
         #    list_graph = [['nuage_1.svg', 'Nuage']]
@@ -1266,7 +1341,7 @@ class ProtoLayout(DefaultMatLayout) :
         #self.Tab.AddPage(self.TabProto, 'Analyse Prototypique')
         #self.Tab.corpus = self.corpus
         self.TabProto.parametres = self.parametres
         #self.Tab.AddPage(self.TabProto, 'Analyse Prototypique')
         #self.Tab.corpus = self.corpus
         self.TabProto.parametres = self.parametres
-        self.ira.nb.AddPage(self.TabProto, 'Analyse Prototypique - %s' % self.parametres['name'])
+        self.ira.nb.AddPage(self.TabProto, ' - '.join([_(u'Prototypical analysis').decode('utf8'), self.parametres['name']]))
         #self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         #self.ira.ShowAPane("Tab_content")
 
         #self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
         #self.ira.ShowAPane("Tab_content")
 
@@ -1286,9 +1361,10 @@ class SimiMatLayout(DefaultMatLayout) :
         self.graphpan = GraphPanelSimi(self.tabsimi, self.pathout, list_graph)
         self.graphpan.Bind(wx.EVT_BUTTON, self.redosimi, self.graphpan.butafc)
         self.graphpan.Bind(wx.EVT_BUTTON, self.export, self.graphpan.butexport)
         self.graphpan = GraphPanelSimi(self.tabsimi, self.pathout, list_graph)
         self.graphpan.Bind(wx.EVT_BUTTON, self.redosimi, self.graphpan.butafc)
         self.graphpan.Bind(wx.EVT_BUTTON, self.export, self.graphpan.butexport)
+        self.graphpan.Bind(wx.EVT_BUTTON, self.blender, self.graphpan.butblender)
         self.tabsimi.AddPage(self.graphpan, 'Graph')
         self.tabsimi.parametres = self.parametres
         self.tabsimi.AddPage(self.graphpan, 'Graph')
         self.tabsimi.parametres = self.parametres
-        self.parent.nb.AddPage(self.tabsimi, 'Analyse de graph')
+        self.parent.nb.AddPage(self.tabsimi, ' - '.join([_(u'Graph analysis').decode('utf8'), self.parametres['name']]))
         #self.parent.ShowTab(True)
         #self.parent.nb.SetSelection(self.parent.nb.GetPageCount() - 1)
 
         #self.parent.ShowTab(True)
         #self.parent.nb.SetSelection(self.parent.nb.GetPageCount() - 1)
 
@@ -1449,15 +1525,18 @@ class SimiMatLayout(DefaultMatLayout) :
         E(graph)$weight <- graph.simi$we.width
         write.graph(graph, fileout, format = 'graphml')
         #saveAsGEXF(graph, filepath = fileout)
         E(graph)$weight <- graph.simi$we.width
         write.graph(graph, fileout, format = 'graphml')
         #saveAsGEXF(graph, filepath = fileout)
-        """ % (self.pathout['RData.RData'], self.parent.RscriptsPath['simi'], fileout)
+        """ % (ffr(self.pathout['RData.RData']), ffr(self.parent.RscriptsPath['simi']), fileout)
         filetmp = tempfile.mktemp()
         with open(filetmp, 'w') as f :
             f.write(txt)
         exec_rcode(self.ira.RPath, filetmp)
         filetmp = tempfile.mktemp()
         with open(filetmp, 'w') as f :
             f.write(txt)
         exec_rcode(self.ira.RPath, filetmp)
-        mss = wx.MessageDialog(self.ira, fileout, u'Fichier exporté', wx.OK)
+        mss = wx.MessageDialog(self.ira, fileout, _(u'File exported').decode('utf8'), wx.OK)
         mss.CenterOnParent()
         mss.ShowModal()
         mss.Destroy()
         mss.CenterOnParent()
         mss.ShowModal()
         mss.Destroy()
+    
+    def blender(self, evt):
+        blender(self)
 
         
 class GraphPanelSimi(wx.Panel):
 
         
 class GraphPanelSimi(wx.Panel):
@@ -1477,6 +1556,10 @@ class GraphPanelSimi(wx.Panel):
         self.butafc = wx.BitmapButton(self, -1, afc_img)
         export_img = wx.Image(os.path.join(self.ira.images_path,'button_export.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         self.butexport = wx.BitmapButton(self, -1, export_img)
         self.butafc = wx.BitmapButton(self, -1, afc_img)
         export_img = wx.Image(os.path.join(self.ira.images_path,'button_export.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         self.butexport = wx.BitmapButton(self, -1, export_img)
+        blender_img = wx.Image(os.path.join(self.ira.images_path,'button_blender.png'), wx.BITMAP_TYPE_ANY)
+        blender_img.Rescale(32,32)
+        blender_img = blender_img.ConvertToBitmap()
+        self.butblender = wx.BitmapButton(self, -1, blender_img)
         for i in range(0,len(list_graph)):
             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
                 filename, ext = os.path.splitext(list_graph[i][0])
         for i in range(0,len(list_graph)):
             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
                 filename, ext = os.path.splitext(list_graph[i][0])
@@ -1501,6 +1584,7 @@ class GraphPanelSimi(wx.Panel):
         self.sizer_3 = wx.BoxSizer(wx.VERTICAL)
         self.sizer_2.Add(self.butafc, 0, 0, 0)
         self.sizer_2.Add(self.butexport, 0, 0, 0)
         self.sizer_3 = wx.BoxSizer(wx.VERTICAL)
         self.sizer_2.Add(self.butafc, 0, 0, 0)
         self.sizer_2.Add(self.butexport, 0, 0, 0)
+        self.sizer_2.Add(self.butblender, 0, 0, 0)
         for i in range(0, len(self.listimg)):
             self.sizer_3.Add(self.listimg[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
             self.sizer_3.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
         for i in range(0, len(self.listimg)):
             self.sizer_3.Add(self.listimg[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
             self.sizer_3.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)