1 // Copyright (C) 2007-2008 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
22 // VISU OBJECT : interactive object for VISU entities implementation
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>
45 #include <vtkIdList.h>
47 #include <vtkIntArray.h>
51 static int MYDEBUG = 0;
53 static int MYDEBUG = 0;
58 //---------------------------------------------------------------
60 VISUGeom2NbNodes(EGeometry theGeom)
63 #ifndef VISU_ENABLE_QUADRATIC
88 //---------------------------------------------------------------
90 VISUGeom2VTK(EGeometry theGeom)
104 return VTK_HEXAHEDRON;
110 case VISU::ePOLYGONE:
112 case VISU::ePOLYEDRE:
113 return VTK_CONVEX_POINT_SET;
115 #ifndef VISU_ENABLE_QUADRATIC
125 return VTK_HEXAHEDRON;
134 #if defined(VTK_QUADRATIC_EDGE) && defined(VISU_USE_VTK_QUADRATIC)
135 return VTK_QUADRATIC_EDGE;
137 return VTK_POLY_LINE;
141 #if defined(VTK_QUADRATIC_TRIANGLE) && defined(VISU_USE_VTK_QUADRATIC)
142 return VTK_QUADRATIC_TRIANGLE;
148 #if defined(VTK_QUADRATIC_QUAD) && defined(VISU_USE_VTK_QUADRATIC)
149 return VTK_QUADRATIC_QUAD;
155 #if defined(VTK_QUADRATIC_TETRA) && defined(VISU_USE_VTK_QUADRATIC)
156 return VTK_QUADRATIC_TETRA;
158 return VTK_CONVEX_POINT_SET;
162 #if defined(VTK_QUADRATIC_HEXAHEDRON) && defined(VISU_USE_VTK_QUADRATIC)
163 return VTK_QUADRATIC_HEXAHEDRON;
165 return VTK_CONVEX_POINT_SET;
169 #if defined(VTK_QUADRATIC_WEDGE) && defined(VISU_USE_VTK_QUADRATIC)
170 return VTK_QUADRATIC_WEDGE;
172 return VTK_CONVEX_POINT_SET;
176 #if defined(VTK_QUADRATIC_PYRAMID) && defined(VISU_USE_VTK_QUADRATIC)
177 return VTK_QUADRATIC_PYRAMID;
179 return VTK_CONVEX_POINT_SET;
182 #endif //VISU_ENABLE_QUADRATIC
190 //---------------------------------------------------------------
192 WriteToFile(vtkUnstructuredGrid* theDataSet,
193 const std::string& theFileName)
195 vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
196 //aWriter->SetFileType(VTK_BINARY);
197 aWriter->SetFileName(theFileName.c_str());
198 aWriter->SetInput(theDataSet);
204 //---------------------------------------------------------------
206 WriteToFile(vtkPolyData* theDataSet,
207 const std::string& theFileName)
209 vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
210 //aWriter->SetFileType(VTK_BINARY);
211 aWriter->SetFileName(theFileName.c_str());
212 aWriter->SetInput(theDataSet);
218 //---------------------------------------------------------------
220 IsDataOnPoints(vtkDataSet* theDataSet)
222 theDataSet->Update();
223 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
224 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
228 //---------------------------------------------------------------
230 IsDataOnCells(vtkDataSet* theDataSet)
232 theDataSet->Update();
233 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
234 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
237 //---------------------------------------------------------------
239 IsElnoData(vtkDataSet* theDataSet)
241 theDataSet->Update();
243 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData() )
244 if ( aDataSetAttributes->GetArray( "ELNO_FIELD" ) != NULL )
247 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData() )
248 if ( aDataSetAttributes->GetArray( "ELNO_POINT_COORDS" ) != NULL )
255 //---------------------------------------------------------------
257 GetVTKID(vtkDataArray *theIDDataArray, vtkIdType theID, int theEntity)
259 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
260 int aNbTuples = anIntArray->GetNumberOfTuples();
261 int* aPointer = anIntArray->GetPointer(0);
262 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
263 if(*aPointer == theID && *(aPointer + 1) == theEntity){
273 //---------------------------------------------------------------
275 GetObjectID(vtkDataArray *theIDDataArray, vtkIdType theID)
277 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
278 int aNbComp = anIntArray->GetNumberOfComponents();
279 int* aPointer = anIntArray->GetPointer(theID*aNbComp);
286 //---------------------------------------------------------------
288 GetElemVTKID(vtkDataSet *theDataSet, vtkIdType theID, int theEntity)
290 theDataSet->Update();
291 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
292 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
295 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::CELL_ENTITY);
300 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::FACE_ENTITY);
305 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::EDGE_ENTITY);
310 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
315 return GetVTKID(aDataArray, theID, theEntity);
321 //---------------------------------------------------------------
323 GetElemObjID(vtkDataSet *theDataSet, vtkIdType theID)
325 theDataSet->Update();
326 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
327 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER"))
328 return GetObjectID(aDataArray, theID);
334 //---------------------------------------------------------------
336 GetElemCell(vtkDataSet *theDataSet, vtkIdType theObjID)
338 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
339 return theDataSet->GetCell(aVTKID);
343 //---------------------------------------------------------------
345 GetNodeVTKID(vtkDataSet *theDataSet, vtkIdType theID)
347 theDataSet->Update();
348 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
349 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
350 return GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
356 //---------------------------------------------------------------
358 GetNodeObjID(vtkDataSet *theDataSet, vtkIdType theID)
360 theDataSet->Update();
361 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
362 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
363 return GetObjectID(aDataArray, theID);
369 //---------------------------------------------------------------
370 vtkFloatingPointType*
371 GetNodeCoord(vtkDataSet *theDataSet, vtkIdType theObjID)
373 vtkIdType aVTKID = GetNodeVTKID(theDataSet, theObjID);
374 if ( aVTKID >= 0 ) return theDataSet->GetPoint(aVTKID);
379 //---------------------------------------------------------------
381 GetObjID(vtkDataSet *theDataSet, vtkIdType theID)
383 theDataSet->Update();
384 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
385 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
386 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
387 vtkIdType anID = 2 * theID;
388 TCellID aCellID = anIntArray->GetValue(anID);
389 TLocalPntID aLocalPntID = anIntArray->GetValue(anID + 1);
390 return TGaussPointID(aCellID, aLocalPntID);
393 return TGaussPointID();
397 //---------------------------------------------------------------
399 GetInputCellID(vtkDataSet *theDataSet, vtkIdType theObjID)
401 theDataSet->Update();
402 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
403 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_INPUTS_MAPPER")){
404 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
405 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
406 vtkIdType aTupleID = 2 * aVTKID;
407 TCellID aCellID = anIntArray->GetValue(aTupleID);
408 TInputID anInputID = anIntArray->GetValue(aTupleID + 1);
409 return TInputCellID(anInputID, aCellID);
412 return TInputCellID();
416 //---------------------------------------------------------------
418 GetInput(vtkInformationVector **theInputVector,
419 vtkIdType theInputId)
421 if(vtkInformation* anInformation = theInputVector[0]->GetInformationObject(theInputId))
422 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
427 //---------------------------------------------------------------
429 GetOutput(vtkInformationVector *theOutputVector)
431 if(vtkInformation* anInformation = theOutputVector->GetInformationObject(0))
432 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
436 //---------------------------------------------------------------
438 GetElnoPoints(vtkDataSet *theDataSet, vtkIdType theNodeObjID)
441 if(theDataSet && IsElnoData(theDataSet)) {
442 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
443 vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER");
445 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
446 int aNbTuples = anIntArray->GetNumberOfTuples();
447 int* aPointer = anIntArray->GetPointer(0);
448 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
449 if( *aPointer == theNodeObjID ) {
450 vtkIdList *aCellIds = vtkIdList::New();
451 theDataSet->GetPointCells(aTupleId,aCellIds);
452 if(aCellIds->GetNumberOfIds() == 1){
453 aResult.push_back(TElnoPointID(aTupleId,aCellIds->GetId(0)));
464 //---------------------------------------------------------------
466 ::TTimerLog(int theIsDebug,
467 const std::string& theName):
468 myIsDebug(MYDEBUG + theIsDebug),
469 myTimerLog(vtkTimerLog::New()),
470 myPrefixPrinter(myIsDebug == 1),
473 myCPUTime = myTimerLog->GetCPUTime();
474 BEGMSG(myIsDebug > 1,"{\n");
477 //---------------------------------------------------------------
481 myCPUTime = myTimerLog->GetCPUTime() - myCPUTime;
484 BEGMSG(myIsDebug,"} = "<<myCPUTime<<" secs ("<<myName<<")\n");
486 BEGMSG(myIsDebug,myName<<" takes "<<myCPUTime<<" secs\n");
489 myTimerLog->Delete();
494 //---------------------------------------------------------------