]> SALOME platform Git repositories - modules/visu.git/blob - src/CONVERTOR/VISU_ConvertorUtils.cxx
Salome HOME
72ce30487c9145bb092cc518309c3364d2104cfc
[modules/visu.git] / src / CONVERTOR / VISU_ConvertorUtils.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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.
10 //
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.
15 //
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
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  VISU OBJECT : interactive object for VISU entities implementation
23 //  File   : VISU_Convertor_impl.cxx
24 //  Author : Alexey PETROV
25 //  Module : VISU
26 //
27 #include "VISU_ConvertorUtils.hxx"
28
29 #include <vtkCellType.h>
30
31 #include <vtkUnstructuredGridWriter.h>
32 #include <vtkUnstructuredGrid.h>
33
34 #include <vtkPolyDataWriter.h>
35 #include <vtkPolyData.h>
36
37 #include <vtkInformationVector.h>
38 #include <vtkInformation.h>
39 #include <vtkExecutive.h>
40
41 #include <vtkTimerLog.h>
42 #include <vtkPointData.h>
43 #include <vtkCellData.h>
44 #include <vtkDataSet.h>
45 #include <vtkIdList.h>
46
47 #include <vtkIntArray.h>
48 #include <algorithm>
49
50 #ifdef _DEBUG_
51 static int MYDEBUG = 0;
52 #else
53 static int MYDEBUG = 0;
54 #endif
55
56 namespace VISU
57 {
58   //---------------------------------------------------------------
59   vtkIdType
60   VISUGeom2NbNodes(EGeometry theGeom)
61   { 
62     switch(theGeom){
63 #ifndef VISU_ENABLE_QUADRATIC
64     case VISU::eSEG3: 
65       return 2;
66     case VISU::eTRIA6: 
67       return 3;
68     case VISU::eQUAD8: 
69       return 4;
70     case VISU::eTETRA10: 
71       return 4;
72     case VISU::eHEXA20: 
73       return 8;
74     case VISU::ePENTA15: 
75       return 6;
76     case VISU::ePYRA13: 
77       return 5;
78 #endif
79     case VISU::ePOLYGONE: 
80     case VISU::ePOLYEDRE: 
81       return -1;
82     default:
83       return theGeom % 100;
84     }
85   }
86
87
88   //---------------------------------------------------------------
89   vtkIdType
90   VISUGeom2VTK(EGeometry theGeom)
91   { 
92     switch(theGeom){
93     case VISU::ePOINT1: 
94       return VTK_VERTEX;
95     case VISU::eSEG2: 
96       return VTK_LINE;
97     case VISU::eTRIA3: 
98       return VTK_TRIANGLE;
99     case VISU::eQUAD4: 
100       return VTK_QUAD;
101     case VISU::eTETRA4: 
102       return VTK_TETRA;
103     case VISU::eHEXA8: 
104       return VTK_HEXAHEDRON;
105     case VISU::ePENTA6: 
106       return VTK_WEDGE;
107     case VISU::ePYRA5: 
108       return VTK_PYRAMID;
109
110     case VISU::ePOLYGONE: 
111       return VTK_POLYGON;
112     case VISU::ePOLYEDRE: 
113       return VTK_CONVEX_POINT_SET;
114
115 #ifndef VISU_ENABLE_QUADRATIC
116     case VISU::eSEG3: 
117       return VTK_LINE;
118     case VISU::eTRIA6: 
119       return VTK_TRIANGLE;
120     case VISU::eQUAD8: 
121       return VTK_QUAD;
122     case VISU::eTETRA10: 
123       return VTK_TETRA;
124     case VISU::eHEXA20: 
125       return VTK_HEXAHEDRON;
126     case VISU::ePENTA15: 
127       return VTK_WEDGE;
128     case VISU::ePYRA13: 
129       return VTK_PYRAMID;
130
131 #else
132
133     case VISU::eSEG3: 
134 #if defined(VTK_QUADRATIC_EDGE) && defined(VISU_USE_VTK_QUADRATIC)
135       return VTK_QUADRATIC_EDGE;
136 #else
137       return VTK_POLY_LINE;
138 #endif
139
140     case VISU::eTRIA6: 
141 #if defined(VTK_QUADRATIC_TRIANGLE) && defined(VISU_USE_VTK_QUADRATIC)
142       return VTK_QUADRATIC_TRIANGLE;
143 #else
144       return VTK_POLYGON;
145 #endif
146
147     case VISU::eQUAD8: 
148 #if defined(VTK_QUADRATIC_QUAD) && defined(VISU_USE_VTK_QUADRATIC)
149       return VTK_QUADRATIC_QUAD;
150 #else
151       return VTK_POLYGON;
152 #endif
153
154     case VISU::eTETRA10: 
155 #if defined(VTK_QUADRATIC_TETRA) && defined(VISU_USE_VTK_QUADRATIC)
156       return VTK_QUADRATIC_TETRA;
157 #else
158       return VTK_CONVEX_POINT_SET;
159 #endif
160
161     case VISU::eHEXA20: 
162 #if defined(VTK_QUADRATIC_HEXAHEDRON) && defined(VISU_USE_VTK_QUADRATIC)
163       return VTK_QUADRATIC_HEXAHEDRON;
164 #else
165       return VTK_CONVEX_POINT_SET;
166 #endif
167
168     case VISU::ePENTA15: 
169 #if defined(VTK_QUADRATIC_WEDGE) && defined(VISU_USE_VTK_QUADRATIC)
170       return VTK_QUADRATIC_WEDGE;
171 #else
172       return VTK_CONVEX_POINT_SET;
173 #endif
174
175     case VISU::ePYRA13: 
176 #if defined(VTK_QUADRATIC_PYRAMID) && defined(VISU_USE_VTK_QUADRATIC)
177       return VTK_QUADRATIC_PYRAMID;
178 #else
179       return VTK_CONVEX_POINT_SET;
180 #endif
181
182 #endif //VISU_ENABLE_QUADRATIC
183
184     default:
185       return -1;
186     }
187   }
188
189
190   //---------------------------------------------------------------
191   void 
192   WriteToFile(vtkUnstructuredGrid* theDataSet, 
193               const std::string& theFileName)
194   {
195     vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
196     //aWriter->SetFileType(VTK_BINARY);
197     aWriter->SetFileName(theFileName.c_str());
198     aWriter->SetInput(theDataSet);
199     aWriter->Write();
200     aWriter->Delete();
201   }
202
203
204   //---------------------------------------------------------------
205   void 
206   WriteToFile(vtkPolyData* theDataSet, 
207               const std::string& theFileName)
208   {
209     vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
210     //aWriter->SetFileType(VTK_BINARY);
211     aWriter->SetFileName(theFileName.c_str());
212     aWriter->SetInput(theDataSet);
213     aWriter->Write();
214     aWriter->Delete();
215   }
216
217
218   //---------------------------------------------------------------
219   bool 
220   IsDataOnPoints(vtkDataSet* theDataSet)
221   {
222     theDataSet->Update();
223     vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
224     return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
225   }
226
227
228   //---------------------------------------------------------------
229   bool 
230   IsDataOnCells(vtkDataSet* theDataSet)
231   {
232     theDataSet->Update();
233     vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
234     return aDataSetAttributes->GetArray("VISU_FIELD") != NULL;
235   }
236
237   //---------------------------------------------------------------
238   bool 
239   IsElnoData(vtkDataSet* theDataSet)
240   {
241     theDataSet->Update();
242
243     if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData() )
244       if ( aDataSetAttributes->GetArray( "ELNO_FIELD" )  != NULL )
245         return true;
246
247     if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData() )
248       if ( aDataSetAttributes->GetArray( "ELNO_POINT_COORDS" )  != NULL )
249         return true;
250
251     return false;
252   }
253
254
255   //---------------------------------------------------------------
256   vtkIdType
257   GetVTKID(vtkDataArray *theIDDataArray, vtkIdType theID, int theEntity)
258   {
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){
264           return aTupleId;
265         }
266         aPointer += 2;
267       }
268     }
269     return -1;
270   }
271
272
273   //---------------------------------------------------------------
274   vtkIdType
275   GetObjectID(vtkDataArray *theIDDataArray, vtkIdType theID)
276   {
277     if(vtkIntArray *anIntArray = dynamic_cast<vtkIntArray*>(theIDDataArray)){
278       int aNbComp = anIntArray->GetNumberOfComponents();
279       int* aPointer = anIntArray->GetPointer(theID*aNbComp);
280       return *aPointer;
281     }
282     return -1;
283   }
284
285
286   //---------------------------------------------------------------
287   vtkIdType
288   GetElemVTKID(vtkDataSet *theDataSet, vtkIdType theID, int theEntity)
289   {
290     theDataSet->Update();
291     vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
292     if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER")){
293       if(theEntity < 0){
294         {
295           vtkIdType anID = GetVTKID(aDataArray, theID, VISU::CELL_ENTITY);
296           if(anID != -1)
297             return anID;
298         }
299         {
300           vtkIdType anID = GetVTKID(aDataArray, theID, VISU::FACE_ENTITY);
301           if(anID != -1)
302             return anID;
303         }
304         {
305           vtkIdType anID = GetVTKID(aDataArray, theID, VISU::EDGE_ENTITY);
306           if(anID != -1)
307             return anID;
308         }
309         {
310           vtkIdType anID = GetVTKID(aDataArray, theID, VISU::NODE_ENTITY);
311           if(anID != -1)
312             return anID;
313         }
314       }else
315         return GetVTKID(aDataArray, theID, theEntity);
316     }
317     return -1;
318   }
319
320
321   //---------------------------------------------------------------
322   vtkIdType
323   GetElemObjID(vtkDataSet *theDataSet, vtkIdType theID)
324   {
325     theDataSet->Update();
326     vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData();
327     if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_CELLS_MAPPER"))
328       return GetObjectID(aDataArray, theID);
329
330     return -1;
331   }
332
333
334   //---------------------------------------------------------------
335   vtkCell* 
336   GetElemCell(vtkDataSet *theDataSet, vtkIdType  theObjID)
337   {
338     vtkIdType aVTKID = GetElemVTKID(theDataSet, theObjID);
339     return theDataSet->GetCell(aVTKID);
340   }
341
342
343   //---------------------------------------------------------------
344   vtkIdType
345   GetNodeVTKID(vtkDataSet *theDataSet, vtkIdType theID)
346   {
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);
351
352     return -1;
353   }
354
355
356   //---------------------------------------------------------------
357   vtkIdType
358   GetNodeObjID(vtkDataSet *theDataSet, vtkIdType theID)
359   {
360     theDataSet->Update();
361     vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
362     if(vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER"))
363       return GetObjectID(aDataArray, theID);
364
365     return -1;
366   }
367
368
369   //---------------------------------------------------------------
370   vtkFloatingPointType* 
371   GetNodeCoord(vtkDataSet *theDataSet, vtkIdType theObjID)
372   {
373     vtkIdType aVTKID = GetNodeVTKID(theDataSet, theObjID);
374     if ( aVTKID >= 0 ) return theDataSet->GetPoint(aVTKID);
375     return 0;
376   }
377
378
379   //---------------------------------------------------------------
380   TGaussPointID
381   GetObjID(vtkDataSet *theDataSet, vtkIdType theID)
382   {
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);
391       }
392     }
393     return TGaussPointID();
394   }
395
396
397   //---------------------------------------------------------------
398   TInputCellID
399   GetInputCellID(vtkDataSet *theDataSet, vtkIdType theObjID)
400   {
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);
410       }
411     }
412     return TInputCellID();
413   }
414
415
416   //---------------------------------------------------------------
417   vtkDataSet*
418   GetInput(vtkInformationVector **theInputVector, 
419            vtkIdType theInputId)
420   {
421     if(vtkInformation* anInformation = theInputVector[0]->GetInformationObject(theInputId))
422       return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
423     return NULL;
424   }
425
426
427   //---------------------------------------------------------------
428   vtkDataSet*
429   GetOutput(vtkInformationVector *theOutputVector)
430   {
431     if(vtkInformation* anInformation = theOutputVector->GetInformationObject(0))
432       return vtkDataSet::SafeDownCast(anInformation->Get(vtkDataObject::DATA_OBJECT()));
433     return NULL;
434   }
435
436   //---------------------------------------------------------------
437   TElnoPoints
438   GetElnoPoints(vtkDataSet *theDataSet, vtkIdType theNodeObjID)
439   {
440     TElnoPoints aResult;
441     if(theDataSet && IsElnoData(theDataSet)) {
442       vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData();
443       vtkDataArray *aDataArray = aDataSetAttributes->GetArray("VISU_POINTS_MAPPER");
444       if(aDataArray){
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)));
454               }
455             }
456             aPointer += 2;
457           }
458         }
459       }
460     }
461     return aResult;
462   }
463
464   //---------------------------------------------------------------
465   TTimerLog
466   ::TTimerLog(int theIsDebug,
467               const std::string& theName):
468     myIsDebug(MYDEBUG + theIsDebug),
469     myTimerLog(vtkTimerLog::New()),
470     myPrefixPrinter(myIsDebug == 1),
471     myName(theName)
472   {
473     myCPUTime = myTimerLog->GetCPUTime();
474     BEGMSG(myIsDebug > 1,"{\n");
475   }
476
477   //---------------------------------------------------------------
478   TTimerLog
479   ::~TTimerLog()
480   {
481     myCPUTime = myTimerLog->GetCPUTime() - myCPUTime;
482
483     if(myIsDebug > 1){
484       BEGMSG(myIsDebug,"} = "<<myCPUTime<<" secs ("<<myName<<")\n");
485     }else{
486       BEGMSG(myIsDebug,myName<<" takes "<<myCPUTime<<" secs\n");
487     }
488     
489     myTimerLog->Delete();
490     myTimerLog = NULL;
491   }
492
493
494   //---------------------------------------------------------------
495 }