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