1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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 // VISU OBJECT : interactive object for VISU entities implementation
24 // File : VISU_Convertor_impl.cxx
25 // Author : Alexey PETROV
28 #include "VISU_ConvertorUtils.hxx"
30 #include <vtkCellType.h>
32 #include <vtkUnstructuredGridWriter.h>
33 #include <vtkUnstructuredGrid.h>
35 #include <vtkPolyDataWriter.h>
36 #include <vtkPolyData.h>
38 #include <vtkInformationVector.h>
39 #include <vtkInformation.h>
40 #include <vtkExecutive.h>
42 #include <vtkTimerLog.h>
43 #include <vtkPointData.h>
44 #include <vtkCellData.h>
45 #include <vtkDataSet.h>
46 #include <vtkIdList.h>
48 #include <vtkIntArray.h>
52 static int MYDEBUG = 0;
54 static int MYDEBUG = 0;
59 //---------------------------------------------------------------
61 VISUGeom2NbNodes(EGeometry theGeom)
64 #ifndef VISU_ENABLE_QUADRATIC
93 //---------------------------------------------------------------
95 VISUGeom2VTK(EGeometry theGeom)
109 return VTK_HEXAHEDRON;
115 return VTK_HEXAGONAL_PRISM;
116 case VISU::ePOLYGONE:
118 case VISU::ePOLYEDRE:
119 return VTK_CONVEX_POINT_SET;
121 #ifndef VISU_ENABLE_QUADRATIC
133 return VTK_HEXAHEDRON;
135 return VTK_TRIQUADRATIC_HEXAHEDRON;
144 #if defined(VISU_USE_VTK_QUADRATIC)
145 return VTK_QUADRATIC_EDGE;
147 return VTK_POLY_LINE;
151 #if defined(VISU_USE_VTK_QUADRATIC)
152 return VTK_QUADRATIC_TRIANGLE;
158 #if defined(VISU_USE_VTK_QUADRATIC)
159 return VTK_QUADRATIC_QUAD;
165 #if defined(VISU_USE_VTK_QUADRATIC)
166 return VTK_BIQUADRATIC_QUAD;
172 #if defined(VISU_USE_VTK_QUADRATIC)
173 return VTK_QUADRATIC_TETRA;
175 return VTK_CONVEX_POINT_SET;
179 #if defined(VISU_USE_VTK_QUADRATIC)
180 return VTK_QUADRATIC_HEXAHEDRON;
182 return VTK_CONVEX_POINT_SET;
186 #if defined(VISU_USE_VTK_QUADRATIC)
187 return VTK_TRIQUADRATIC_HEXAHEDRON;
189 return VTK_CONVEX_POINT_SET;
193 #if defined(VISU_USE_VTK_QUADRATIC)
194 return VTK_QUADRATIC_WEDGE;
196 return VTK_CONVEX_POINT_SET;
200 #if defined(VISU_USE_VTK_QUADRATIC)
201 return VTK_QUADRATIC_PYRAMID;
203 return VTK_CONVEX_POINT_SET;
206 #endif //VISU_ENABLE_QUADRATIC
214 //---------------------------------------------------------------
216 WriteToFile(vtkUnstructuredGrid* theDataSet,
217 const std::string& theFileName)
219 vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
220 //aWriter->SetFileType(VTK_BINARY);
221 aWriter->SetFileName(theFileName.c_str());
222 aWriter->SetInputData(theDataSet);
228 //---------------------------------------------------------------
230 WriteToFile(vtkPolyData* theDataSet,
231 const std::string& theFileName)
233 vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
234 //aWriter->SetFileType(VTK_BINARY);
235 aWriter->SetFileName(theFileName.c_str());
236 aWriter->SetInputData(theDataSet);
242 //---------------------------------------------------------------
244 IsDataOnPoints(vtkDataSet* theDataSet)
246 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
247 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
251 //---------------------------------------------------------------
253 IsDataOnCells(vtkDataSet* theDataSet)
255 //theDataSet->Update();
256 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
257 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
260 //---------------------------------------------------------------
262 IsElnoData(vtkDataSet* theDataSet)
264 //theDataSet->Update();
266 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData() )
267 if ( aDataSetAttributes->GetArray( "ELNO_FIELD" ) != NULL )
270 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData() )
271 if ( aDataSetAttributes->GetArray( "ELNO_POINT_COORDS" ) != NULL )
278 //---------------------------------------------------------------
280 GetVTKID(vtkDataArray *theIDDataArray, vtkIdType theID, int theEntity)
282 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
283 int aNbTuples = anIntArray->GetNumberOfTuples();
284 int* aPointer = anIntArray->GetPointer(0);
285 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
286 if(*aPointer == theID && *(aPointer + 1) == theEntity){
296 //---------------------------------------------------------------
298 GetObjectID(vtkDataArray *theIDDataArray, vtkIdType theID)
300 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
301 int aNbComp = anIntArray->GetNumberOfComponents();
302 int* aPointer = anIntArray->GetPointer(theID*aNbComp);
309 //---------------------------------------------------------------
311 GetElemVTKID(vtkDataSet *theDataSet, vtkIdType theID, int theEntity)
313 //theDataSet->Update();
314 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
315 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
318 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::CELL_ENTITY);
323 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::FACE_ENTITY);
328 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::EDGE_ENTITY);
333 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
338 return GetVTKID(aDataArray, theID, theEntity);
344 //---------------------------------------------------------------
346 GetElemObjID(vtkDataSet *theDataSet, vtkIdType theID)
348 //theDataSet->Update();
349 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
350 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER"))
351 return GetObjectID(aDataArray, theID);
357 //---------------------------------------------------------------
359 GetElemCell(vtkDataSet *theDataSet, vtkIdType theObjID)
361 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
362 return theDataSet->GetCell(aVTKID);
366 //---------------------------------------------------------------
368 GetNodeVTKID(vtkDataSet *theDataSet, vtkIdType theID)
370 //theDataSet->Update();
371 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
372 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
373 return GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
379 //---------------------------------------------------------------
381 GetNodeObjID(vtkDataSet *theDataSet, vtkIdType theID)
383 //theDataSet->Update();
384 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
385 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
386 return GetObjectID(aDataArray, theID);
392 //---------------------------------------------------------------
394 GetNodeCoord(vtkDataSet *theDataSet, vtkIdType theObjID)
396 vtkIdType aVTKID = GetNodeVTKID(theDataSet, theObjID);
397 if ( aVTKID >= 0 ) return theDataSet->GetPoint(aVTKID);
402 //---------------------------------------------------------------
404 GetObjID(vtkDataSet *theDataSet, vtkIdType theID)
406 //theDataSet->Update();
407 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
408 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
409 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
410 vtkIdType anID = 2 * theID;
411 TCellID aCellID = anIntArray->GetValue(anID);
412 TLocalPntID aLocalPntID = anIntArray->GetValue(anID + 1);
413 return TGaussPointID(aCellID, aLocalPntID);
416 return TGaussPointID();
420 //---------------------------------------------------------------
422 GetInputCellID(vtkDataSet *theDataSet, vtkIdType theObjID)
424 //theDataSet->Update();
425 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
426 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_INPUTS_MAPPER")){
427 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
428 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
429 vtkIdType aTupleID = 2 * aVTKID;
430 TCellID aCellID = anIntArray->GetValue(aTupleID);
431 TInputID anInputID = anIntArray->GetValue(aTupleID + 1);
432 return TInputCellID(anInputID, aCellID);
435 return TInputCellID();
439 //---------------------------------------------------------------
441 GetInput(vtkInformationVector **theInputVector,
442 vtkIdType theInputId)
444 if(vtkInformation* anInformation = theInputVector[0]->GetInformationObject(theInputId))
445 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
450 //---------------------------------------------------------------
452 GetOutput(vtkInformationVector *theOutputVector)
454 if(vtkInformation* anInformation = theOutputVector->GetInformationObject(0))
455 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
459 //---------------------------------------------------------------
461 GetElnoPoints(vtkDataSet *theDataSet, vtkIdType theNodeObjID)
464 if(theDataSet && IsElnoData(theDataSet)) {
465 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
466 vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER");
468 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
469 int aNbTuples = anIntArray->GetNumberOfTuples();
470 int* aPointer = anIntArray->GetPointer(0);
471 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
472 if( *aPointer == theNodeObjID ) {
473 vtkIdList *aCellIds = vtkIdList::New();
474 theDataSet->GetPointCells(aTupleId,aCellIds);
475 if(aCellIds->GetNumberOfIds() == 1){
476 aResult.push_back(TElnoPointID(aTupleId,aCellIds->GetId(0)));
487 //---------------------------------------------------------------
489 ::TTimerLog(int theIsDebug,
490 const std::string& theName):
491 myIsDebug(MYDEBUG + theIsDebug),
492 myTimerLog(vtkTimerLog::New()),
493 myPrefixPrinter(myIsDebug == 1),
496 myCPUTime = myTimerLog->GetCPUTime();
497 BEGMSG(myIsDebug > 1,"{\n");
500 //---------------------------------------------------------------
504 myCPUTime = myTimerLog->GetCPUTime() - myCPUTime;
507 BEGMSG(myIsDebug,"} = "<<myCPUTime<<" secs ("<<myName<<")\n");
509 BEGMSG(myIsDebug,myName<<" takes "<<myCPUTime<<" secs\n");
512 myTimerLog->Delete();
517 //---------------------------------------------------------------