1
2 """
3 Class that implements pyFoamPVSnapshot
4 """
5
6 from optparse import OptionGroup
7
8 from PyFoamApplication import PyFoamApplication
9
10 from CommonSelectTimesteps import CommonSelectTimesteps
11
12 from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
13 from PyFoam.Paraview.ServermanagerWrapper import ServermanagerWrapper as SM
14 from PyFoam.Paraview.StateFile import StateFile
15 from PyFoam.Paraview import version as PVVersion
16
17 from PyFoam.FoamInformation import foamVersion
18
19 from os import path,unlink
20 import sys,string
21
22 -class PVSnapshot(PyFoamApplication,
23 CommonSelectTimesteps ):
25 description="""\
26 Generates snapshots of an OpenFOAM-case and a predefined
27 paraview-State-File using the PV3FoamReader that comes with OpenFOAM.
28
29 The state-file can be generated using a different case (the script
30 adjusts it before using) but the original case has to have a similar
31 structure to the current one. Also exactly one PV3Reader has to be
32 used in the state-file (this requirement is fullfilled if the
33 StateFile was generated using paraFoam)
34
35 In TextSources the string "%(casename)s" gets replaced by the
36 casename. Additional replacements can be specified
37 """
38 CommonSelectTimesteps.__init__(self)
39
40 PyFoamApplication.__init__(self,
41 args=args,
42 description=description,
43 usage="%prog [options] <case>",
44 interspersed=True,
45 nr=1)
46
47 typeTable={"png":"vtkPNGWriter",
48 "jpg":"vtkJPEGWriter"}
49
51 CommonSelectTimesteps.addOptions(self,defaultUnique=False)
52
53 paraview=OptionGroup(self.parser,
54 "Paraview specifications",
55 "Options concerning paraview")
56 paraview.add_option("--state-file",
57 dest="state",
58 default=None,
59 help="The pvsm-file that should be used. If none is specified the file 'default.pvsm' in the case-directory is used")
60 paraview.add_option("--maginfication",
61 dest="magnification",
62 default=1,
63 type="int",
64 help="Magnification factor of the picture (integer). Default: %default")
65 paraview.add_option("--type",
66 dest="type",
67 type="choice",
68 choices=self.typeTable.keys(),
69 default="png",
70 help="The type of the bitmap-file. Possibilities are "+string.join(self.typeTable.keys(),", ")+". Default: %default")
71 paraview.add_option("--no-progress",
72 dest="progress",
73 action="store_false",
74 default=True,
75 help="Paraview will not print the progress of the filters")
76 self.parser.add_option_group(paraview)
77
78 filename=OptionGroup(self.parser,
79 "Filename specifications",
80 "The names of the resulting files")
81 filename.add_option("--file-prefix",
82 dest="prefix",
83 default="Snapshot",
84 help="Start of the filename for the bitmap-files")
85 filename.add_option("--no-casename",
86 dest="casename",
87 action="store_false",
88 default=True,
89 help="Do not add the casename to the filename")
90 filename.add_option("--no-timename",
91 dest="timename",
92 action="store_false",
93 default=True,
94 help="Do not append the string 't=<time>' to the filename")
95 self.parser.add_option_group(filename)
96
97 replace=OptionGroup(self.parser,
98 "Replacements etc",
99 "Manipuations of the statefile")
100 replace.add_option("--replacements",
101 dest="replacements",
102 default="{}",
103 help="Dictionary with replacement strings. Default: %default")
104 replace.add_option("--casename-key",
105 dest="casenameKey",
106 default="casename",
107 help="Key with which the caename should be replaced. Default: %default")
108
110 if foamVersion()>=(1,6):
111 self.warning("This utilitiy currently does not work with OF>=1.6 because the API in Paraview>=3.6 has changed. But we'll try")
112
113 case=path.abspath(self.parser.getArgs()[0])
114 short=path.basename(case)
115
116 if self.opts.state==None:
117 self.opts.state=path.join(case,"default.pvsm")
118
119 if not path.exists(self.opts.state):
120 self.error("The state file",self.opts.state,"does not exist")
121
122 timeString=""
123
124 if self.opts.casename:
125 timeString+="_"+short
126 timeString+="_%(nr)05d"
127 if self.opts.timename:
128 timeString+="_t=%(t)s"
129 timeString+="."+self.opts.type
130
131 sol=SolutionDirectory(case,
132 paraviewLink=False,
133 archive=None)
134
135 times=self.processTimestepOptions(sol)
136 if len(times)<1:
137 self.warning("Can't continue without time-steps")
138 return
139
140 dataFile=path.join(case,short+".OpenFOAM")
141 createdDataFile=False
142 if not path.exists(dataFile):
143 createdDataFile=True
144 f=open(dataFile,"w")
145 f.close()
146
147 sf=StateFile(self.opts.state)
148 sf.setCase(dataFile)
149
150 values=eval(self.opts.replacements)
151 values[self.opts.casenameKey]=short
152 sf.rewriteTexts(values)
153 newState=sf.writeTemp()
154
155 sm=SM(requiredReader=sf.readerType())
156
157
158 import paraview.simple
159 paraview.simple._DisableFirstRenderCameraReset()
160
161 if not self.opts.progress:
162 sm.ToggleProgressPrinting()
163
164
165 sm.LoadState(newState)
166 views=sm.GetRenderViews()
167
168 if len(views)>1:
169 self.warning("More than 1 view in state-file. Generating multiple series")
170 timeString="_View%(view)02d"+timeString
171 timeString=self.opts.prefix+timeString
172
173 for view in views:
174 view.UseOffscreenRenderingForScreenshots=True
175
176 for i,t in enumerate(times):
177 print "Snapshot ",i," for t=",t,
178 for j,view in enumerate(views):
179 if len(views)>0:
180 print "View %d" % j,
181 view.ViewTime=float(t)
182 fn = timeString % {'nr':i,'t':t,'view':j}
183 if PVVersion()<(3,6):
184 view.WriteImage(fn,
185 self.typeTable[self.opts.type],
186 self.opts.magnification)
187 else:
188 from paraview.simple import SetActiveView,Render,WriteImage
189 SetActiveView(view)
190 Render()
191
192 WriteImage(fn,
193 view,
194
195 Magnification=self.opts.magnification)
196 print
197 if createdDataFile:
198 self.warning("Removing pseudo-data-file",dataFile)
199 unlink(dataFile)
200
201 del sm
202