2 #include "MEDMEM_VtkMeshDriver.hxx"
4 #include "MEDMEM_DriversDef.hxx"
6 #include "MEDMEM_Family.hxx"
7 #include "MEDMEM_Group.hxx"
8 #include "MEDMEM_Coordinate.hxx"
9 #include "MEDMEM_Connectivity.hxx"
10 #include "MEDMEM_Mesh.hxx"
11 #include "MEDMEM_CellModel.hxx"
12 #include "MEDMEM_Grid.hxx"
15 using namespace MEDMEM;
17 VTK_MESH_DRIVER::VTK_MESH_DRIVER(): GENDRIVER(),
18 _ptrMesh((MESH * const)MED_NULL)
20 _vtkFile = new ofstream();
21 // What about _id in Gendriver ?
25 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName,
27 GENDRIVER(fileName,MED_WRONLY),
30 const char * LOC = "VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName, MESH * ptrMesh) : " ;
32 // Send an exception because a VTK_MESH_DRIVER object cannot be instantied
33 // from a file and there is no read for that kind of driver
35 // throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "This driver is only used to write in VTK format So thie object can not be instantied using a file!"));
37 // _ptrMesh->addDriver(*this); // OU RECUPERER L'ID.
38 MESSAGE(LOC << "WARNING this driver is only used to write in VTK format So the object can not be instantied using a file!");
40 _vtkFile = new ofstream();
43 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const VTK_MESH_DRIVER & driver):
45 _ptrMesh(driver._ptrMesh),
46 _meshName(driver._meshName)
48 _ptrMesh->addDriver(*this);
49 _vtkFile = new ofstream();
52 VTK_MESH_DRIVER::~VTK_MESH_DRIVER()
54 const char * LOC ="VTK_MESH_DRIVER::~VTK_MESH_DRIVER()";
68 void VTK_MESH_DRIVER::openConst() const throw (MEDEXCEPTION)
70 const char * LOC = "VTK_MESH_DRIVER::openConst()" ;
73 MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
75 if ( _fileName == "" )
76 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
77 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
81 if (!(*_vtkFile).is_open())
82 (*_vtkFile).open(_fileName.c_str()) ;
84 // _status = MED_OPENED ;
88 SCRUTE((*_vtkFile).is_open());
94 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
100 void VTK_MESH_DRIVER::open() {
104 void VTK_MESH_DRIVER::closeConst() const throw (MEDEXCEPTION)
106 const char * LOC = "VTK_MESH_DRIVER::closeConst() " ;
113 if ((*_vtkFile).is_open())
117 // _status = MED_CLOSED ;
124 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
131 void VTK_MESH_DRIVER::close() {
135 void VTK_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
136 string VTK_MESH_DRIVER::getMeshName() const { return _meshName; };
138 void VTK_MESH_DRIVER::read(void) throw (MEDEXCEPTION)
140 const char * LOC = "VTK_MESH_DRIVER::read() : " ;
145 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "This driver is only used to write in VTK format !"));
151 void VTK_MESH_DRIVER::write(void) const
154 const char * LOC = "void VTK_MESH_DRIVER::write(void) const : ";
157 // Well we must open vtk file first, because there are
158 // no other driver than MED for VTK that do it !
162 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
163 << "maillage from MedMemory" << endl ;
164 // only ASCII for the moment (binary came later :-)
165 (*_vtkFile) << "ASCII" << endl ;
168 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
169 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
170 int SpaceDimension = _ptrMesh->getSpaceDimension() ;
171 int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
172 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
173 const double *coordinate = _ptrMesh->getCoordinates(MED_FULL_INTERLACE) ;
174 for (int i=0;i<NumberOfNodes;i++) {
175 for (int j=0;j<SpaceDimension;j++)
176 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
177 if (SpaceDimension==1)
178 (*_vtkFile) << "0 0" ;
179 if (SpaceDimension==2)
181 (*_vtkFile) << endl ;
184 // we put connectivity
185 // how many cells and how many value in connectivity :
186 int cells_types_count = _ptrMesh->getNumberOfTypes(MED_CELL) ;
187 // int * cells_count = _ptrMesh->get_cells_count() ;
188 // int cells_sum = cells_count[cells_types_count] ;
189 int cells_sum = _ptrMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
190 const CELLMODEL * cells_type = _ptrMesh->getCellsTypes(MED_CELL) ;
191 // int connectivity_sum = 0 ;
193 //const int * connectivity = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
194 const int * connectivityIndex = _ptrMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
196 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
198 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
199 // we put connectivity
200 for (int i=0;i<cells_types_count;i++) {
201 int *filter = (int*) NULL ; // index in vtk connectivity
202 switch (cells_type[i].getType())
205 filter = new int[1] ;
210 filter = new int[2] ;
219 filter = new int[3] ;
226 filter = new int[4] ;
240 filter = new int[4] ;
243 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
244 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
248 filter = new int[5] ;
250 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
252 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
257 filter = new int[6] ;
267 filter = new int[8] ;
295 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
296 int nodes_cell = cells_type[i].getNumberOfNodes();
297 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
298 const int * connectivityArray = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
299 for (int j=0;j<numberOfCell;j++) {
300 (*_vtkFile) << nodes_cell << " " ;
301 for (int k=0;k<nodes_cell;k++)
302 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
303 (*_vtkFile) << endl ;
308 (*_vtkFile) << endl ;
310 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
311 for (int i=0;i<cells_types_count;i++) {
313 switch (cells_type[i].getType())
381 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
382 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
383 for (int j=0;j<numberOfCell;j++)
384 (*_vtkFile) << vtkType << endl ;
391 GENDRIVER * VTK_MESH_DRIVER::copy(void) const
393 return new VTK_MESH_DRIVER(*this);