3f9dfe0878b07729879c24aba6f287ed56770ef4
[iramuteq] / layout.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2008-2009 Pierre Ratinaud
5 #Lisense: GNU/GPL
6
7 import os
8 import wx
9 #import wx.lib.agw.aui as aui
10 import agw.aui as aui
11 from chemins import ConstructPathOut, ChdTxtPathOut, FFF, ffr, PathOut, StatTxtPathOut, simipath
12 from ConfigParser import ConfigParser
13 from functions import ReadProfileAsDico, GetTxtProfile, read_list_file, ReadList, exec_rcode, print_liste, BugReport, DoConf, indices_simi
14 from ProfList import *
15 from guiparam3d import param3d, simi3d
16 from PrintRScript import write_afc_graph, print_simi3d, PrintSimiScript
17 from profile_segment import *
18 from functions import ReadList
19 from listlex import *
20 from Liste import *
21 from search_tools import SearchFrame
22 from dialog import PrefGraph, PrefExport, PrefSimpleFile, PrefDendro
23 from guifunct import SelectColumn, PrepSimi
24 from corpusNG import Corpus
25 import datetime
26 import sys
27 import tempfile
28 import shutil
29 import webbrowser
30 import codecs
31 import logging
32
33 log = logging.getLogger('iramuteq.layout')
34
35
36 class GraphPanelAfc(wx.Panel):
37     def __init__(self, parent, dico, list_graph, clnb, itempath = 'liste_graph_afc', coding = sys.getdefaultencoding()):
38         wx.Panel.__init__(self,parent)
39         self.afcnb = 1
40         self.clnb = clnb
41         self.Dict = dico
42         self.coding = coding
43         self.itempath = itempath
44         self.parent = self.GetParent()#parent
45         self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
46         self.labels = []
47         self.listimg = []
48         self.buts = []
49         self.list_graph = list_graph
50         self.TabCHD = self.parent.GetParent()
51         self.nb = self.TabCHD.GetParent()
52         self.ira = self.nb.GetParent()
53         self.panel_1 = wx.ScrolledWindow(self, -1, style=wx.TAB_TRAVERSAL)
54         afc_img = wx.Image(os.path.join(self.ira.images_path,'button_afc.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
55         self.butafc = wx.BitmapButton(self, -1, afc_img)
56         self.Bind(wx.EVT_BUTTON, self.afc_graph, self.butafc)
57         self.dirout = os.path.dirname(self.Dict['ira'])
58         b = 0
59         for i in range(0,len(list_graph)):
60             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
61                 self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
62                 self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1]))
63                 self.buts.append(wx.Button(self.panel_1, wx.ID_DELETE, name = `i - b`))
64             else :
65                 self.list_graph.pop(i)
66                 b += 1
67                 
68         self.param = { 'typegraph' : 0, 
69               'width' : 800,
70               'height' : 800,
71               'what' : 0,
72               'qui' : 0,
73               'do_select_nb' : 0,
74               'do_select_chi' : 0,
75               'do_select_chi_classe' : 0,
76               'select_nb' : 50,
77               'select_chi' : 4,
78               'nbchic' : 30,
79               'over' : 0, 
80               'cex_txt' : 0,
81               'txt_min' : 5,
82               'txt_max' : 40,
83               'tchi' : 0,
84               'tchi_min' : 5,
85               'tchi_max' : 40,
86               'taillecar' : 9,
87               'facteur' : [1,2,3],
88               'alpha' : 10,
89               'clnb' : clnb,
90             }
91
92         self.__set_properties()
93         self.__do_layout()
94
95     def __set_properties(self):
96         self.panel_1.EnableScrolling(True,True)
97         #self.panel_1.SetSize((1000,1000))
98         self.panel_1.SetScrollRate(20, 20)
99
100     def __do_layout(self):    
101         log.info('do layout')
102         self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
103         self.sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
104         self.sizer_3 = wx.BoxSizer(wx.VERTICAL)
105         self.sizer_2.Add(self.butafc, 0, 0, 0)
106         for i in range(0, len(self.listimg)):
107             self.sizer_3.Add(self.listimg[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
108             self.sizer_3.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
109             self.sizer_3.Add(self.buts[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
110             self.Bind(wx.EVT_BUTTON, self.on_delete_image, self.buts[i])
111         self.panel_1.SetSizer(self.sizer_3)
112         self.sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
113         self.SetSizer(self.sizer_2) 
114
115     def on_delete_image(self, event) :
116         image_id = int(event.GetEventObject().GetName())
117         image_path = self.list_graph[image_id][0]
118         message = 'This file will be delete : %s.\nAre you sure ?' % os.path.join(self.dirout, image_path)
119         dial = wx.MessageDialog(self, message, style = wx.YES_NO)
120         res = dial.ShowModal()
121         if res == wx.ID_YES :
122             dial.Destroy()
123             log.info('delete image %i' % image_id)
124             oldimg = self.listimg.pop(image_id)
125             oldimg.Destroy()
126             oldlab = self.labels.pop(image_id)
127             oldlab.Destroy()
128             No = [but.Destroy() for but in self.buts]
129             self.buts = [wx.Button(self.panel_1, wx.ID_DELETE, name = `i`) for i, img in enumerate(self.listimg)]
130             todel = self.list_graph.pop(image_id)
131             os.remove(os.path.join(self.dirout, todel[0]))
132             print_liste(self.Dict[self.itempath], self.list_graph)
133             self.__do_layout()
134             self.sizer_3.Fit(self.panel_1)
135             self.Layout()
136         else :
137             dial.Destroy()
138         
139
140     def afc_graph(self,event):
141         #dirout = os.path.dirname(self.Dict['ira'])
142         while os.path.exists(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+'.png')):
143             self.afcnb +=1
144         self.fileout = ffr(os.path.join(self.dirout,'graph_afc_'+str(self.afcnb)+'.png'))
145         dial = PrefGraph(self.parent,-1,self.param,'')
146         dial.CenterOnParent()
147         val = dial.ShowModal()
148         if val == wx.ID_OK :
149             self.param = {'typegraph' : dial.choicetype.GetSelection(),
150                           'width' : dial.spin1.GetValue(),
151                           'height' : dial.spin2.GetValue(),
152                           'what' : dial.choice1.GetSelection(),
153                           'qui' : dial.choice2.GetSelection(),
154                           'do_select_nb' : dial.check1.GetValue(),
155                           'do_select_chi' : dial.check2.GetValue(),
156                           'do_select_chi_classe' : dial.check_chic.GetValue(),
157                           'select_nb' : dial.spin_nb.GetValue(),
158                           'select_chi' : dial.spin_chi.GetValue(),
159                           'nbchic' : dial.spin_nbchic.GetValue(),
160                           'over' : dial.check3.GetValue(), 
161                           'cex_txt' : dial.check4.GetValue(),
162                           'txt_min' : dial.spin_min.GetValue(),
163                           'txt_max' : dial.spin_max.GetValue(),
164                           'tchi' : dial.check_tchi.GetValue(),
165                           'tchi_min' : dial.spin_min_tchi.GetValue(),
166                           'tchi_max' : dial.spin_max_tchi.GetValue(),
167                           'taillecar' : dial.spin3.GetValue(),
168                           'facteur' : [dial.spin_f1.GetValue(),dial.spin_f2.GetValue(), dial.spin_f3.GetValue()],
169                           'clnb' : self.clnb,
170                           'film' : str(dial.film.GetValue()).upper(),
171                           'alpha' : dial.slider_sphere.GetValue()
172                         }
173             self.nb.parent = self.ira
174             self.DictPathOut = self.Dict
175             self.RscriptsPath = self.ira.RscriptsPath
176             txt = """
177             load("%s")
178             """ % self.DictPathOut['RData']
179             if self.itempath == 'liste_graph_afcf' :
180                 txt += """
181                 afc <- afcf
182                 afc_table <- afcf_table
183                 chistabletot <- specfp
184                 infp <- which(is.infinite(chistabletot) & chistabletot > 0)
185                 infm <- which(is.infinite(chistabletot) & chistabletot < 0)
186                 chistabletot[infp] <- 0
187                 chistabletot[infm] <- 0
188                 chistabletot[infp] <- max(chistabletot) + 1
189                 chistabletot[infm] <- min(chistabletot) - 1
190                 """ 
191             elif self.itempath == 'liste_graph_afct' :
192                 txt +="""
193                 afc <- afct
194                 afc_table <- afct_table
195                 chistabletot <- spectp
196                 """
197             txt += write_afc_graph(self)
198             filetmp = tempfile.mktemp()
199             file = open(filetmp,'w')
200             file.write(txt)
201             file.close()
202             pid = exec_rcode(self.ira.RPath, filetmp)
203             check_Rresult(self.ira, pid)
204             if self.param['typegraph'] == 0 :
205                 txt = 'Variables '
206                 if self.param['qui'] == 0 : value = u'actives'
207                 if self.param['qui'] == 1 : value = u'supplémentaires'
208                 if self.param['qui'] == 2 : value = u'étoilées'
209                 if self.param['qui'] == 3 : value = u'classes'
210                 txt += value + ' - '
211                 if self.param['what'] == 0 : value = u'Coordonnées'
212                 if self.param['what'] == 1 : value = u'Corrélations'
213                 txt += value + u' - facteur %i / %i' % (self.param['facteur'][0], self.param['facteur'][1])
214                 if self.param['do_select_nb'] : txt += u' - sélection de %i variables' % self.param['select_nb']
215                 if self.param['do_select_chi'] : txt += u' - sélection des variables avec chi2 > %i ' % self.param['select_chi']
216                 if self.param['over'] : txt += u' - Eviter les recouvrements'
217                 if self.param['cex_txt'] : txt += u' - taille du texte proportionnel à la masse'
218                 if self.param['tchi'] : txt += u' - taille du texte proportionnel au chi2 d\'association'
219                 #list_graph = read_list_file(self.DictPathOut[self.itempath], self.coding)
220                 self.list_graph.append([self.fileout, txt])
221                 print_liste(self.DictPathOut[self.itempath], self.list_graph)
222                 self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(self.fileout, wx.BITMAP_TYPE_ANY)))
223                 self.sizer_3.Add( self.listimg[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
224                 self.labels.append(wx.StaticText(self.panel_1,-1, txt))
225                 self.sizer_3.Add(self.labels[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
226                 self.buts.append(wx.Button(self.panel_1, wx.ID_DELETE, name = `len(self.list_graph) - 1`))
227                 self.sizer_3.Add(self.buts[-1], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
228                 self.sizer_3.Fit(self.panel_1)
229                 self.Layout()
230     
231                 self.panel_1.Scroll(0,self.panel_1.GetScrollRange(wx.VERTICAL))
232             
233
234 class GraphPanel(wx.ScrolledWindow):
235     def __init__(self, parent, dico, list_graph, txt = '', style = wx.TAB_TRAVERSAL):
236         wx.ScrolledWindow.__init__(self, parent, style = style)
237         self.Dict = dico
238         self.txt = txt
239         self.parent = parent
240         self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
241         self.labels = []
242         self.listimg = []
243         self.dirout = os.path.dirname(self.Dict['ira'])
244         self.deb = wx.StaticText(self, -1, txt)
245         for i in range(0,len(list_graph)):
246             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
247                 self.listimg.append(wx.StaticBitmap(self, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
248                 self.labels.append(wx.StaticText(self, -1, list_graph[i][1]))
249                 
250         self.__set_properties()
251         self.__do_layout()
252
253     def __set_properties(self):
254         self.SetScrollRate(20, 20)   
255
256     def __do_layout(self):
257         self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
258         self.sizer_2 = wx.BoxSizer(wx.VERTICAL)
259         self.sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
260         self.sizer_1.Add(self.deb)   
261         for i in range(0, len(self.listimg)):
262             self.sizer_1.Add(self.listimg[i], 1, wx.ALIGN_CENTER_HORIZONTAL, 0)
263             self.sizer_1.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
264         self.sizer_2.Add(self.sizer_1, 1, wx.EXPAND, 0)
265         self.SetSizer(self.sizer_1)
266         self.sizer_1.Fit(self)
267         
268 class OpenCHDS():
269     def __init__(self, parent, corpus, parametres, Alceste=False):
270        #sep = u'\n ' 
271        sep=' '
272        self.parent = parent
273        self.corpus = corpus
274        self.parametres = parametres
275        self.pathout = PathOut(parametres['ira'])
276        self.pathout.basefiles(ChdTxtPathOut)
277        DictPathOut = self.pathout 
278        self.DictPathOut = DictPathOut
279        self.dictpathout = DictPathOut
280        self.parent = parent
281
282        Profile = DictPathOut['PROFILE_OUT']
283        AntiProfile = DictPathOut['ANTIPRO_OUT']
284        if isinstance(self.corpus, Corpus) :
285             self.encoding = self.corpus.parametres['syscoding']
286             self.corpus.make_ucecl_from_R(self.pathout['uce'])
287        elif 'tableau' in dir(gparent) :
288             self.encoding = gparent.tableau.parametres['syscoding']
289
290        #AnalyseConf = ConfigParser()
291        #AnalyseConf.readfp(codecs.open(filename,'r', self.encoding))
292        #AnalyseConf.read(filename)
293        #if 'analyse' in AnalyseConf.sections() :
294        #    section = 'analyse'
295        #elif 'questionnaire' in AnalyseConf.sections() :
296        #    section = 'questionnaire'
297        #elif 'chd_dist_quest' in AnalyseConf.sections() :
298        #    section = 'chd_dist_quest'
299        #self.section = section
300        #clnb = AnalyseConf.get(section, 'clusternb')
301        #clnb = int(clnb)
302        clnb = parametres['clnb']
303        dlg = progressbar(self, maxi = 4 + clnb) 
304        self.clnb = clnb 
305        corpname = self.corpus.parametres['corpus_name']
306        print 'lecture des profils'
307        dlg.Update(2, u'lecture des profils')
308  
309        DictProfile = ReadProfileAsDico(self, Profile, Alceste, self.encoding)
310        self.DictProfile = DictProfile
311        #print 'lecture des antiprofils'
312        #DictAnti = ReadProfileAsDico(self, AntiProfile, Alceste, self.encoding)
313
314        panel = wx.Panel(parent, -1)
315        sizer1 = wx.BoxSizer(wx.VERTICAL)
316
317        panel.chd_toolbar = wx.ToolBar(panel, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER)
318        panel.chd_toolbar.SetToolBitmapSize(wx.Size(16, 16))
319
320        if isinstance(self.corpus, Corpus) :
321            panel.corpus = self.corpus
322            self.ID_sg = wx.NewId()
323            butsg = wx.Button(panel.chd_toolbar, self.ID_sg, u"Profils des segments répétés ")
324            panel.chd_toolbar.AddControl(butsg)
325            panel.chd_toolbar.AddSeparator()
326            self.ID_export = wx.NewId() 
327            butexp = wx.Button(panel.chd_toolbar, self.ID_export, u"Exporter le corpus ")
328            panel.chd_toolbar.AddControl(butexp)
329            panel.chd_toolbar.AddSeparator()
330            self.ID_colored = wx.NewId()
331            butcol = wx.Button(panel.chd_toolbar, self.ID_colored, u"Corpus en couleur ")
332            panel.chd_toolbar.AddControl(butcol)
333            panel.chd_toolbar.AddSeparator()
334            self.ID_searchf = wx.NewId()
335            butsearchf = wx.Button(panel.chd_toolbar, self.ID_searchf, u"Outil de navigation ")
336            panel.chd_toolbar.AddControl(butsearchf)
337            panel.chd_toolbar.AddSeparator()
338
339            self.ID_proftype =wx.NewId()
340            butpt = wx.Button(panel.chd_toolbar, self.ID_proftype, u"Profils des types ")
341            panel.chd_toolbar.AddControl(butpt)
342            panel.chd_toolbar.AddSeparator()
343
344            self.ID_clusterstat =wx.NewId()
345            butclusterstat = wx.Button(panel.chd_toolbar, self.ID_clusterstat, u"Stat par classe ")
346            panel.chd_toolbar.AddControl(butclusterstat)
347            panel.chd_toolbar.AddSeparator()
348
349
350        self.ID_rapport = wx.NewId()
351        #rap_img = wx.Image(os.path.join(self.parent.images_path,'icone_rap_16.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
352        #panel.chd_toolbar.AddLabelTool(self.ID_rapport, "rapport", rap_img, shortHelp=u"Produire le rapport", longHelp=u"Exporter un rapport en texte simple")
353        butrap = wx.Button(panel.chd_toolbar, self.ID_rapport, u"Rapport ")
354        panel.chd_toolbar.AddControl(butrap)
355        
356        panel.chd_toolbar.Realize()
357        sizer1.Add(panel.chd_toolbar,0, wx.EXPAND, 5)
358
359        #self.TabChdSim = wx.aui.AuiNotebook(self.parent.nb, -1, wx.DefaultPosition)
360        notebook_flags =  aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER
361        panel.TabChdSim = aui.AuiNotebook(panel, -1, wx.DefaultPosition)
362        panel.TabChdSim.SetAGWWindowStyleFlag(notebook_flags)
363        panel.TabChdSim.SetArtProvider(aui.ChromeTabArt())
364        sizer1.Add(panel.TabChdSim,10, wx.EXPAND, 5)
365        panel.SetSizer(sizer1)
366        sizer1.Fit(panel)
367        
368
369        if isinstance(self.corpus, Corpus) :
370            panel.TabChdSim.corpus = corpus
371            panel.TabChdSim.corpus.dictpathout = self.DictPathOut
372            panel.parametres = self.parametres
373
374        self.notenb = self.parent.nb.GetPageCount()
375        if os.path.exists(DictPathOut['pre_rapport']):
376            #self.tabRap = wx.TextCtrl(self.TabChdSim, -1, "", style=wx.TE_MULTILINE | wx.TE_RICH2)
377            #self.tabRap.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
378            with codecs.open(DictPathOut['pre_rapport'], 'r', self.encoding) as f :
379                 txt = f.read()
380            #self.tabRap.write(txt)
381            #self.tabRap.ShowPosition(0)
382            self.debtext = txt
383        else :
384            self.debtext = ''
385            
386        if os.path.exists(self.DictPathOut['liste_graph_chd']) :
387            list_graph = read_list_file(self.DictPathOut['liste_graph_chd'], self.encoding)
388            CHD = GraphPanelDendro(panel.TabChdSim, DictPathOut, list_graph, txt = self.debtext)
389            panel.TabChdSim.AddPage(CHD,'CHD')
390                
391        panel.ProfNB = aui.AuiNotebook(panel, -1, wx.DefaultPosition)
392        panel.ProfNB.SetArtProvider(aui.ChromeTabArt())
393        #self.ProfNB.SetTabCtrlHeight(100)
394        #panel.AntiProfNB = aui.AuiNotebook(panel, -1, wx.DefaultPosition)
395        if os.path.exists(DictPathOut['prof_seg']) :
396             prof_seg = ReadProfileAsDico(self, DictPathOut['prof_seg'], False, self.encoding)
397             self.prof_seg_nb = aui.AuiNotebook(panel, -1, wx.DefaultPosition)
398        for i in range(0, clnb):
399             dlg.Update(3+i, 'Classe %i' %(i+1))
400             ind = '/'.join(DictProfile[str(i + 1)][0][0:2])
401             indpour = ' - '.join([ind, DictProfile[str(i + 1)][0][2]])
402             self.tabprofile = ProfListctrlPanel(self.parent, self, DictProfile[str(i + 1)], Alceste, i + 1)
403             #self.tabantiprofile = ProfListctrlPanel(self.parent, self, DictAnti[str(i + 1)], Alceste, i + 1)
404             panel.ProfNB.AddPage(self.tabprofile, 'classe %s %s(%s%%)' % (str(i + 1), sep, indpour))
405             #panel.AntiProfNB.AddPage(self.tabantiprofile, 'classe %s' % str(i + 1))
406             if os.path.exists(DictPathOut['prof_seg']) :
407                 self.tab_prof_seg = ProfListctrlPanel(self.parent, self, prof_seg[str(i + 1)], False, i + 1)
408                 self.prof_seg_nb.AddPage(self.tab_prof_seg, 'classe %i' % (i + 1))
409
410        if clnb > 2 :
411            self.TabAFC = aui.AuiNotebook(panel.TabChdSim, -1, wx.DefaultPosition)
412            log.info('read AFC') 
413            list_graph=read_list_file(DictPathOut['liste_graph_afc'], self.encoding)
414            self.tabAFCGraph = GraphPanelAfc(self.TabAFC, DictPathOut, list_graph, self.clnb, coding=self.encoding)
415            self.TabAFC.AddPage(self.tabAFCGraph, 'AFC')
416            
417            if os.path.exists(self.DictPathOut['afc_facteur']) :
418                dictrow, first = ReadList(self.DictPathOut['afc_facteur'], self.encoding)
419                self.TabAFC_facteur = ListForSpec(self.parent, parametres, dictrow, first)
420                #dictrow, first = ReadList(self.DictPathOut['afc_row'], self.encoding)
421                #self.TabAFC_ligne = ListForSpec(self.parent, self.parametres, dictrow, first)
422                #dictrow, first = ReadList(self.DictPathOut['afc_col'], self.encoding)
423                #self.TabAFC_colonne = ListForSpec(parent, self.parametres, dictrow, first)
424                self.TabAFC.AddPage(self.TabAFC_facteur, 'Facteurs')
425                #self.TabAFC.AddPage(self.TabAFC_colonne, u'Colonnes')
426                #self.TabAFC.AddPage(self.TabAFC_ligne, u'Lignes')
427            
428            sizer_3 = wx.BoxSizer(wx.VERTICAL)
429            self.parent.nb_panel_2 = wx.Panel(panel.TabChdSim, -1)
430            self.parent.button_simi = wx.Button(self.parent.nb_panel_2, -1, "Voyager")
431            self.parent.simi3dpanel = simi3d(self.parent.nb_panel_2, -1)
432            sizer_3.Add(self.parent.simi3dpanel, 1, wx.EXPAND, 0)
433            sizer_3.Add(self.parent.button_simi, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
434            self.parent.nb_panel_2.SetSizer(sizer_3)
435            self.TabAFC.AddPage(self.parent.nb_panel_2, "graph 3D")
436            self.parent.Bind(wx.EVT_BUTTON, self.onsimi, self.parent.button_simi)
437        
438        panel.TabChdSim.AddPage(panel.ProfNB, 'Profils')
439        #panel.TabChdSim.AddPage(panel.AntiProfNB, 'Antiprofils')
440        dlg.Update(4 + self.clnb, 'Affichage...')
441        if clnb > 2 :
442            panel.TabChdSim.AddPage(self.TabAFC, 'AFC')
443        if os.path.exists(DictPathOut['prof_seg']) :
444            panel.TabChdSim.AddPage(self.prof_seg_nb, u'Profils des segments répétés')
445       
446        if isinstance(self.corpus, Corpus) :
447            panel.Bind(wx.EVT_BUTTON, self.on_export_classes, id = self.ID_export)
448            panel.Bind(wx.EVT_BUTTON, self.onprofseg, id = self.ID_sg)
449            panel.Bind(wx.EVT_BUTTON, self.oncolored, id = self.ID_colored)
450            panel.Bind(wx.EVT_BUTTON, self.onsearchf, id = self.ID_searchf)
451            panel.Bind(wx.EVT_BUTTON, self.onproftype, id = self.ID_proftype)
452            panel.Bind(wx.EVT_BUTTON, self.onclusterstat, id = self.ID_clusterstat)
453
454        panel.Bind(wx.EVT_BUTTON, self.ongetrapport, id = self.ID_rapport)
455        self.parent.nb.AddPage(panel, 'Classification - %s' % corpname)
456        self.parent.ShowTab(True)
457        self.parent.nb.SetSelection(self.parent.nb.GetPageCount() - 1)     
458        #for pane in self.parent._mgr.GetAllPanes() :
459        #     if isinstance(pane.window, aui.AuiNotebook):
460        #         nb = pane.window
461        #         nb.SetAGWWindowStyleFlag(notebook_flags)
462        #         nb.SetArtProvider(aui.ChromeTabArt())
463        dlg.Destroy() 
464        self.parent._mgr.Update()
465         
466     def onsimi(self,event):
467         outfile = print_simi3d(self)
468         error = exec_rcode(self.parent.RPath, outfile, wait = True)
469
470     def ongetrapport(self, event) :
471         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': 'Rapport'})
472         dial.fbb.SetValue(self.DictPathOut['rapport'])
473         dial.CenterOnParent()
474         res = dial.ShowModal()
475         if res == wx.ID_OK :
476             fileout = dial.fbb.GetValue()
477             dial.Destroy()
478             with open(fileout, 'w') as f :
479                 f.write(self.debtext + '\n' + GetTxtProfile(self.DictProfile))
480             msg = u"Fini !"
481             dlg = wx.MessageDialog(self.parent, msg, u"Rapport", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
482             dlg.CenterOnParent()
483             dlg.ShowModal()
484             dlg.Destroy()
485         else :
486             dial.Destroy()
487
488     def on_export_classes(self, event) :
489         corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
490         dial = PrefExport(self, self.parent)
491         dial.fbb.SetValue(os.path.join(os.path.dirname(corpus.dictpathout['ira']), 'export_corpus.txt'))
492         dial.CenterOnParent()
493         res = dial.ShowModal()
494         if res == wx.ID_OK :
495             if dial.radio_type.GetSelection() == 0 : alc = True
496             else : alc = False
497             if dial.radio_lem.GetSelection() == 0 : lem = True
498             else : lem = False
499             self.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem)
500             msg = u"Fini !"
501             dial.Destroy()
502             dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
503             dlg.CenterOnParent()
504             dlg.ShowModal()
505             dlg.Destroy()
506
507     def onprofseg(self, event):
508         #try :
509             print 'plus de bug profseg'
510             print self.parametres
511             corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
512             ProfileSegment(self.parent, self.dictpathout, self.parametres, corpus)
513         #except :
514         #    BugReport(self.parent)
515
516     def onproftype(self, event):
517         try :
518             corpus = self.parent.nb.GetPage(self.parent.nb.GetSelection()).corpus
519             ProfilType(self.parent, corpus)
520         except :
521             BugReport(self.parent)
522
523     def oncolored(self,evt) :
524         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': 'Corpus en couleur'})
525         dial.fbb.SetValue(os.path.join(os.path.dirname(self.corpus.dictpathout['ira']), 'corpus_couleur.html'))
526         dial.CenterOnParent()
527         res = dial.ShowModal()
528         if res == wx.ID_OK :
529             fileout = dial.fbb.GetValue()
530             dial.Destroy()
531             txt = self.corpus.make_colored_corpus()
532             with open(fileout, 'w') as f :
533                 f.write(txt)
534             msg = u"Fini !\nVoulez-vous ouvrir le corpus dans votre navigateur ?"
535             dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
536             dlg.CenterOnParent()
537             if dlg.ShowModal() == wx.ID_YES :
538                 webbrowser.open(fileout)
539             dlg.Destroy()
540
541     def onclusterstat(self, evt) :
542         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': 'Stat par classe'})
543         dial.fbb.SetValue( os.path.join(os.path.dirname(self.corpus.dictpathout['ira']), 'stat_par_classe.csv'))
544         dial.CenterOnParent()
545         res = dial.ShowModal()
546         if res == wx.ID_OK :
547             fileout = dial.fbb.GetValue()
548             dial.Destroy()
549             print fileout
550             self.corpus.get_stat_by_cluster(fileout)
551             msg = u"Fini !"
552             dlg = wx.MessageDialog(self.parent, msg, u"Stat par classe", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
553             dlg.CenterOnParent()
554             if dlg.ShowModal() == wx.ID_OK :
555                 dlg.Destroy()
556
557     def onsearchf(self, evt) :
558         if 'FrameSearch' not in dir(self.parent) :
559             self.parent.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.corpus)
560         self.parent.FrameSearch.Show()
561     
562         
563
564 def PrintRapport(self, corpus, parametres, txt = True):
565     #if sys.platform == 'win32':
566     #    sep = '\r\n'
567     #else:
568     sep = '\n'
569     txt = """
570 +-+-+-+-+-+-+-+-+
571 |i|R|a|M|u|T|e|Q| - %s
572 +-+-+-+-+-+-+-+-+
573
574
575 """ % datetime.datetime.now().ctime()
576     totocc = corpus.gettotocc()
577     if txt :
578         txt += u'nombre d\'uci: %i%s' % (corpus.getucinb(), sep)
579         txt += u'nombre d\'uce: %i%s' % (corpus.getucenb(), sep)
580         txt += u'nombre de formes: %i%s' % (len(corpus.formes), sep)
581         txt += u'nombre d\'occurrences: %i%s' % (totocc, sep)
582         txt += u'moyenne d\'occurrences par forme: %f%s' % (float(totocc) / float(len(self.corpus.formes)), sep)
583         txt += u'nombre de lemmes: %i%s' % (len(corpus.lems), sep)
584         txt += u'nombre de formes actives: %i%s' % (corpus.getactivesnb(1), sep)
585         txt += u'nombre de formes supplémentaires: %i%s' % (corpus.getactivesnb(2), sep)
586         txt += u'nombre de formes actives de fréquence >= %i: %i%s' % (parametres['eff_min_forme'], parametres['nbactives'], sep)
587         txt += u'moyenne d\'occurrences par uce :%f%s' % (float(totocc) / float(corpus.getucenb()), sep)
588         if 'tailleuc1' in parametres :
589             if parametres['classif_mode'] != 0 :
590                 txt += u'taille uc1 : %i\n' % parametres['tailleuc1']
591             else:
592                 txt += u'taille uc1 / uc2: %i / %i - %i / %i%s' % (parametres['tailleuc1'], parametres['tailleuc2'], parametres['lenuc1'], parametres['lenuc2'], sep)
593     elif not txt :
594         self.Ucenb = self.nbind
595         txt += u'nombre d\'individus : %i%s' % (self.nbind, sep)
596         txt += u'nombre de classes : %i%s' % (self.clnb, sep)
597     if txt :
598         txt += u'nombre de classes : %i%s' % (parametres['clnb'], sep)
599         if parametres['classif_mode'] == 0 or parametres['classif_mode'] == 1 :
600             txt += u'%i uce classées 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)
601         elif self.parametres['classif_mode'] == 2 :
602             txt += u'%i uci classées 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)
603     elif analyse == 'quest' :
604         txt += u'%i uce classées sur %i (%.2f%%)%s' % (self.ucecla, self.Ucenb, (float(self.ucecla) / float(self.Ucenb)) * 100, sep)
605  
606     txt += """
607 ###########################
608 temps d'analyse : %s
609 ###########################
610 """ % parametres['time']
611     file = open(self.pathout['pre_rapport'], 'w')
612     file.write(txt)
613     file.close()
614
615 class dolexlayout :
616     def __init__(self, ira, corpus, parametres):
617         self.pathout = PathOut(dirout = parametres['pathout'])
618         self.corpus = corpus
619         self.dictpathout = StatTxtPathOut(parametres['pathout'])
620         #self.corpus.read_corpus_from_shelves(self.corpus.dictpathout['db'])
621         self.parent = ira
622         self.encoding = self.corpus.parametres['syscoding']
623         self.parametres = parametres
624
625         self.DictSpec, first = ReadList(self.dictpathout['tablespecf'], self.corpus.parametres['syscoding'])
626         self.DictType, firstt = ReadList(self.dictpathout['tablespect'], self.corpus.parametres['syscoding'])
627         self.DictEff, firsteff = ReadList(self.dictpathout['tableafcm'], self.corpus.parametres['syscoding'])
628         self.DictEffType, firstefft = ReadList(self.dictpathout['tabletypem'], self.corpus.parametres['syscoding'])
629         self.DictEffRelForme, firsteffrelf = ReadList(self.dictpathout['eff_relatif_forme'], self.corpus.parametres['syscoding']) 
630         self.DictEffRelType, firsteffrelt = ReadList(self.dictpathout['eff_relatif_type'], self.corpus.parametres['syscoding'])    
631         
632         self.TabStat = aui.AuiNotebook(ira.nb, -1, wx.DefaultPosition)
633         self.TabStat.parametres = parametres
634         self.ListPan = ListForSpec(ira, self.parent, self.DictSpec, first)
635         self.ListPant = ListForSpec(ira, self.parent, self.DictType, firstt)
636         self.ListPanEff = ListForSpec(ira, self.parent, self.DictEff, firsteff)
637         self.ListPanEffType = ListForSpec(ira, self.parent, self.DictEffType, firstefft)
638         self.ListPanEffRelForme = ListForSpec(ira, self.parent, self.DictEffRelForme, firsteffrelf)
639         self.ListPanEffRelType = ListForSpec(ira, self.parent, self.DictEffRelType, firsteffrelt)
640         
641         self.TabStat.AddPage(self.ListPan, u'formes') 
642         self.TabStat.AddPage(self.ListPant, u'Types')
643         self.TabStat.AddPage(self.ListPanEff, u'Effectifs formes')
644         self.TabStat.AddPage(self.ListPanEffType, u'Effectifs Type')
645         self.TabStat.AddPage(self.ListPanEffRelForme, u'Effectifs relatifs formes')
646         self.TabStat.AddPage(self.ListPanEffRelType, u'Effectifs relatifs Type')
647         if self.parametres['clnb'] > 2 :
648            self.TabAFC = aui.AuiNotebook(self.TabStat, -1, wx.DefaultPosition)
649            list_graph=read_list_file(self.dictpathout['liste_graph_afcf'], encoding = self.encoding)
650            self.tabAFCGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afcf', coding = self.encoding)
651            self.TabAFC.AddPage(self.tabAFCGraph, 'AFC formes')
652            list_graph=read_list_file(self.dictpathout['liste_graph_afct'], encoding = self.encoding)
653            self.tabAFCTGraph = GraphPanelAfc(self.TabAFC, self.dictpathout, list_graph, self.parametres['clnb'], itempath ='liste_graph_afct', coding=self.encoding)
654            self.TabAFC.AddPage(self.tabAFCTGraph, 'AFC type')
655            self.TabStat.AddPage(self.TabAFC, 'AFC')
656            
657         
658         ira.nb.AddPage(self.TabStat, u'Spécificités')
659         
660         self.TabStat.corpus = self.corpus
661         ira.nb.SetSelection(self.parent.nb.GetPageCount() - 1)
662         ira.ShowAPane("Tab_content")
663
664 class StatLayout:
665     def __init__(self, ira, corpus, parametres):
666         self.pathout = PathOut(dirout = parametres['pathout'])
667         self.corpus = corpus
668         self.ira = ira
669         self.read_result()
670         self.TabStat = aui.AuiNotebook(ira.nb, -1, wx.DefaultPosition)
671         self.TabStat.parametres = parametres
672 #        CHD = GraphPanel(panel.TabChdSim, DictPathOut, list_graph, txt = self.debtext)
673          #      panel.TabChdSim.AddPage(CHD,'CHD')
674
675         #self.TabStatTot = wx.TextCtrl(self.TabStat, -1, style=wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2)
676         list_graph = [['zipf.png', 'zipf']]
677         self.TabStatTot = GraphPanel(ira.nb, self.pathout, list_graph, self.result['glob'])
678         #self.TabStatTot.write(self.result['glob'])
679         self.TabStat.AddPage(self.TabStatTot, 'global')
680         for item in self.result:
681             if item != 'glob':
682                 datam = [['forme', 'nb']]
683                 self.ListPan = ListPanel(ira, self, self.result[item])
684                 self.TabStat.AddPage(self.ListPan, item) 
685         ira.nb.AddPage(self.TabStat, 'Stat')
686         ira.nb.SetSelection(ira.nb.GetPageCount() - 1)
687         ira.ShowAPane("Tab_content")
688
689     def read_result(self) :
690         lcle = {'total' :u'total.csv', u'formes_actives':u'formes_actives.csv', u'formes_supplémentaires':u'formes_supplémentaires.csv', u'hapax': u'hapax.csv'}
691         self.result = {}
692         for key in lcle :
693             with open(self.pathout[lcle[key]], 'r') as f :
694                 self.result[key] = [line.split(';') for line in f.read().splitlines()]
695                 self.result[key] = dict([[i,[line[0],int(line[1]), line[2]]] for i, line in enumerate(self.result[key])])
696         with open(self.pathout['glob.txt'], 'r') as f :
697             self.result['glob'] = f.read()
698
699 class GraphPanelDendro(wx.Panel):
700     def __init__(self,parent, dico, list_graph, txt=False):
701         wx.Panel.__init__(self,parent)
702         self.graphnb = 1
703         self.dictpathout = dico
704         self.dirout = os.path.dirname(self.dictpathout['ira'])
705         self.list_graph = list_graph
706         self.parent = self.GetParent()#parent
707         self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
708         self.labels = []
709         self.listimg = []
710         self.tabchd = self.parent.GetParent()
711         self.ira = self.tabchd.GetParent()
712         self.panel_1 = wx.ScrolledWindow(self, -1, style=wx.TAB_TRAVERSAL)
713         self.deb = wx.StaticText(self.panel_1, -1, txt)
714         dendro_img = wx.Image(os.path.join(self.ira.images_path,'but_dendro.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
715         self.butdendro = wx.BitmapButton(self, -1, dendro_img)
716         
717         for i in range(0,len(list_graph)):
718             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) :
719                 self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
720                 self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1]))
721                 
722         self.__set_properties()
723         self.__do_layout()
724
725     def __set_properties(self):
726         self.panel_1.EnableScrolling(True,True)
727         #self.panel_1.SetSize((1000,1000))
728         self.panel_1.SetScrollRate(20, 20)
729         self.Bind(wx.EVT_BUTTON, self.ondendro, self.butdendro)
730         self.param = {'width' : 700,
731                        'height': 500,
732                        'type_dendro': 0,
733                        'color_nb': 0,
734                        'taille_classe' : True,
735                        'type_tclasse' : 0
736                      }
737         self.type_dendro = [ u"phylogram", u"cladogram", u"fan", u"unrooted", u"radial" ]
738
739     def __do_layout(self):    
740         self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
741         self.sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
742         self.sizer_3 = wx.BoxSizer(wx.VERTICAL)
743         self.sizer_3.Add(self.deb)
744         self.sizer_2.Add(self.butdendro, 0, 0, 0)
745         for i in range(0, len(self.listimg)):
746             self.sizer_3.Add(self.listimg[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
747             self.sizer_3.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
748         self.panel_1.SetSizer(self.sizer_3)
749         self.sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
750         self.SetSizer(self.sizer_2) 
751
752     def make_param(self, dial):
753         self.param['width'] = dial.m_spinCtrl2.GetValue()
754         self.param['height'] = dial.m_spinCtrl1.GetValue()
755         self.param['type_dendro'] = dial.m_choice1.GetSelection()
756         self.param['color_nb'] = dial.m_radioBox1.GetSelection()
757         self.param['taille_classe'] = dial.m_checkBox1.GetValue()
758         self.param['type_tclasse'] = dial.m_radioBox2.GetSelection()
759
760     def make_dendro(self) :
761         while os.path.exists(os.path.join(self.dirout, 'dendrogamme_' + str(self.graphnb)+'.png')) :
762             self.graphnb += 1
763         fileout = ffr(os.path.join(self.dirout,'dendrogamme_' + str(self.graphnb)+'.png'))
764         width = self.param['width']
765         height = self.param['height']
766         type_dendro = self.type_dendro[self.param['type_dendro']]
767         if self.param['taille_classe'] :
768             tclasse = 'TRUE'
769         else :
770             tclasse = 'FALSE'
771         if self.param['color_nb'] == 0 :
772             bw = 'FALSE'
773         else :
774             bw = 'TRUE'
775         if self.param['type_tclasse'] == 0 :
776             histo='FALSE'
777         else :
778             histo = 'TRUE'
779         dendro_path = self.dictpathout['Rdendro']
780         classe_path = self.dictpathout['uce']
781         txt = """
782         library(ape)
783         load("%s")
784         source("%s")
785         classes <- read.csv2("%s", row.names=1)
786         classes <- classes[,1]
787         open_file_graph("%s", width=%i, height=%i)
788         plot.dendropr(tree.cut1$tree.cl, classes, type.dendro="%s", histo=%s, bw=%s, lab=NULL, tclasse=%s)
789         """ % (ffr(dendro_path), ffr(self.ira.RscriptsPath['Rgraph']), ffr(classe_path), ffr(fileout), width, height, type_dendro, histo, bw, tclasse)
790         
791         tmpfile = tempfile.mktemp()
792         with open(tmpfile, 'w') as f :
793             f.write(txt)
794         error = exec_rcode(self.ira.RPath, tmpfile, wait=True) 
795         check_Rresult(self.ira, error)
796         self.list_graph.append([fileout, 'Dendrogramme CHD1 - %s' %  type_dendro])
797         print_liste(self.dictpathout['liste_graph_chd'], self.list_graph)
798         self.sizer_3.Add(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(fileout, wx.BITMAP_TYPE_ANY)), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
799         self.sizer_3.Add(wx.StaticText(self.panel_1,-1, 'Dendrogramme CHD1 - %s' %  type_dendro), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
800         self.sizer_3.Fit(self.panel_1)
801         self.Layout()
802         self.panel_1.Scroll(0,self.panel_1.GetScrollRange(wx.VERTICAL))
803
804
805     def ondendro(self, evt):
806         dial = PrefDendro(self.ira, self.param)
807         val = dial.ShowModal()
808         if val == wx.ID_OK :
809             self.make_param(dial)
810             self.make_dendro()
811
812
813
814 class OpenCorpus :
815     def __init__(self, ira, parametres) :
816         #self.text = wx.TextCtrl(ira, -1, "", wx.Point(0, 0), wx.Size(200, 200), wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
817         self.panel = CopusPanel(ira, parametres)
818         ira.nb.AddPage(self.panel, 'Description %s' % parametres['corpus_name'])
819         #self.text.write(DoConf().totext(parametres))
820         ira.nb.SetSelection(ira.nb.GetPageCount() - 1)
821         ira.ShowAPane("Tab_content")
822
823 class CopusPanel(wx.Panel) :
824     def __init__(self, parent, parametres) :
825         wx.Panel.__init__ ( self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.TAB_TRAVERSAL )
826         self.parametres = parametres
827         fgSizer5 = wx.FlexGridSizer( 0, 2, 0, 0 )
828         fgSizer5.SetFlexibleDirection( wx.BOTH )
829         fgSizer5.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )        
830         self.fgSizer5 = fgSizer5
831         
832         self.m_staticText18 = wx.StaticText( self, wx.ID_ANY, u"Description du corpus", wx.DefaultPosition, wx.DefaultSize, 0 )
833
834         self.m_staticText18.Wrap( -1 )
835         fgSizer5.Add( self.m_staticText18, 0, wx.ALL, 5 )
836         
837         self.m_staticText19 = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 )
838         self.m_staticText19.Wrap( -1 )
839         fgSizer5.Add( self.m_staticText19, 0, wx.ALL, 5 )
840
841         self.m_staticText20 = wx.StaticText( self, wx.ID_ANY, u"Nom", wx.DefaultPosition, wx.DefaultSize, 0 )
842         self.m_staticText20.Wrap( -1 )
843         fgSizer5.Add( self.m_staticText20, 0, wx.ALL, 5 )
844         
845         self.m_staticText21 = wx.StaticText( self, wx.ID_ANY, parametres['corpus_name'], wx.DefaultPosition, wx.DefaultSize, 0 )
846         self.m_staticText21.Wrap( -1 )
847         fgSizer5.Add( self.m_staticText21, 0, wx.ALL, 5 )
848
849         description = {'lang' : u'langue',
850                         'encoding' : u'encodage'}
851
852         keys = ['lang', 'encoding', 'originalpath', 'pathout', 'date', 'time']
853
854         self.addkeys(keys, description)
855
856         self.m_staticText18 = wx.StaticText( self, wx.ID_ANY, u"Paramètres", wx.DefaultPosition, wx.DefaultSize, 0 )
857         self.m_staticText18.Wrap( -1 )
858         fgSizer5.Add( self.m_staticText18, 0, wx.ALL, 5 )
859         
860         self.m_staticText19 = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 )
861         self.m_staticText19.Wrap( -1 )
862         fgSizer5.Add( self.m_staticText19, 0, wx.ALL, 5 )
863
864         keys = ['ucemethod', 'ucesize', 'keep_caract', 'expressions']
865         self.addkeys(keys, description)
866
867         self.m_staticText18 = wx.StaticText( self, wx.ID_ANY, u"Statistiques", wx.DefaultPosition, wx.DefaultSize, 0 )
868         self.m_staticText18.Wrap( -1 )
869         fgSizer5.Add( self.m_staticText18, 0, wx.ALL, 5 )
870         
871         self.m_staticText19 = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 )
872         self.m_staticText19.Wrap( -1 )
873         fgSizer5.Add( self.m_staticText19, 0, wx.ALL, 5 )
874
875         keys = ['ucinb', 'ucenb', 'occurrences', 'formesnb', 'hapax']
876         self.addkeys(keys, description)
877
878         self.SetSizer( fgSizer5 )
879         self.Layout()
880
881     def addkeys(self, keys, description) :
882         for key in keys :
883             option = self.parametres.get(key,u'non défnini')
884             if isinstance(option, int) :
885                 option = `option`
886             text = wx.StaticText( self, wx.ID_ANY, description.get(key, key), wx.DefaultPosition, wx.DefaultSize, 0 )
887             text.Wrap( -1 )
888             self.fgSizer5.Add( text, 0, wx.ALL, 5 )
889
890             text = wx.StaticText( self, wx.ID_ANY, option, wx.DefaultPosition, wx.DefaultSize, 0 )
891             text.Wrap( -1 )
892             self.fgSizer5.Add( text, 0, wx.ALL, 5 )
893
894 class GraphPanelSimi(wx.Panel):
895     def __init__(self, parent, dico, list_graph):
896         wx.Panel.__init__(self,parent)
897         self.afcnb = 1
898         self.Dict = dico
899         self.dirout = os.path.dirname(self.Dict['ira'])
900         self.parent = self.GetParent()#parent
901         self.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "courier"))
902         self.labels = []
903         self.listimg = []
904         self.tabsimi = self.parent.GetParent()
905         self.ira = self.tabsimi.GetParent()
906         self.panel_1 = wx.ScrolledWindow(self, -1, style=wx.TAB_TRAVERSAL)
907         afc_img = wx.Image(os.path.join(self.ira.images_path,'button_simi.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
908         self.butafc = wx.BitmapButton(self, -1, afc_img)
909         export_img = wx.Image(os.path.join(self.ira.images_path,'button_export.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
910         self.butexport = wx.BitmapButton(self, -1, export_img)
911         
912         for i in range(0,len(list_graph)):
913             if os.path.exists(os.path.join(self.dirout,list_graph[i][0])) and list_graph[i][0] != '' :
914                 self.listimg.append(wx.StaticBitmap(self.panel_1, -1, wx.Bitmap(os.path.join(self.dirout,list_graph[i][0]), wx.BITMAP_TYPE_ANY)))
915                 self.labels.append(wx.StaticText(self.panel_1, -1, list_graph[i][1]))
916                 
917         self.__set_properties()
918         self.__do_layout()
919
920     def __set_properties(self):
921         self.panel_1.EnableScrolling(True,True)
922         #self.panel_1.SetSize((1000,1000))
923         self.panel_1.SetScrollRate(20, 20)
924
925     def __do_layout(self):    
926         self.sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
927         self.sizer_2 = wx.BoxSizer(wx.VERTICAL)
928         self.sizer_3 = wx.BoxSizer(wx.VERTICAL)
929         self.sizer_2.Add(self.butafc, 0, 0, 0)
930         self.sizer_2.Add(self.butexport, 0, 0, 0)
931         for i in range(0, len(self.listimg)):
932             self.sizer_3.Add(self.listimg[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
933             self.sizer_3.Add(self.labels[i], 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
934         self.panel_1.SetSizer(self.sizer_3)
935         self.sizer_1.Add(self.sizer_2, 0, wx.EXPAND, 0)
936         self.sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
937         self.SetSizer(self.sizer_1)
938
939 class DefaultTextLayout :
940     def __init__(self, ira, corpus, parametres) :
941         self.pathout = PathOut(dirout = parametres['pathout'])
942         self.ira = ira
943         self.parent = ira
944         self.parametres = parametres
945         self.corpus = corpus
946         self.dolayout()
947     
948     def dolayout(self) :
949         log.info('no layout yet')
950
951 class WordCloudLayout(DefaultTextLayout):
952     def dolayout(self):
953         #self.dictpathout = parent.corpus.dictpathout
954         #self.pathout = os.path.dirname(filename)
955         #self.corpus = parent.corpus
956     #    self.read_result()
957         self.pathout.basefiles(simipath)
958         self.Tab = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
959 #        if os.path.exists(self.pathout['liste_graph']) :
960 #            list_graph = read_list_file(self.pathout['liste_graph'])
961 #        else : 
962 #            list_graph = [['','']]
963         list_graph = [['nuage_1.png', 'Nuage']]
964         self.TabStatTot = GraphPanel(self.ira.nb, self.pathout, list_graph)
965         #self.TabStatTot.write(self.result['glob'])
966         self.Tab.AddPage(self.TabStatTot, 'Nuage')
967         self.Tab.corpus = self.corpus
968         self.Tab.parametres = self.parametres
969         self.ira.nb.AddPage(self.Tab, 'WordCloud %s' % self.parametres.get('corpus_name','corpus_name'))
970         self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
971         self.ira.ShowAPane("Tab_content")
972
973 class SimiLayout(DefaultTextLayout) :
974     def dolayout(self) :
975         self.pathout.basefiles(simipath)
976         self.actives = None
977         self.indices = indices_simi
978         if os.path.exists(self.pathout['liste_graph']) :
979             list_graph = read_list_file(self.pathout['liste_graph'])
980         else : 
981             list_graph = [['','']]
982         notebook_flags =  aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT
983         self.tabsimi = aui.AuiNotebook(self.ira.nb, -1, wx.DefaultPosition)
984         self.tabsimi.SetAGWWindowStyleFlag(notebook_flags)
985         self.tabsimi.SetArtProvider(aui.ChromeTabArt())
986         self.tabsimi.corpus = self.corpus
987         self.tabsimi.parametres = self.parametres
988         self.graphpan = GraphPanelSimi(self.tabsimi, self.pathout, list_graph)
989         self.graphpan.Bind(wx.EVT_BUTTON, self.redosimi, self.graphpan.butafc)
990         self.graphpan.Bind(wx.EVT_BUTTON, self.export, self.graphpan.butexport)
991         self.tabsimi.AddPage(self.graphpan, 'Graph')
992         self.ira.nb.AddPage(self.tabsimi, 'Analyse de graph')
993         self.ira.ShowTab(True)
994         self.ira.nb.SetSelection(self.ira.nb.GetPageCount() - 1)
995         
996     def redosimi(self, evt) :
997         with open(self.pathout['selected.csv'],'r') as f :
998             selected = f.read()
999         selected = [int(val) for val in selected.splitlines()]
1000         if self.actives is None :
1001             with codecs.open(self.pathout['actives.csv'], 'r', self.parametres['encoding']) as f :
1002                 self.actives = f.read()
1003             self.actives = self.actives.splitlines()#[act for act in self.actives.splitlines()]
1004         dictcol = dict([[i, [act, self.corpus.getlemeff(act)]] for i, act in enumerate(self.actives)])
1005         #res = SelectColumn(self.ira, dictcol, self.actives, self.pathout['selected.csv'], selected = selected, dlg = True) 
1006         #if res.ok :
1007         prep = PrepSimi(self.ira, self, self.parametres,self.pathout['selected.csv'], self.actives, indices_simi, wordlist = dictcol, selected = selected)
1008         if prep.val == wx.ID_OK :
1009             self.parametres = prep.parametres
1010
1011             script = PrintSimiScript(self)
1012             script.make_script()
1013             pid = exec_rcode(self.ira.RPath, script.scriptout, wait = True)
1014             check_Rresult(self.ira, pid)
1015             if self.parametres['type_graph'] == 1:
1016                 if os.path.exists(self.pathout['liste_graph']):
1017                     graph_simi = read_list_file(self.pathout['liste_graph'])
1018                     graph_simi.append([os.path.basename(script.filename), script.txtgraph])
1019                 else :
1020                     graph_simi = [[os.path.basename(script.filename), script.txtgraph]]
1021                 print_liste(self.pathout['liste_graph'], graph_simi)
1022             DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
1023             if self.parametres['type_graph'] == 1:
1024                 self.graphpan.sizer_3.Add(wx.StaticBitmap(self.graphpan.panel_1, -1, wx.Bitmap(script.filename, wx.BITMAP_TYPE_ANY)), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
1025                 self.graphpan.sizer_3.Add(wx.StaticText(self.graphpan.panel_1,-1, script.txtgraph), 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
1026                 self.graphpan.sizer_3.Fit(self.graphpan.panel_1)
1027                 self.graphpan.Layout()
1028                 self.graphpan.panel_1.Scroll(0,self.graphpan.panel_1.GetScrollRange(wx.VERTICAL))
1029
1030     def export(self, evt) :
1031         pass
1032    # def read_result(self) :
1033    #     #self.corpus.read_corpus_from_shelves(self.corpus.dictpathout['db'])
1034    #     #self.corpus.make_et_table()
1035    #     self.result = {}
1036    #     with open(os.path.join(self.pathout,'glob.txt'), 'r') as f :
1037    #         self.result['glob'] = f.read()
1038