lot of things :)
[iramuteq] / iramuteq.py
index aad2ebd..d1b6077 100644 (file)
@@ -28,8 +28,10 @@ import logging
 #------------------------------------
 import wx
 #import wx.aui
-import wx.lib.agw.aui as aui
-#import agw.aui as aui
+if wx.__version__ >= '2.11' :
+    import wx.lib.agw.aui as aui
+else :
+    import aui
 import wx.html
 import wx.grid
 import wx.lib.hyperlink as hl
@@ -47,22 +49,21 @@ from tabafcm import DoAFCM
 from tabchdalc import AnalyseQuest
 from tabsimi import DoSimi
 from tabrsimple import InputText
-from tabverges import Verges
+from tabverges import Prototypical
 #from textafcuci import AfcUci
-#from textchdalc import AnalyseAlceste
 from analysetxt import Alceste
-from textdist import PamTxt
+from textdist import AnalysePam
 from textstat import Stat
 from textaslexico import Lexico
 from textsimi import SimiTxt, SimiFromCluster
-from textwordcloud import WordCloud
+from textwordcloud import WordCloud, ClusterCloud
 from profile_segment import ProfileSegment
-from textcheckcorpus import checkcorpus
+#from textcheckcorpus import checkcorpus
 from openanalyse import OpenAnalyse
 from corpus import BuildFromAlceste, Builder
 from sheet import MySheet
 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
-from chemins import ConstructRscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
+from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
 from parse_factiva_xml import ImportFactiva
 from tools import Extract
 
@@ -94,15 +95,17 @@ ID_RESULT = wx.NewId()
 ID_VIEWDATA = wx.NewId()
 ID_HTMLcontent = wx.NewId()
 ID_SimiTxt = wx.NewId()
+ID_proto = wx.NewId()
 ##########################################################
 #elements de configuration
 ##########################################################
 #encodage
 if sys.platform == 'darwin' :
-    sys.setdefaultencoding('utf-8')
-    wx.SetDefaultPyEncoding('utf-8')
+    sys.setdefaultencoding('UTF-8')
+    wx.SetDefaultPyEncoding('UTF-8')
 else :
     sys.setdefaultencoding(locale.getpreferredencoding())
+
 #chemin de l'application
 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
 #chemin des images
@@ -122,21 +125,32 @@ CreateIraDirectory(UserConfigPath, AppliPath)
 #fichiers log pour windows (py2exe)
 log = logging.getLogger('iramuteq')
 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
-ch = logging.StreamHandler()
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
-ch.setFormatter(formatter)
 fh.setFormatter(formatter)
-log.addHandler(ch)
 log.addHandler(fh)
+if sys.platform != 'win32' and sys.platform != 'darwin':
+    ch = logging.StreamHandler()
+    ch.setFormatter(formatter)
+    log.addHandler(ch)
 log.setLevel(logging.INFO)
 
-
 class writer(object):
     def write(self, data):
         if data.strip() != '' :
-            log.info('BUG : %s' % data)
+            log.info('ERROR : %s' % data)
+
+class printer(object) :
+    def write(self, data) :
+        if data.strip() != '' :
+            log.info('Print : %s' % data)
+
 sys.stderr = writer()
+sys.stdout = printer()
+
 ConfigPath = ConstructConfigPath(UserConfigPath)
+
+langues = {'french' : wx.LANGUAGE_FRENCH,
+            'english' : wx.LANGUAGE_ENGLISH,}
 #####################################################################
 
 class IraFrame(wx.Frame):
@@ -150,7 +164,9 @@ class IraFrame(wx.Frame):
         self.AppliPath = AppliPath
         self.images_path = os.path.join(AppliPath,'images')
         self.UserConfigPath = UserConfigPath
-        self.RscriptsPath = ConstructRscriptsPath(AppliPath)
+        #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
+        self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
+        self.RscriptsPath.basefiles(RscriptsPath)
         #self.DictPath = ConstructDicoPath(AppliPath)
         self.DictPath = ConstructDicoPath(UserConfigPath)
         self.ConfigGlob = ConfigGlob
@@ -159,14 +175,10 @@ class IraFrame(wx.Frame):
         #workaround for import problem
         self.SimiFromCluster = SimiFromCluster
         #langues
-        mylocale = wx.Locale(wx.LANGUAGE_FRENCH)
-        mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
-        mylocale.AddCatalog('iramuteq')
-        presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
-        presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
-        presLan_fr.install()
-
-
+        gettext.install('iramuteq',  os.path.join(AppliPath,'locale'), unicode=True)
+        self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
+        self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
+        self.setlangue()
         # tell FrameManager to manage this frame        
         #self._mgr = wx.aui.AuiManager()
         self._mgr = aui.AuiManager()
@@ -177,31 +189,31 @@ class IraFrame(wx.Frame):
         self.mb = wx.MenuBar()
 
         file_menu = wx.Menu()
-        item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix"), _(u"Open a matrix"))
+        item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora"), _(u"Open a text corpora"))
+        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora").decode('utf8'), _(u"Open a text corpora").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis"), _("Open an analysis"))
+        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
 
         
         menuFactiva = wx.Menu()
