// Functions to write grid2DPoints3D as a Geomview .off file. #include "writeGrid2DOFF.h" #include #include #include void WRITE_GRID2D_OFF::WriteHeader(std::ostream& file) const { file << Header() << "\n"; } void WRITE_GRID2D_OFF::WriteComment(std::ostream& file, const std::string& msg) const { file << "# " << msg << "\n"; } void WRITE_GRID2D_OFF::WriteNumElements(std::ostream& file, const GRID2D_POINTS3D& grid2D) const { file << grid2D.NumPoints() << " " << grid2D.NumQuadrilaterals() << " 0\n"; } void WRITE_GRID2D_OFF::WritePointCoordinates(std::ostream& file, const GRID2D_POINTS3D& grid2D) const { for (int irow = 0; irow < grid2D.NumRows(); irow++) { for (int jcol = 0; jcol < grid2D.NumCols(); jcol++) { auto c = grid2D.Coord(irow, jcol); file << c[0] << " " << c[1] << " " << c[2] << "\n"; } } } void WRITE_GRID2D_OFF::WriteQuadrilaterals(std::ostream& file, const GRID2D_POINTS3D& grid2D) const { if (grid2D.NumRows() < 2 || grid2D.NumCols() < 2) { // Nothing to write. return; } for (int irow = 0; irow < grid2D.NumRows() - 1; irow++) { for (int icol = 0; icol < grid2D.NumCols() - 1; icol++) { int iv0 = grid2D.PointIndex(irow, icol); int iv1 = iv0 + 1; int iv2 = iv1 + grid2D.NumCols(); int iv3 = iv0 + grid2D.NumCols(); file << "4 " << iv0 << " " << iv1 << " " << iv2 << " " << iv3 << "\n"; } } } void WRITE_GRID2D_OFF::Write(std::ostream& file, const GRID2D_POINTS3D& grid2D, const std::vector& comment_list) const { WriteHeader(file); for (const auto& comment : comment_list) { WriteComment(file, comment); } WriteNumElements(file, grid2D); WritePointCoordinates(file, grid2D); file << "\n"; WriteQuadrilaterals(file, grid2D); } void WRITE_GRID2D_OFF::OpenAndWrite( const std::string& filename, const GRID2D_POINTS3D& grid2D, const std::vector& comment_list) const { try { std::ofstream outfile(filename); if (!outfile.is_open()) { std::cerr << "Cannot open output file " << filename << ".\n"; throw std::runtime_error( "Cannot open output file " + filename + " for writing."); } Write(outfile, grid2D, comment_list); } catch (const std::out_of_range& e) { std::cerr << "Error writing file " << filename << ".\n " << e.what() << "\n"; throw; } catch (const std::runtime_error& e) { std::cerr << "Error writing file " << filename << ".\n " << e.what() << "\n"; throw; } catch (const std::exception& e) { std::cerr << "Error writing file " << filename << ".\n " << e.what() << "\n"; throw; } }