Program Listing for File TetGenLoader.cpp

Return to documentation for file (Utils/TetGenLoader.cpp)

#include "TetGenLoader.h"
#include <sstream>
#include <fstream>
#include <iostream>
#include "Logger.h"

using namespace Utilities;
using namespace std;

// Call this function to load a model from a *.tet file
void TetGenLoader::loadTetFile(const std::string &filename, std::vector<Vector3r>& vertices, std::vector<unsigned int>& tets)
{
    LOG_INFO << "Loading " << filename;

    // variables
    size_t i, num_materials, num_vertices, num_tetras, num_triangles;
    Real value;
    string line, label;
    stringstream sStream;
    // try to open the file
    ifstream fin(filename.c_str());
    if(!fin)
    {
        LOG_ERR << "'" + filename + "' file not found.";
        return;
    }

    // load tet version 1.2
    getline(fin, line);
    sStream << line;
    sStream >> label; // tet
    sStream >> label; // version
    sStream >> value;
    sStream.clear();
    // load number of materials
    getline(fin, line); // num_materials x
    sStream << line;
    sStream >> label;
    sStream >> num_materials;
    sStream.clear();
    // load number of vertices
    getline(fin, line); // num_vertices x
    sStream << line;
    sStream >> label;
    sStream >> num_vertices;
    sStream.clear();
    // reverse the order of the vertices
    vertices.resize(num_vertices);
    getline(fin, line); // num_tetras x
    sStream << line;
    sStream >> label;
    sStream >> num_tetras;
    sStream.clear();
    tets.resize(4*num_tetras);

    // read number of triangles
    getline(fin, line); // num_triangles x
    sStream << line;
    sStream >> label;
    sStream >> num_triangles;
    sStream.clear();

    // skip materials
    getline(fin, line);
    for(i = 0; i < num_materials; ++i)
        getline(fin, line);
    // skip the VERTICES label
    getline(fin, line);

    // read the vertices
    for(i = 0; i < num_vertices; ++i)
    {
        Real x, y, z;
        getline(fin, line);
        sStream << line;
        sStream >> x >> y >> z;
        getline(sStream, line);
        sStream.clear();

        vertices[i] = Vector3r(x, y, z);
    }

    // skip TETRAS label
    getline(fin, line);
    // read tets
    for(i = 0; i < num_tetras; ++i)
    {
        unsigned int tet[4];
        unsigned int m;
        getline(fin, line);
        sStream << line;
        sStream >> tet[0] >> tet[1] >> tet[2] >> tet[3] >> m;

        //for (unsigned int j = 0; j < 4; j++)
        //  tet[j]--;

        getline(sStream, line);
        sStream.clear();

        for (int j = 0; j < 4; j++)
            tets[4*i +j] = tet[j];
    }
    // close file
    fin.close();

    LOG_INFO << "Number of tets: " << num_tetras;
    LOG_INFO << "Number of vertices: " << num_vertices;
}



void TetGenLoader::loadTetgenModel(const std::string &nodeFilename, const std::string &eleFilename, std::vector<Vector3r>& vertices, std::vector<unsigned int>& tets)
{
    LOG_INFO << "Loading " << nodeFilename;
    LOG_INFO << "Loading " << eleFilename;

    // variables
    size_t i, num_vertices, num_tetras;
    string nodeLine, eleLine, label;
    stringstream sStream;
    // try to open the file
    ifstream finNode(nodeFilename.c_str());
    ifstream finEle(eleFilename.c_str());
    if(!finNode)
    {
        LOG_ERR << "'" + nodeFilename + "' file not found.";
        return;
    }
    if(!finEle)
    {
        LOG_ERR << "'" + eleFilename + "' file not found.";
        return;
    }

    // get num vertices
    getline(finNode, nodeLine);
    sStream << nodeLine;
    sStream >> num_vertices;
    sStream >> label; // 3
    sStream >> label; // 0
    sStream >> label; // 0
    sStream.clear();

    // get num tetras
    getline(finEle, eleLine);
    sStream << eleLine;
    sStream >> num_tetras;
    sStream >> label; // 4
    sStream >> label; // 0
    sStream >> label; // 0
    sStream.clear();

    vertices.resize(num_vertices);
    tets.resize(4u*num_tetras);

    // read vertices
    for(i = 0; i < num_vertices; ++i)
    {
        unsigned nodeInd;
        Real x, y, z;
        getline(finNode, nodeLine);
        sStream << nodeLine;
        sStream >> nodeInd >> x >> y >> z;
        getline(sStream, nodeLine);
        sStream.clear();

        vertices[i] = Vector3r(x, y, z);
    }

    // read tetrahedra
    for(i = 0; i < num_tetras; ++i)
    {
        unsigned eleInd;
        //unsigned int tet[4];
        getline(finEle, eleLine);
        sStream << eleLine  ;
        sStream >> eleInd >> tets[4*i+0] >> tets[4*i+1] >> tets[4*i+2] >> tets[4*i+3];

        getline(sStream, eleLine);
        sStream.clear();
    }
    // close file
    finNode.close();
    finEle.close();

    LOG_INFO << "Number of tets: " << num_tetras;
    LOG_INFO << "Number of vertices: " << num_vertices;
}

void TetGenLoader::loadMSHModel(const std::string &mshFilename, std::vector<Vector3r>& vertices, std::vector<unsigned int>& tets)
{
    LOG_INFO << "Loading " << mshFilename;

    // variables
    size_t i, num_vertices, num_tetras;
    string line, label;
    stringstream sStream;
    // try to open the file
    ifstream mshStream(mshFilename.c_str());
    if(!mshStream)
    {
        LOG_ERR << "'" << mshFilename << "' file not found.";
        return;
    }

    // get num vertices
    getline(mshStream, line);
    getline(mshStream, line);
    sStream << line;
    sStream >> num_vertices;
    sStream.clear();

    vertices.resize(num_vertices);

    // read vertices
    for(i = 0; i < num_vertices; ++i)
    {
        unsigned nodeInd;
        Real x, y, z;
        getline(mshStream, line);
        sStream << line;
        sStream >> nodeInd >> x >> y >> z;
        getline(sStream, line);
        sStream.clear();

        vertices[i] = Vector3r(x, y, z);
    }

    // get num tetras
    getline(mshStream, line);
    getline(mshStream, line);
    getline(mshStream, line);
    sStream << line;
    sStream >> num_tetras;
    sStream.clear();

    tets.resize(4u*num_tetras);

    // read tetrahedra
    for(i = 0; i < num_tetras; ++i)
    {
        unsigned eleInd;
        //unsigned int tet[4];
        getline(mshStream, line);
        sStream << line ;
        sStream >> eleInd >> tets[4*i+0] >> tets[4*i+1] >> tets[4*i+2] >> tets[4*i+3];

        --tets[4*i+0];
        --tets[4*i+1];
        --tets[4*i+2];
        --tets[4*i+3];

        getline(sStream, line);
        sStream.clear();
    }
    // close file
    mshStream.close();

    LOG_INFO << "Number of tets: " << num_tetras;
    LOG_INFO << "Number of vertices: " << num_vertices;
}