1 #include "MEDMEM_VtkMeshDriver.hxx"
3 #include "MEDMEM_DriversDef.hxx"
5 #include "MEDMEM_Family.hxx"
6 #include "MEDMEM_Group.hxx"
7 #include "MEDMEM_Coordinate.hxx"
8 #include "MEDMEM_Connectivity.hxx"
9 #include "MEDMEM_Mesh.hxx"
10 #include "MEDMEM_CellModel.hxx"
11 #include "MEDMEM_Grid.hxx"
16 using namespace MEDMEM;
17 using namespace MED_EN;
21 VTK_MESH_DRIVER::VTK_MESH_DRIVER(): GENDRIVER(),
22 _ptrMesh((MESH * const)MED_NULL)
24 _vtkFile = new ofstream();
25 // What about _id in Gendriver ?
29 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName,
31 GENDRIVER(fileName,MED_WRONLY),
34 const char * LOC = "VTK_MESH_DRIVER::VTK_MESH_DRIVER(const string & fileName, MESH * ptrMesh) : " ;
36 // Send an exception because a VTK_MESH_DRIVER object cannot be instantied
37 // from a file and there is no read for that kind of driver
39 // 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!"));
41 // _ptrMesh->addDriver(*this); // OU RECUPERER L'ID.
42 MESSAGE(LOC << "WARNING this driver is only used to write in VTK format So the object can not be instantied using a file!");
44 _vtkFile = new ofstream();
47 VTK_MESH_DRIVER::VTK_MESH_DRIVER(const VTK_MESH_DRIVER & driver):
49 _ptrMesh(driver._ptrMesh),
50 _meshName(driver._meshName)
52 _ptrMesh->addDriver(*this);
53 _vtkFile = new ofstream();
56 VTK_MESH_DRIVER::~VTK_MESH_DRIVER()
58 const char * LOC ="VTK_MESH_DRIVER::~VTK_MESH_DRIVER()";
72 void VTK_MESH_DRIVER::openConst() const throw (MEDEXCEPTION)
74 const char * LOC = "VTK_MESH_DRIVER::openConst()" ;
77 MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
79 if ( _fileName == "" )
80 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
81 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
85 if (!(*_vtkFile).is_open())
86 (*_vtkFile).open(_fileName.c_str()) ;
88 // _status = MED_OPENED ;
92 SCRUTE((*_vtkFile).is_open());
98 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
104 void VTK_MESH_DRIVER::open() {
108 void VTK_MESH_DRIVER::closeConst() const throw (MEDEXCEPTION)
110 const char * LOC = "VTK_MESH_DRIVER::closeConst() " ;
117 if ((*_vtkFile).is_open())
121 // _status = MED_CLOSED ;
128 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
135 void VTK_MESH_DRIVER::close() {
139 void VTK_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
140 string VTK_MESH_DRIVER::getMeshName() const { return _meshName; };
142 void VTK_MESH_DRIVER::read(void) throw (MEDEXCEPTION)
144 const char * LOC = "VTK_MESH_DRIVER::read() : " ;
149 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "This driver is only used to write in VTK format !"));
155 void VTK_MESH_DRIVER::write(void) const
158 const char * LOC = "void VTK_MESH_DRIVER::write(void) const : ";
161 // Well we must open vtk file first, because there are
162 // no other driver than MED for VTK that do it !
166 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
167 << "maillage from MedMemory" << endl ;
168 // only ASCII for the moment (binary came later :-)
169 (*_vtkFile) << "ASCII" << endl ;
172 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
173 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
174 int SpaceDimension = _ptrMesh->getSpaceDimension() ;
175 int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
176 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
177 const double *coordinate = _ptrMesh->getCoordinates(MED_FULL_INTERLACE) ;
178 for (int i=0;i<NumberOfNodes;i++) {
179 for (int j=0;j<SpaceDimension;j++)
180 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
181 if (SpaceDimension==1)
182 (*_vtkFile) << "0 0" ;
183 if (SpaceDimension==2)
185 (*_vtkFile) << endl ;
188 // we put connectivity
189 // how many cells and how many value in connectivity :
190 int cells_types_count = _ptrMesh->getNumberOfTypes(MED_CELL) ;
191 // int * cells_count = _ptrMesh->get_cells_count() ;
192 // int cells_sum = cells_count[cells_types_count] ;
193 int cells_sum = _ptrMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
194 const CELLMODEL * cells_type = _ptrMesh->getCellsTypes(MED_CELL) ;
195 // int connectivity_sum = 0 ;
197 //const int * connectivity = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
198 const int * connectivityIndex = _ptrMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
200 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
202 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
203 // we put connectivity
204 for (int i=0;i<cells_types_count;i++) {
205 int *filter = (int*) NULL ; // index in vtk connectivity
206 switch (cells_type[i].getType())
209 filter = new int[1] ;
214 filter = new int[2] ;
223 filter = new int[3] ;
230 filter = new int[4] ;
244 filter = new int[4] ;
247 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
248 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
252 filter = new int[5] ;
254 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
256 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
261 filter = new int[6] ;
271 filter = new int[8] ;
299 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
300 int nodes_cell = cells_type[i].getNumberOfNodes();
301 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
302 const int * connectivityArray = _ptrMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
303 for (int j=0;j<numberOfCell;j++) {
304 (*_vtkFile) << nodes_cell << " " ;
305 for (int k=0;k<nodes_cell;k++)
306 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
307 (*_vtkFile) << endl ;
312 (*_vtkFile) << endl ;
314 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
315 for (int i=0;i<cells_types_count;i++) {
317 switch (cells_type[i].getType())
385 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
386 int numberOfCell = _ptrMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
387 for (int j=0;j<numberOfCell;j++)
388 (*_vtkFile) << vtkType << endl ;
395 GENDRIVER * VTK_MESH_DRIVER::copy(void) const
397 return new VTK_MESH_DRIVER(*this);