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"
16 VTK_MESH_DRIVER::VTK_MESH_DRIVER(): GENDRIVER(),
17 _ptrMesh((MESH * const)MED_NULL)
19 _vtkFile = new ofstream();
20 // What about _id in Gendriver ?
24 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName,
26 GENDRIVER(fileName,MED_WRONLY),
29 const char * LOC = "VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName, MESH * ptrMesh) : " ;
31 // Send an exception because a VTK_MESH_DRIVER object cannot be instantied
32 // from a file and there is no read for that kind of driver
34 // 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!"));
36 // _ptrMesh->addDriver(*this); // OU RECUPERER L'ID.
37 MESSAGE(LOC << "WARNING this driver is only used to write in VTK format So the object can not be instantied using a file!");
39 _vtkFile = new ofstream();
42 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const VTK_MESH_DRIVER & driver):
44 _ptrMesh(driver._ptrMesh),
45 _meshName(driver._meshName)
47 _ptrMesh->addDriver(*this);
48 _vtkFile = new ofstream();
51 VTK_MESH_DRIVER::~VTK_MESH_DRIVER()
53 const char * LOC ="VTK_MESH_DRIVER::~VTK_MESH_DRIVER()";
67 void VTK_MESH_DRIVER::openConst() const throw (MEDEXCEPTION)
69 const char * LOC = "VTK_MESH_DRIVER::openConst()" ;
72 MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
74 if ( _fileName == "" )
75 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
76 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
80 if (!(*_vtkFile).is_open())
81 (*_vtkFile).open(_fileName.c_str()) ;
83 // _status = MED_OPENED ;
87 SCRUTE((*_vtkFile).is_open());
93 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
99 void VTK_MESH_DRIVER::open() {
103 void VTK_MESH_DRIVER::closeConst() const throw (MEDEXCEPTION)
105 const char * LOC = "VTK_MESH_DRIVER::closeConst() " ;
112 if ((*_vtkFile).is_open())
116 // _status = MED_CLOSED ;
123 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
130 void VTK_MESH_DRIVER::close() {
134 void VTK_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
135 string VTK_MESH_DRIVER::getMeshName() const { return _meshName; };
137 void VTK_MESH_DRIVER::read(void) throw (MEDEXCEPTION)
139 const char * LOC = "VTK_MESH_DRIVER::read() : " ;
144 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "This driver is only used to write in VTK format !"));
150 void VTK_MESH_DRIVER::write(void) const
153 const char * LOC = "void VTK_MESH_DRIVER::write(void) const : ";
156 // Well we must open vtk file first, because there are
157 // no other driver than MED for VTK that do it !
161 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
162 << "maillage from MedMemory" << endl ;
163 // only ASCII for the moment (binary came later :-)
164 (*_vtkFile) << "ASCII" << endl ;
167 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
168 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
169 int SpaceDimension = _ptrMesh->getSpaceDimension() ;
170 int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
171 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
172 const double *coordinate = _ptrMesh->getCoordinates(MED_FULL_INTERLACE) ;
173 for (int i=0;i<NumberOfNodes;i++) {
174 for (int j=0;j<SpaceDimension;j++)
175 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
176 if (SpaceDimension==1)
177 (*_vtkFile) << "0 0" ;
178 if (SpaceDimension==2)
180 (*_vtkFile) << endl ;
183 // we put connectivity
184 // how many cells and how many value in connectivity :
185 int cells_types_count = _ptrMesh->getNumberOfTypes(MED_CELL) ;
186 // int * cells_count = _ptrMesh->get_cells_count() ;
187 // int cells_sum = cells_count[cells_types_count] ;
188 int cells_sum = _ptrMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
189 const CELLMODEL * cells_type = _ptrMesh->getCellsTypes(MED_CELL) ;
190 // int connectivity_sum = 0 ;
192 //const int * connectivity = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
193 const int * connectivityIndex = _ptrMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
195 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
197 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
198 // we put connectivity
199 for (int i=0;i<cells_types_count;i++) {
200 int *filter = (int*) NULL ; // index in vtk connectivity
201 switch (cells_type[i].getType())
204 filter = new int[1] ;
209 filter = new int[2] ;
218 filter = new int[3] ;
225 filter = new int[4] ;
239 filter = new int[4] ;
242 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
243 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
247 filter = new int[5] ;
249 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
251 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
256 filter = new int[6] ;
266 filter = new int[8] ;
294 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
295 int nodes_cell = cells_type[i].getNumberOfNodes();
296 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
297 const int * connectivityArray = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
298 for (int j=0;j<numberOfCell;j++) {
299 (*_vtkFile) << nodes_cell << " " ;
300 for (int k=0;k<nodes_cell;k++)
301 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
302 (*_vtkFile) << endl ;
307 (*_vtkFile) << endl ;
309 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
310 for (int i=0;i<cells_types_count;i++) {
312 switch (cells_type[i].getType())
380 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
381 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
382 for (int j=0;j<numberOfCell;j++)
383 (*_vtkFile) << vtkType << endl ;
390 GENDRIVER * VTK_MESH_DRIVER::copy(void) const
392 return new VTK_MESH_DRIVER(*this);