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