1 // VISU OBJECT : interactive object for VISU entities implementation
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File : VISU_Convertor_impl.cxx
24 // Author : Alexey PETROV
27 #include "VISU_ConvertorUtils.hxx"
29 #include <vtkCellType.h>
31 #include <vtkUnstructuredGridWriter.h>
32 #include <vtkUnstructuredGrid.h>
34 #include <vtkPolyDataWriter.h>
35 #include <vtkPolyData.h>
37 #include <vtkInformationVector.h>
38 #include <vtkInformation.h>
39 #include <vtkExecutive.h>
41 #include <vtkTimerLog.h>
42 #include <vtkPointData.h>
43 #include <vtkCellData.h>
44 #include <vtkDataSet.h>
46 #include <vtkIntArray.h>
50 static int MYDEBUG = 0;
52 static int MYDEBUG = 0;
57 //---------------------------------------------------------------
59 VISUGeom2NbNodes(EGeometry theGeom)
62 #ifndef VISU_ENABLE_QUADRATIC
87 //---------------------------------------------------------------
89 VISUGeom2VTK(EGeometry theGeom)
103 return VTK_HEXAHEDRON;
109 case VISU::ePOLYGONE:
111 case VISU::ePOLYEDRE:
112 return VTK_CONVEX_POINT_SET;
114 #ifndef VISU_ENABLE_QUADRATIC
124 return VTK_HEXAHEDRON;
133 #if defined(VTK_QUADRATIC_EDGE) && defined(VISU_USE_VTK_QUADRATIC)
134 return VTK_QUADRATIC_EDGE;
136 return VTK_POLY_LINE;
140 #if defined(VTK_QUADRATIC_TRIANGLE) && defined(VISU_USE_VTK_QUADRATIC)
141 return VTK_QUADRATIC_TRIANGLE;
147 #if defined(VTK_QUADRATIC_QUAD) && defined(VISU_USE_VTK_QUADRATIC)
148 return VTK_QUADRATIC_QUAD;
154 #if defined(VTK_QUADRATIC_TETRA) && defined(VISU_USE_VTK_QUADRATIC)
155 return VTK_QUADRATIC_TETRA;
157 return VTK_CONVEX_POINT_SET;
161 #if defined(VTK_QUADRATIC_HEXAHEDRON) && defined(VISU_USE_VTK_QUADRATIC)
162 return VTK_QUADRATIC_HEXAHEDRON;
164 return VTK_CONVEX_POINT_SET;
168 #if defined(VTK_QUADRATIC_WEDGE) && defined(VISU_USE_VTK_QUADRATIC)
169 return VTK_QUADRATIC_WEDGE;
171 return VTK_CONVEX_POINT_SET;
175 #if defined(VTK_QUADRATIC_PYRAMID) && defined(VISU_USE_VTK_QUADRATIC)
176 return VTK_QUADRATIC_PYRAMID;
178 return VTK_CONVEX_POINT_SET;
181 #endif //VISU_ENABLE_QUADRATIC
189 //---------------------------------------------------------------
191 WriteToFile(vtkUnstructuredGrid* theDataSet,
192 const std::string& theFileName)
194 vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
195 //aWriter->SetFileType(VTK_BINARY);
196 aWriter->SetFileName(theFileName.c_str());
197 aWriter->SetInput(theDataSet);
203 //---------------------------------------------------------------
205 WriteToFile(vtkPolyData* theDataSet,
206 const std::string& theFileName)
208 vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
209 //aWriter->SetFileType(VTK_BINARY);
210 aWriter->SetFileName(theFileName.c_str());
211 aWriter->SetInput(theDataSet);
217 //---------------------------------------------------------------
219 IsDataOnPoints(vtkDataSet* theDataSet)
221 theDataSet->Update();
222 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
223 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
227 //---------------------------------------------------------------
229 IsDataOnCells(vtkDataSet* theDataSet)
231 theDataSet->Update();
232 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
233 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
237 //---------------------------------------------------------------
239 GetVTKID(vtkDataArray *theIDDataArray, vtkIdType theID, int theEntity)
241 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
242 int aNbTuples = anIntArray->GetNumberOfTuples();
243 int* aPointer = anIntArray->GetPointer(0);
244 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
245 if(*aPointer == theID && *(aPointer + 1) == theEntity){
255 //---------------------------------------------------------------
257 GetObjectID(vtkDataArray *theIDDataArray, vtkIdType theID)
259 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
260 int aNbComp = anIntArray->GetNumberOfComponents();
261 int* aPointer = anIntArray->GetPointer(theID*aNbComp);
268 //---------------------------------------------------------------
270 GetElemVTKID(vtkDataSet *theDataSet, vtkIdType theID, int theEntity)
272 theDataSet->Update();
273 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
274 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
277 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::CELL_ENTITY);
282 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::FACE_ENTITY);
287 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::EDGE_ENTITY);
292 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
297 return GetVTKID(aDataArray, theID, theEntity);
303 //---------------------------------------------------------------
305 GetElemObjID(vtkDataSet *theDataSet, vtkIdType theID)
307 theDataSet->Update();
308 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
309 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER"))
310 return GetObjectID(aDataArray, theID);
316 //---------------------------------------------------------------
318 GetElemCell(vtkDataSet *theDataSet, vtkIdType theObjID)
320 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
321 return theDataSet->GetCell(aVTKID);
325 //---------------------------------------------------------------
327 GetNodeVTKID(vtkDataSet *theDataSet, vtkIdType theID)
329 theDataSet->Update();
330 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
331 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
332 return GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
338 //---------------------------------------------------------------
340 GetNodeObjID(vtkDataSet *theDataSet, vtkIdType theID)
342 theDataSet->Update();
343 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
344 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
345 return GetObjectID(aDataArray, theID);
351 //---------------------------------------------------------------
352 vtkFloatingPointType*
353 GetNodeCoord(vtkDataSet *theDataSet, vtkIdType theObjID)
355 vtkIdType aVTKID = GetNodeVTKID(theDataSet, theObjID);
356 return theDataSet->GetPoint(aVTKID);
360 //---------------------------------------------------------------
362 GetObjID(vtkDataSet *theDataSet, vtkIdType theID)
364 theDataSet->Update();
365 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
366 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
367 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
368 vtkIdType anID = 2 * theID;
369 TCellID aCellID = anIntArray->GetValue(anID);
370 TLocalPntID aLocalPntID = anIntArray->GetValue(anID + 1);
371 return TGaussPointID(aCellID, aLocalPntID);
374 return TGaussPointID();
378 //---------------------------------------------------------------
380 GetInputCellID(vtkDataSet *theDataSet, vtkIdType theObjID)
382 theDataSet->Update();
383 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
384 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_INPUTS_MAPPER")){
385 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
386 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
387 vtkIdType aTupleID = 2 * aVTKID;
388 TCellID aCellID = anIntArray->GetValue(aTupleID);
389 TInputID anInputID = anIntArray->GetValue(aTupleID + 1);
390 return TInputCellID(anInputID, aCellID);
393 return TInputCellID();
397 //---------------------------------------------------------------
399 GetInput(vtkInformationVector **theInputVector,
400 vtkIdType theInputId)
402 if(vtkInformation* anInformation = theInputVector[0]->GetInformationObject(theInputId))
403 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
408 //---------------------------------------------------------------
410 GetOutput(vtkInformationVector *theOutputVector)
412 if(vtkInformation* anInformation = theOutputVector->GetInformationObject(0))
413 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
418 //---------------------------------------------------------------
420 ::TTimerLog(int theIsDebug,
421 const std::string& theName):
422 myIsDebug(MYDEBUG + theIsDebug),
423 myTimerLog(vtkTimerLog::New()),
424 myPrefixPrinter(myIsDebug == 1),
427 myCPUTime = myTimerLog->GetCPUTime();
428 BEGMSG(myIsDebug > 1,"{\n");
431 //---------------------------------------------------------------
435 myCPUTime = myTimerLog->GetCPUTime() - myCPUTime;
438 BEGMSG(myIsDebug,"} = "<<myCPUTime<<" secs ("<<myName<<")\n");
440 BEGMSG(myIsDebug,myName<<" takes "<<myCPUTime<<" secs\n");
443 myTimerLog->Delete();
448 //---------------------------------------------------------------