1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 \*---------------------------------------------------------------------------*/
31 #include "vtkFoamReader.h"
33 #include "vtkCallbackCommand.h"
34 #include "vtkDataArraySelection.h"
35 #include "vtkDataArrayCollection.h"
36 #include "vtkObjectFactory.h"
37 #include "vtkDataSet.h"
38 #include "vtkErrorCode.h"
39 #include "vtkUnstructuredGrid.h"
43 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
45 vtkCxxRevisionMacro(vtkFoamReader
, "$Revision: 1.20 $");
46 vtkStandardNewMacro(vtkFoamReader
);
48 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
50 vtkFoamReader::vtkFoamReader()
65 TimeStepLimits
[0] = 2;
66 TimeStepLimits
[1] = 5;
68 TimeSelection
= vtkDataArraySelection::New();
69 RegionSelection
= vtkDataArraySelection::New();
70 VolFieldSelection
= vtkDataArraySelection::New();
71 PointFieldSelection
= vtkDataArraySelection::New();
73 // Setup the selection callback to modify this object when an array
74 // selection is changed.
75 SelectionObserver
= vtkCallbackCommand::New();
76 SelectionObserver
->SetCallback(&vtkFoamReader::SelectionModifiedCallback
);
77 SelectionObserver
->SetClientData(this);
79 TimeSelection
->AddObserver
81 vtkCommand::ModifiedEvent
,
82 this->SelectionObserver
84 RegionSelection
->AddObserver
86 vtkCommand::ModifiedEvent
,
87 this->SelectionObserver
89 VolFieldSelection
->AddObserver
91 vtkCommand::ModifiedEvent
,
92 this->SelectionObserver
94 PointFieldSelection
->AddObserver
96 vtkCommand::ModifiedEvent
,
97 this->SelectionObserver
100 // This is needed by ParaView 2.?.?
101 this->SetNumberOfOutputPorts(0);
105 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
107 vtkFoamReader::~vtkFoamReader()
116 StoredOutputs
->Delete();
124 TimeSelection
->RemoveObserver(this->SelectionObserver
);
125 RegionSelection
->RemoveObserver(this->SelectionObserver
);
126 VolFieldSelection
->RemoveObserver(this->SelectionObserver
);
127 PointFieldSelection
->RemoveObserver(this->SelectionObserver
);
128 SelectionObserver
->Delete();
130 TimeSelection
->Delete();
131 RegionSelection
->Delete();
132 VolFieldSelection
->Delete();
133 PointFieldSelection
->Delete();
137 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
139 void vtkFoamReader::ExecuteInformation()
143 vtkDebugMacro( << "Reading Foam case" << FileName
);
144 foamData_
= new Foam::vtkFoam(FileName
, this);
148 foamData_
->UpdateInformation();
151 vtkDebugMacro( << "end of ExecuteInformation\n");
155 void vtkFoamReader::Execute()
161 StoredOutputs
= vtkFoamData::New();
163 for (int i
= 0; i
< GetNumberOfOutputs(); i
++)
165 vtkDataObject
* tmp
= GetOutput(i
);
166 vtkDataObject
* output
= tmp
->NewInstance();
167 output
->ShallowCopy(tmp
);
168 StoredOutputs
->SetNthOutput(i
, output
);
174 for (int i
= 0; i
< GetNumberOfOutputs(); i
++)
176 vtkDataObject
* output
= GetOutput(i
);
178 output
->GetUpdateExtent(tempExtent
);
179 output
->ShallowCopy(StoredOutputs
->GetOutput(i
));
180 output
->SetUpdateExtent(tempExtent
);
183 if (UpdateGUIOld
== GetUpdateGUI())
187 for (int i
= 0; i
< GetNumberOfOutputs(); i
++)
189 vtkDataObject
* tmp
= GetOutput(i
);
190 vtkDataObject
* output
= tmp
->NewInstance();
191 output
->ShallowCopy(tmp
);
192 StoredOutputs
->SetNthOutput(i
, output
);
198 UpdateGUIOld
= GetUpdateGUI();
202 void vtkFoamReader::SetFileName(const char *name
)
204 if (name
&& !FileName
|| (FileName
&& !strcmp(FileName
,name
)))
208 FileName
= new char[strlen(name
) + 1];
209 strcpy(FileName
, name
);
214 vtkErrorMacro("Changing case is not currently supported.\nPlease delete reader and create a new one for the new case.");
219 if ( FileName && name && (!strcmp(FileName,name)))
224 if (!name && !FileName)
234 FileName = new char[strlen(name) + 1];
235 strcpy(FileName, name);
244 StoredOutputs->Delete();
245 StoredOutputs = NULL;
254 void vtkFoamReader::PrintSelf(ostream
& os
, vtkIndent indent
)
256 Superclass::PrintSelf(os
,indent
);
258 os
<< indent
<< "File Name: "
259 << (FileName
? FileName
: "(none)") << "\n";
263 vtkDataArraySelection
* vtkFoamReader::GetTimeSelection()
265 return TimeSelection
;
268 int vtkFoamReader::GetNumberOfTimeArrays()
270 return TimeSelection
->GetNumberOfArrays();
273 const char* vtkFoamReader::GetTimeArrayName(int index
)
275 return TimeSelection
->GetArrayName(index
);
278 int vtkFoamReader::GetTimeArrayStatus(const char* name
)
280 return TimeSelection
->ArrayIsEnabled(name
);
283 void vtkFoamReader::SetTimeArrayStatus(const char* name
, int status
)
287 TimeSelection
->EnableArray(name
);
291 TimeSelection
->DisableArray(name
);
295 vtkDataArraySelection
* vtkFoamReader::GetRegionSelection()
297 return RegionSelection
;
300 int vtkFoamReader::GetNumberOfRegionArrays()
302 return RegionSelection
->GetNumberOfArrays();
305 const char* vtkFoamReader::GetRegionArrayName(int index
)
307 return RegionSelection
->GetArrayName(index
);
310 int vtkFoamReader::GetRegionArrayStatus(const char* name
)
312 return RegionSelection
->ArrayIsEnabled(name
);
315 void vtkFoamReader::SetRegionArrayStatus(const char* name
, int status
)
319 RegionSelection
->EnableArray(name
);
323 RegionSelection
->DisableArray(name
);
328 vtkDataArraySelection
* vtkFoamReader::GetVolFieldSelection()
330 return VolFieldSelection
;
333 int vtkFoamReader::GetNumberOfVolFieldArrays()
335 return VolFieldSelection
->GetNumberOfArrays();
338 const char* vtkFoamReader::GetVolFieldArrayName(int index
)
340 return VolFieldSelection
->GetArrayName(index
);
343 int vtkFoamReader::GetVolFieldArrayStatus(const char* name
)
345 return VolFieldSelection
->ArrayIsEnabled(name
);
348 void vtkFoamReader::SetVolFieldArrayStatus(const char* name
, int status
)
352 VolFieldSelection
->EnableArray(name
);
356 VolFieldSelection
->DisableArray(name
);
361 vtkDataArraySelection
* vtkFoamReader::GetPointFieldSelection()
363 return PointFieldSelection
;
366 int vtkFoamReader::GetNumberOfPointFieldArrays()
368 return PointFieldSelection
->GetNumberOfArrays();
371 const char* vtkFoamReader::GetPointFieldArrayName(int index
)
373 return PointFieldSelection
->GetArrayName(index
);
376 int vtkFoamReader::GetPointFieldArrayStatus(const char* name
)
378 return PointFieldSelection
->ArrayIsEnabled(name
);
381 void vtkFoamReader::SetPointFieldArrayStatus(const char* name
, int status
)
385 PointFieldSelection
->EnableArray(name
);
389 PointFieldSelection
->DisableArray(name
);
394 void vtkFoamReader::SelectionModifiedCallback
402 static_cast<vtkFoamReader
*>(clientdata
)->SelectionModified();
405 void vtkFoamReader::SelectionModified()
411 // ************************************************************************* //