dune-grid
2.2beta1
|
00001 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 // vi: set et ts=4 sw=2 sts=2: 00003 00004 #ifndef DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH 00005 #define DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH 00006 00007 #include <ostream> 00008 #include <string> 00009 00010 #include <dune/common/exceptions.hh> 00011 #include <dune/common/indent.hh> 00012 00013 #include <dune/grid/io/file/vtk/common.hh> 00014 #include <dune/grid/io/file/vtk/dataarraywriter.hh> 00015 00016 namespace Dune { 00017 00020 00021 namespace VTK { 00022 00024 00097 class VTUWriter { 00098 public: 00099 std::ostream& stream; 00100 enum Phase { main, appended } phase; 00101 00102 private: 00103 DataArrayWriterFactory factory; 00104 Indent indent; 00105 00106 std::string fileType; 00107 std::string cellName; 00108 00109 bool doAppended; 00110 00111 public: 00113 00121 inline VTUWriter(std::ostream& stream_, OutputType outputType, 00122 FileType fileType_) 00123 : stream(stream_), factory(outputType, stream) 00124 { 00125 switch(fileType_) { 00126 case polyData: 00127 fileType = "PolyData"; 00128 cellName = "Lines"; 00129 break; 00130 case unstructuredGrid: 00131 fileType = "UnstructuredGrid"; 00132 cellName = "Cells"; 00133 break; 00134 default: 00135 DUNE_THROW(IOError, "VTUWriter: Unknown fileType: " << fileType_); 00136 } 00137 const std::string& byteOrder = getEndiannessString(); 00138 00139 stream << indent << "<?xml version=\"1.0\"?>\n"; 00140 stream << indent << "<VTKFile" 00141 << " type=\"" << fileType << "\"" 00142 << " version=\"0.1\"" 00143 << " byte_order=\"" << byteOrder << "\">\n"; 00144 ++indent; 00145 } 00146 00148 inline ~VTUWriter() { 00149 --indent; 00150 stream << indent << "</VTKFile>\n" 00151 << std::flush; 00152 } 00153 00155 00166 inline void beginPointData(const std::string& scalars = "", 00167 const std::string& vectors = "") { 00168 switch(phase) { 00169 case main: 00170 stream << indent << "<PointData"; 00171 if(scalars != "") stream << " Scalars=\"" << scalars << "\""; 00172 if(vectors != "") stream << " Vectors=\"" << vectors << "\""; 00173 stream << ">\n"; 00174 ++indent; 00175 break; 00176 case appended: 00177 break; 00178 } 00179 } 00181 inline void endPointData() { 00182 switch(phase) { 00183 case main: 00184 --indent; 00185 stream << indent << "</PointData>\n"; 00186 break; 00187 case appended: 00188 break; 00189 } 00190 } 00191 00193 00204 inline void beginCellData(const std::string& scalars = "", 00205 const std::string& vectors = "") { 00206 switch(phase) { 00207 case main: 00208 stream << indent << "<CellData"; 00209 if(scalars != "") stream << " Scalars=\"" << scalars << "\""; 00210 if(vectors != "") stream << " Vectors=\"" << vectors << "\""; 00211 stream << ">\n"; 00212 ++indent; 00213 break; 00214 case appended: 00215 break; 00216 } 00217 } 00219 inline void endCellData() { 00220 switch(phase) { 00221 case main: 00222 --indent; 00223 stream << indent << "</CellData>\n"; 00224 break; 00225 case appended: 00226 break; 00227 } 00228 } 00229 00231 00237 inline void beginPoints() { 00238 switch(phase) { 00239 case main: 00240 stream << indent << "<Points>\n"; 00241 ++indent; 00242 break; 00243 case appended: 00244 break; 00245 } 00246 } 00248 inline void endPoints() { 00249 switch(phase) { 00250 case main: 00251 --indent; 00252 stream << indent << "</Points>\n"; 00253 break; 00254 case appended: 00255 break; 00256 } 00257 } 00258 00260 00273 inline void beginCells() { 00274 switch(phase) { 00275 case main: 00276 stream << indent << "<" << cellName << ">\n"; 00277 ++indent; 00278 break; 00279 case appended: 00280 break; 00281 } 00282 } 00284 inline void endCells() { 00285 switch(phase) { 00286 case main: 00287 --indent; 00288 stream << indent << "</" << cellName << ">\n"; 00289 break; 00290 case appended: 00291 break; 00292 } 00293 } 00294 00296 00309 inline void beginMain(unsigned ncells, unsigned npoints) { 00310 stream << indent << "<" << fileType << ">\n"; 00311 ++indent; 00312 stream << indent << "<Piece" 00313 << " NumberOf" << cellName << "=\"" << ncells << "\"" 00314 << " NumberOfPoints=\"" << npoints << "\">\n"; 00315 ++indent; 00316 phase = main; 00317 } 00319 inline void endMain() { 00320 --indent; 00321 stream << indent << "</Piece>\n"; 00322 --indent; 00323 stream << indent << "</" << fileType << ">\n"; 00324 } 00325 00327 00344 inline bool beginAppended() { 00345 doAppended = factory.beginAppended(); 00346 if(doAppended) { 00347 const std::string& encoding = factory.appendedEncoding(); 00348 stream << indent << "<AppendedData" 00349 << " encoding=\"" << encoding << "\">\n"; 00350 ++indent; 00351 // mark begin of data 00352 stream << indent << "_"; 00353 } 00354 phase = appended; 00355 return doAppended; 00356 } 00358 inline void endAppended() { 00359 if(doAppended) { 00360 stream << "\n"; 00361 --indent; 00362 stream << indent << "</AppendedData>\n"; 00363 } 00364 } 00365 00367 00379 template<typename T> 00380 DataArrayWriter<T>* makeArrayWriter(const std::string& name, 00381 unsigned ncomps, unsigned nitems) { 00382 return factory.make<T>(name, ncomps, nitems, indent); 00383 } 00384 }; 00385 00386 } // namespace VTK 00387 00389 00390 } // namespace Dune 00391 00392 #endif // DUNE_GRID_IO_FILE_VTK_VTUWRITER_HH