-        fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml"))
-        fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail"))
-        fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste"))
+        fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
+        fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
+        fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
         menuFactiva.AppendItem(fact_from_xml)
         menuFactiva.AppendItem(fact_from_mail)
         menuFactiva.AppendItem(fact_from_txt)
         file_menu.AppendMenu(-1, _(u"Import from factiva"), menuFactiva)
 
         menuTools = wx.Menu()
-        splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable"))
-        extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods"))
+        splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
+        extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
         menuTools.AppendItem(splitvar)
         menuTools.AppendItem(extractmod)
         self.ID_splitvar = splitvar.GetId()
@@ -209,19 +221,19 @@ class IraFrame(wx.Frame):
         file_menu.AppendMenu(-1, _(u"Tools"), menuTools)
 
                
-        item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as..."), _(u"Save tab as..."))
+        item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
         file_menu.AppendItem(item)
         
         file_menu.Append(wx.ID_EXIT, _(u"Exit"))
         
         edit_menu = wx.Menu()
-        edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences'))
+        edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
         
         view_menu = wx.Menu()
-        view_menu.Append(ID_ACCEUIL, _(u"Home page"))
-        view_menu.Append(ID_VIEWDATA, _(u"Show data"))
-        view_menu.Append(ID_RESULT, _(u'Show results'))
+        view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
+        view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
+        view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
         #view_menu.AppendSeparator()
 
         analyse_menu = wx.Menu()
@@ -229,22 +241,23 @@ class IraFrame(wx.Frame):
         analyse_menu.Append(ID_Chi2, u"Chi2")
         #analyse_menu.Append(ID_Student, u"t de Student")
         menu_classif = wx.Menu()
-        menu_classif.Append(ID_CHDAlceste, u"Méthode Alceste")
-        menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
+        menu_classif.Append(ID_CHDAlceste, u"Méthode GNEPA")
+        #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
         analyse_menu.AppendMenu(-1, u"Classification", menu_classif)
-        analyse_menu.Append(ID_AFCM, u"AFCM")
+        #analyse_menu.Append(ID_AFCM, u"AFCM")
         analyse_menu.Append(ID_SIMI, u"Analyse de similitudes")
+        analyse_menu.Append(ID_proto, _(u"Prototypical analysis"))
         ID_RCODE = wx.NewId()
         analyse_menu.Append(ID_RCODE, u"Code R...")
 
         text_menu = wx.Menu()
-        text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
+        #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
         text_menu.Append(ID_TEXTSTAT, u"Statistiques textuelles")
         text_menu.Append(ID_ASLEX, u"Spécificités et AFC")
         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
         menu_classiftxt = wx.Menu()
-        menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode Alceste")
-        menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
+        menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode GNEPA")
+        #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
         text_menu.AppendMenu(-1, u"Classification", menu_classiftxt)
         text_menu.Append(ID_SimiTxt, u'Analyse de similitude') 
         ID_WC = wx.NewId()
@@ -254,12 +267,12 @@ class IraFrame(wx.Frame):
         help_menu.Append(wx.ID_ABOUT, u'À propos...')
         help_menu.Append(wx.ID_HELP, u'Aide en ligne')
         
-        self.mb.Append(file_menu, _(u"File"))
-        self.mb.Append(edit_menu, _(u"Edition"))
-        self.mb.Append(view_menu, _(u"View"))
-        self.mb.Append(analyse_menu, _("Spreadsheet analysis"))
-        self.mb.Append(text_menu, _(u"Text analysis"))
-        self.mb.Append(help_menu, _(u"Help"))
+        self.mb.Append(file_menu, _(u"File").decode('utf8'))
+        self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
+        self.mb.Append(view_menu, _(u"View").decode('utf8'))
+        self.mb.Append(analyse_menu, _("Spreadsheet analysis").decode('utf8'))
+        self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
+        self.mb.Append(help_menu, _(u"Help").decode('utf8'))
         
         self.SetMenuBar(self.mb)
 #--------------------------------------------------------------------
@@ -359,8 +372,9 @@ class IraFrame(wx.Frame):
         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
         self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste)
         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
+        self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
         self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
-        self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
+        #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
@@ -411,10 +425,27 @@ class IraFrame(wx.Frame):
         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
         self.type = ''
 
+##############################################################@
+        self.DisEnSaveTabAs(False)
+        self.ShowMenu(_("View"), False)
+        self.ShowMenu(_("Spreadsheet analysis"), False)
+        self.ShowMenu(_("Text analysis"), False)
+   
+        self._mgr.Update()
+
+        self.DataPop = False
+        self.DataTxt = False
+        self.Text = ''
+
+        self.lexique = None
+        self.corpus = None
+
+    def finish_init(self) :
         try :
             self.pref.read(self.ConfigPath['preferences'])
             if IsNew(self) :
                 UpgradeConf(self)
+                self.pref.read(self.ConfigPath['preferences'])
                 New = True
             else :
                 CopyConf(self)
