dune-grid  2.2.0
vtuwriter.hh
Go to the documentation of this file.
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