1 // Copyright (C) 2007-2011 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->SetInput(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->SetInput(theDataSet);
242 //---------------------------------------------------------------
244 IsDataOnPoints(vtkDataSet* theDataSet)
246 theDataSet->Update();
247 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
248 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
252 //---------------------------------------------------------------
254 IsDataOnCells(vtkDataSet* theDataSet)
256 theDataSet->Update();
257 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
258 return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
261 //---------------------------------------------------------------
263 IsElnoData(vtkDataSet* theDataSet)
265 theDataSet->Update();
267 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData() )
268 if ( aDataSetAttributes->GetArray( "ELNO_FIELD" ) != NULL )
271 if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData() )
272 if ( aDataSetAttributes->GetArray( "ELNO_POINT_COORDS" ) != NULL )
279 //---------------------------------------------------------------
281 GetVTKID(vtkDataArray *theIDDataArray, vtkIdType theID, int theEntity)
283 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
284 int aNbTuples = anIntArray->GetNumberOfTuples();
285 int* aPointer = anIntArray->GetPointer(0);
286 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
287 if(*aPointer == theID && *(aPointer + 1) == theEntity){
297 //---------------------------------------------------------------
299 GetObjectID(vtkDataArray *theIDDataArray, vtkIdType theID)
301 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
302 int aNbComp = anIntArray->GetNumberOfComponents();
303 int* aPointer = anIntArray->GetPointer(theID*aNbComp);
310 //---------------------------------------------------------------
312 GetElemVTKID(vtkDataSet *theDataSet, vtkIdType theID, int theEntity)
314 theDataSet->Update();
315 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
316 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
319 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::CELL_ENTITY);
324 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::FACE_ENTITY);
329 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::EDGE_ENTITY);
334 vtkIdType anID = GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
339 return GetVTKID(aDataArray, theID, theEntity);
345 //---------------------------------------------------------------
347 GetElemObjID(vtkDataSet *theDataSet, vtkIdType theID)
349 theDataSet->Update();
350 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
351 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER"))
352 return GetObjectID(aDataArray, theID);
358 //---------------------------------------------------------------
360 GetElemCell(vtkDataSet *theDataSet, vtkIdType theObjID)
362 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
363 return theDataSet->GetCell(aVTKID);
367 //---------------------------------------------------------------
369 GetNodeVTKID(vtkDataSet *theDataSet, vtkIdType theID)
371 theDataSet->Update();
372 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
373 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
374 return GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
380 //---------------------------------------------------------------
382 GetNodeObjID(vtkDataSet *theDataSet, vtkIdType theID)
384 theDataSet->Update();
385 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
386 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
387 return GetObjectID(aDataArray, theID);
393 //---------------------------------------------------------------
394 vtkFloatingPointType*
395 GetNodeCoord(vtkDataSet *theDataSet, vtkIdType theObjID)
397 vtkIdType aVTKID = GetNodeVTKID(theDataSet, theObjID);
398 if ( aVTKID >= 0 ) return theDataSet->GetPoint(aVTKID);
403 //---------------------------------------------------------------
405 GetObjID(vtkDataSet *theDataSet, vtkIdType theID)
407 theDataSet->Update();
408 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
409 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
410 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
411 vtkIdType anID = 2 * theID;
412 TCellID aCellID = anIntArray->GetValue(anID);
413 TLocalPntID aLocalPntID = anIntArray->GetValue(anID + 1);
414 return TGaussPointID(aCellID, aLocalPntID);
417 return TGaussPointID();
421 //---------------------------------------------------------------
423 GetInputCellID(vtkDataSet *theDataSet, vtkIdType theObjID)
425 theDataSet->Update();
426 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
427 if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_INPUTS_MAPPER")){
428 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
429 vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
430 vtkIdType aTupleID = 2 * aVTKID;
431 TCellID aCellID = anIntArray->GetValue(aTupleID);
432 TInputID anInputID = anIntArray->GetValue(aTupleID + 1);
433 return TInputCellID(anInputID, aCellID);
436 return TInputCellID();
440 //---------------------------------------------------------------
442 GetInput(vtkInformationVector **theInputVector,
443 vtkIdType theInputId)
445 if(vtkInformation* anInformation = theInputVector[0]->GetInformationObject(theInputId))
446 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
451 //---------------------------------------------------------------
453 GetOutput(vtkInformationVector *theOutputVector)
455 if(vtkInformation* anInformation = theOutputVector->GetInformationObject(0))
456 return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
460 //---------------------------------------------------------------
462 GetElnoPoints(vtkDataSet *theDataSet, vtkIdType theNodeObjID)
465 if(theDataSet && IsElnoData(theDataSet)) {
466 vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
467 vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER");
469 if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(aDataArray)){
470 int aNbTuples = anIntArray->GetNumberOfTuples();
471 int* aPointer = anIntArray->GetPointer(0);
472 for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){
473 if( *aPointer == theNodeObjID ) {
474 vtkIdList *aCellIds = vtkIdList::New();
475 theDataSet->GetPointCells(aTupleId,aCellIds);
476 if(aCellIds->GetNumberOfIds() == 1){
477 aResult.push_back(TElnoPointID(aTupleId,aCellIds->GetId(0)));
488 //---------------------------------------------------------------
490 ::TTimerLog(int theIsDebug,
491 const std::string& theName):
492 myIsDebug(MYDEBUG + theIsDebug),
493 myTimerLog(vtkTimerLog::New()),
494 myPrefixPrinter(myIsDebug == 1),
497 myCPUTime = myTimerLog->GetCPUTime();
498 BEGMSG(myIsDebug > 1,"{\n");
501 //---------------------------------------------------------------
505 myCPUTime = myTimerLog->GetCPUTime() - myCPUTime;
508 BEGMSG(myIsDebug,"} = "<<myCPUTime<<" secs ("<<myName<<")\n");
510 BEGMSG(myIsDebug,myName<<" takes "<<myCPUTime<<" secs\n");
513 myTimerLog->Delete();
518 //---------------------------------------------------------------