]> SALOME platform Git repositories - modules/adao.git/blob - src/daComposant/daDiagnostics/PlotVector.py
Salome HOME
97b337215df6215c1aae76df9665f3d5999f5a85
[modules/adao.git] / src / daComposant / daDiagnostics / PlotVector.py
1 #-*-coding:iso-8859-1-*-
2 #
3 #  Copyright (C) 2008-2009  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 __doc__ = """
22     Classe pour tracer simplement un vecteur à chaque pas
23 """
24 __author__ = "Jean-Philippe ARGAUD - Juillet 2008"
25
26 import sys ; sys.path.insert(0, "../daCore")
27
28 import os.path
29 import numpy
30 from BasicObjects import Diagnostic
31
32 # ==============================================================================
33 class ElementaryDiagnostic(Diagnostic):
34     def __init__(self, name = "", unit = "", basetype = None, parameters = {}):
35         Diagnostic.__init__(self, name, parameters)
36         try:
37             import Gnuplot
38             self.__gnuplot = Gnuplot
39         except:
40             raise ImportError("The Gnuplot module is required to plot the vector")
41
42     def _formula(self,
43             Vector, Steps,
44             title, xlabel, ylabel, ltitle,
45             geometry,
46             filename,
47             persist,
48             pause ):
49         """
50         Trace en gnuplot le vecteur Vector, avec une légende générale, en X et
51         en Y
52         """
53         if persist:
54             self.__gnuplot.GnuplotOpts.gnuplot_command = 'gnuplot -persist -geometry '+geometry
55         else:
56             self.__gnuplot.GnuplotOpts.gnuplot_command = 'gnuplot -geometry '+geometry
57         #
58         self.__g = self.__gnuplot.Gnuplot() # persist=1
59         self.__g('set terminal '+self.__gnuplot.GnuplotOpts.default_term)
60         self.__g('set style data lines')
61         self.__g('set grid')
62         self.__g('set autoscale')
63         self.__g('set title  "'+title +'"')
64         self.__g('set xlabel "'+xlabel+'"')
65         self.__g('set ylabel "'+ylabel+'"')
66         self.__g.plot( self.__gnuplot.Data( Steps, Vector, title=ltitle ) )
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   : le vecteur à tracer, en liste ou en numpy.array
83             - steps    : liste unique des pas de l'axe des X, ou None si c'est
84                          la numérotation par défaut
85             - title    : titre général du dessin
86             - xlabel   : label de l'axe des X
87             - ylabel   : label de l'axe des Y
88             - ltitle   : titre associé au vecteur tracé
89             - geometry : taille en pixels de la fenêtre et position du coin haut
90                          gauche, au format X11 : LxH+X+Y (défaut : 600x400)
91             - filename : nom de fichier Postscript pour une sauvegarde à 1 pas
92                          Attention, il faut changer le nom à l'appel pour
93                          plusieurs pas de sauvegarde
94             - persist  : booléen indiquant que la fenêtre affichée sera
95                          conservée lors du passage au dessin suivant
96                          Par défaut, persist = False
97             - pause    : booléen indiquant une pause après chaque tracé, et
98                          attendant un Return
99                          Par défaut, pause = True
100         """
101         if vector is None:
102             raise ValueError("One vector must be given to plot it.")
103         if ltitle is None:
104             ltitle = ""
105         Vector = numpy.array(vector)
106         if Vector.size < 1:
107             raise ValueError("The given vector must not be empty")
108         if steps is None:
109             Steps = range(len( vector ))
110         elif not ( type(steps) is type([]) or type(steps) is not type(numpy.array([])) ):
111             raise ValueError("The steps must be given as a list/tuple.")
112         else:
113             Steps = list(steps)
114         if os.path.isfile(filename):
115             raise ValueError("Error: a file with this name \"%s\" already exists."%filename)
116         #
117         value = self._formula(
118             Vector   = Vector,
119             Steps    = Steps,
120             title    = str(title).encode('ascii','replace'),
121             xlabel   = str(xlabel).encode('ascii','replace'),
122             ylabel   = str(ylabel).encode('ascii','replace'),
123             ltitle   = str(ltitle),
124             geometry = str(geometry),
125             filename = str(filename),
126             persist  = bool(persist),
127             pause    = bool(pause) )
128
129 # ==============================================================================
130 if __name__ == "__main__":
131     print '\n AUTODIAGNOSTIC \n'
132
133     D = ElementaryDiagnostic("Mon Plot")
134
135     vect = [1, 2, 1, 2, 1]
136     D.calculate(vect, title = "Vecteur 1", xlabel = "Axe X", ylabel = "Axe Y" )
137     vect = [1, 3, 1, 3, 1]
138     D.calculate(vect, title = "Vecteur 2", filename = "vecteur.ps")
139     vect = [1, 1, 1, 1, 1]
140     D.calculate(vect, title = "Vecteur 3")
141     vect = [0.29, 0.97, 0.73, 0.01, 0.20]
142     D.calculate(vect, title = "Vecteur 4")
143     vect = [-0.23262176, 1.36065207,  0.32988102, 0.24400551, -0.66765848, -0.19088483, -0.31082575,  0.56849814,  1.21453443,  0.99657516]
144     D.calculate(vect, title = "Vecteur 5")
145     vect = [0.29, 0.97, 0.73, 0.01, 0.20]
146     D.calculate(vect, title = "Vecteur 6 affiche avec une autre geometrie et position", geometry="800x200+50+50")
147     vect = 100*[0.29, 0.97, 0.73, 0.01, 0.20]
148     D.calculate(vect, title = "Vecteur 7 : long construit par repetition")
149     vect = [0.29, 0.97, 0.73, 0.01, 0.20]
150     D.calculate(vect, title = "Vecteur 8", ltitle = "Vecteur 8")
151     temps = [0.1,0.2,0.3,0.4,0.5]
152     D.calculate(vect, temps, title = "Vecteur 8 avec axe du temps modifie")
153     print