Salome HOME
769f6f8fe5fcb43b5566e601141cbe1bcb587c82
[modules/adao.git] / src / daComposant / daDiagnostics / PlotVectors.py
1 #-*-coding:iso-8859-1-*-
2 #
3 #  Copyright (C) 2008-2015 EDF R&D
4 #
5 #  This library is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU Lesser General Public
7 #  License as published by the Free Software Foundation; either
8 #  version 2.1 of the License.
9 #
10 #  This library is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 #  Lesser General Public License for more details.
14 #
15 #  You should have received a copy of the GNU Lesser General Public
16 #  License along with this library; if not, write to the Free Software
17 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21 #  Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
22
23 import numpy
24 from daCore import BasicObjects
25 import os.path
26
27 # ==============================================================================
28 class ElementaryDiagnostic(BasicObjects.Diagnostic):
29     """
30     Classe pour tracer simplement une liste de vecteurs à chaque pas
31     """
32     def __init__(self, name = "", unit = "", basetype = None, parameters = {}):
33         BasicObjects.Diagnostic.__init__(self, name, parameters)
34         try:
35             import Gnuplot
36             self.__gnuplot = Gnuplot
37         except:
38             raise ImportError("The Gnuplot module is required to plot the vector")
39
40     def _formula(self,
41             Vector, Steps,
42             title, xlabel, ylabel, ltitle,
43             geometry,
44             filename,
45             persist,
46             pause ):
47         """
48         Trace en gnuplot chaque vecteur de la liste Vector, avec une légende
49         générale, en X et en Y
50         """
51         if persist:
52             self.__gnuplot.GnuplotOpts.gnuplot_command = 'gnuplot -persist -geometry '+geometry
53         else:
54             self.__gnuplot.GnuplotOpts.gnuplot_command = 'gnuplot -geometry '+geometry
55         #
56         self.__g = self.__gnuplot.Gnuplot() # persist=1
57         self.__g('set terminal '+self.__gnuplot.GnuplotOpts.default_term)
58         self.__g('set style data lines')
59         self.__g('set grid')
60         self.__g('set autoscale')
61         self.__g('set title  "'+title +'"')
62         self.__g('set xlabel "'+xlabel+'"')
63         self.__g('set ylabel "'+ylabel+'"')
64         self.__g.plot( self.__gnuplot.Data( Steps, Vector.pop(0), title=ltitle.pop(0) ) )
65         for vector in Vector:
66             self.__g.replot( self.__gnuplot.Data( Steps, vector, title=ltitle.pop(0) ) )
67         if filename != "":
68             self.__g.hardcopy(filename=filename, color=1)
69         if pause:
70             raw_input('Please press return to continue...\n')
71         #
72         return 1
73
74     def calculate(self, vector = None, steps = None,
75                         title = "", xlabel = "", ylabel = "", ltitle = None,
76                         geometry = "600x400",
77                         filename = "",
78                         persist  = False,
79                         pause    = True ):
80         """
81         Arguments :
82             - vector   : liste des vecteurs à tracer, chacun étant en liste ou
83                          en numpy.array
84             - steps    : liste unique des pas, ou None si c'est la numérotation
85                          par défaut
86             - title    : titre général du dessin
87             - xlabel   : label de l'axe des X
88             - ylabel   : label de l'axe des Y
89             - ltitle   : liste des titres associés à chaque vecteur, dans le
90                          même ordre que les vecteurs eux-mêmes
91             - geometry : taille en pixels de la fenêtre et position du coin haut
92                          gauche, au format X11 : LxH+X+Y (défaut : 600x400)
93             - filename : nom de fichier Postscript pour une sauvegarde à 1 pas
94                          Attention, il faut changer le nom à l'appel pour
95                          plusieurs pas de sauvegarde
96             - persist  : booléen indiquant que la fenêtre affichée sera
97                          conservée lors du passage au dessin suivant
98                          Par défaut, persist = False
99             - pause    : booléen indiquant une pause après chaque tracé, et
100                          attendant un Return
101                          Par défaut, pause = True
102         """
103         if vector is None:
104             raise ValueError("One vector must be given to plot it.")
105         if type(vector) is not type([]) and type(vector) is not type(()):
106             raise ValueError("The vector(s) must be given as a list/tuple.")
107         if ltitle is None or len(ltitle) != len(vector):
108             ltitle = ["" for i in range(len(vector))]
109         VectorList = []
110         for onevector in vector:
111             VectorList.append( numpy.array( onevector ) )
112             if VectorList[-1].size < 1:
113                 raise ValueError("Each given vector must not be empty.")
114         if steps is None:
115             Steps = range(len(vector[0]))
116         elif not ( type(steps) is type([]) or type(steps) is not type(numpy.array([])) ):
117             raise ValueError("The steps must be given as a list/tuple.")
118         else:
119             Steps = list(steps)
120         if os.path.isfile(filename):
121             raise ValueError("Error: a file with this name \"%s\" already exists."%filename)
122         #
123         value = self._formula(
124             Vector   = VectorList,
125             Steps    = Steps,
126             title    = str(title).encode('ascii','replace'),
127             xlabel   = str(xlabel).encode('ascii','replace'),
128             ylabel   = str(ylabel).encode('ascii','replace'),
129             ltitle   = [str(lt) for lt in ltitle],
130             geometry = str(geometry),
131             filename = str(filename),
132             persist  = bool(persist),
133             pause    = bool(pause),
134             )
135
136 # ==============================================================================
137 if __name__ == "__main__":
138     print '\n AUTODIAGNOSTIC \n'
139
140     D = ElementaryDiagnostic("Mon Plot")
141
142     vect1 = [1, 2, 1, 2, 1]
143     D.calculate([vect1,], title = "Vecteur 1", xlabel = "Axe X", ylabel = "Axe Y" )
144     vect2 = [1, 3, 1, 3, 1]
145     D.calculate([vect1,vect2], title = "Vecteurs 1 et 2", filename = "liste_de_vecteurs.ps")
146     vect3 = [-1, 1, -1, 1, -1]
147     D.calculate((vect1,vect2,vect3), title = "Vecteurs 1 a 3")
148     vect4 = 100*[0.29, 0.97, 0.73, 0.01, 0.20]
149     D.calculate([vect4,], title = "Vecteur 4 : long construit par repetition")
150     D.calculate(
151         (vect1,vect2,vect3),
152         [0.1,0.2,0.3,0.4,0.5],
153         title = "Vecteurs 1 a 3, temps modifie",
154         ltitle = ["Vecteur 1","Vecteur 2","Vecteur 3"])
155     print