@@ -423,6 +454,9 @@ class IraFrame(wx.Frame):
             UpgradeConf(self)
             self.pref.read(self.ConfigPath['preferences'])
             New = True
+        self.sound = self.pref.getboolean('iramuteq', 'sound')
+        self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
+        self.version = ConfigGlob.get('DEFAULT', 'version')
         #configuration des chemins de R
         self.PathPath = ConfigParser()
         self.PathPath.read(ConfigPath['path'])
@@ -456,31 +490,34 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
                  evt.Veto()
             dlg.Destroy()
-        self.DataPop = False
-        self.DataTxt = False
-        self.Text = ''
-        self.sound = self.pref.getboolean('iramuteq', 'sound')
-        self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
-        self.version = ConfigGlob.get('DEFAULT', 'version')
-        self.lexique = None
-        self.corpus = None
-##############################################################@
-        self.DisEnSaveTabAs(False)
-        self.ShowMenu(_("View"), False)
-        self.ShowMenu(_("Spreadsheet analysis"), False)
-        self.ShowMenu(_("Text analysis"), False)
-   
-        self._mgr.Update()
+
+
+    def setlangue(self) :
+        try :
+            self.pref.read(self.ConfigPath['preferences'])
+            guilangue = self.pref.get('iramuteq', 'guilanguage')
+            if guilangue == 'french' :
+                self.presLan_fr.install()
+            else :
+                self.presLan_en.install()
+            mylocale = wx.Locale(langues[guilangue])
+            mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
+            mylocale.AddCatalog('iramuteq')
+        except :
+            self.presLan_fr.install()
+            mylocale = wx.Locale(langues['french'])
+            mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
+            mylocale.AddCatalog('iramuteq')
+
 
     def OnVerif(self, evt) :
         pack = CheckRPackages(self)
         if pack :
-            dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
+            dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
                  evt.Veto()
 
-    #FIXME  marche pas sous mac ?
     def DisEnSaveTabAs(self, DISEN):
     #Disable SaveTabAs
         file_menu = self.mb.GetMenu(0)
@@ -676,7 +713,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
         parent = nobject.GetParent()
         if isinstance(parent, IraFrame) :
             npage = self.nb.GetPage(new)
-            self.tree.GiveFocus(uuid=npage.parametres['uuid'])
+            if 'parametres' in dir(npage) :
+                self.tree.GiveFocus(uuid=npage.parametres['uuid'])
 
     def OnCloseTab(self, evt):
         #log.info('Closing tab %s' % str(evt.GetEventObject()))
@@ -840,6 +878,9 @@ Voulez-vous fermer quand même ?"""
                 PlaySound(self)
         except:
             BugReport(self)
+    
+    def OnProto(self, evt) :
+        Prototypical(self, {'type' : 'proto'})
 
     def OnSimiTxt(self, evt, corpus = None) :
         #    print 'PLUS DE BUG SUR SIMITXT'
@@ -864,6 +905,8 @@ Voulez-vous fermer quand même ?"""
         except :
             BugReport(self)
 
+    def OnClusterCloud(self, corpus, parametres = None) :
+        self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = progressbar(self, 3))
 
     def OnAFCM(self, event):
         try:
@@ -871,35 +914,35 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
-    def OnCheckcorpus(self, evt):
-        try :
-            checkcorpus(self)
-        except :
-            BugReport(self)
+#    def OnCheckcorpus(self, evt):
+#        try :
+#            checkcorpus(self)
+#        except :
+#            BugReport(self)
 
     def OnTextStat(self, event, corpus = None):
-            print 'PAS DE BUG SUR TEXT STAT'
-        #try:
+            #print 'PAS DE BUG SUR TEXT STAT'
+        try:
             if corpus is None :
                 corpus = self.tree.getcorpus()
             self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
             
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
+        except:
+            BugReport(self)
         
     def OnTextSpec(self, event, corpus = None):  
-        #try:
+        try:
             #self.Text = AsLexico(self)
-            print('ATTENTION : PLUS DE BUG SUR LEXICO')
+            #print('ATTENTION : PLUS DE BUG SUR LEXICO')
             if corpus is None :
                 corpus = self.tree.getcorpus()
             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
+        except:
+            BugReport(self)
     
     def OnTextAfcm(self, event):
         try:
@@ -945,17 +988,23 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
-    def OnPamSimple(self, event):
+    def OnPamSimple(self, event, corpus = None):
         try:
-            self.Text = PamTxt(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
+
+    def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
+        DoSimi(self, param = parametres, fromprof =  fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau)
     
     def OnSimi(self,evt):
         try :
             #print 'ATTENTION !!!! VERGES'
+            #print 'PLUS DE BUG SUR SIMI'
             self.res = DoSimi(self, param = None)
             #self.res = Verges(self)
             if self.res.val == wx.ID_OK :
@@ -1137,6 +1186,7 @@ class MySplashScreen(wx.SplashScreen):
     def ShowMain(self):
         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
         frame.Show()
+        frame.finish_init()
         frame.Upgrade()
         frame.OnOpenFromCmdl()
 #        if self.fc.IsRunning():