bool MeshTablesVolume<PFP>::importTs(const std::string& filename, std::vector<std::string>& attrNames) { // VertexAttribute<VEC3> position = m_map.template getAttribute<VEC3, VERTEX>("position") ; if (!position.isValid()) position = m_map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(position.name()) ; // VertexAttribute<REAL> scalar = m_map.template getAttribute<REAL, VERTEX>("scalar"); if (!scalar.isValid()) scalar = m_map.template addAttribute<REAL, VERTEX>("scalar") ; attrNames.push_back(scalar.name()) ; // AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } std::string ligne; // reading number of vertices/tetrahedra std::getline (fp, ligne); std::stringstream oss(ligne); oss >> m_nbVertices; oss >> m_nbVolumes; //reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for(unsigned int i = 0; i < m_nbVertices; ++i) { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); float x,y,z; oss >> x; oss >> y; oss >> z; VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesID.push_back(id); float scal; oss >> scal; scalar[id] = scal; } //Read and embed all tetrahedrons for(unsigned int i = 0; i < m_nbVolumes ; ++i) { do { std::getline(fp,ligne); } while(ligne.size() == 0); std::stringstream oss(ligne); m_nbFaces.push_back(4); int s0,s1,s2,s3,nbe; oss >> s0; oss >> s1; oss >> s2; oss >> s3; typename PFP::VEC3 P = position[verticesID[s0]]; typename PFP::VEC3 A = position[verticesID[s1]]; typename PFP::VEC3 B = position[verticesID[s2]]; typename PFP::VEC3 C = position[verticesID[s3]]; if(Geom::testOrientation3D<typename PFP::VEC3>(P,A,B,C) == Geom::UNDER) { int ui = s1; s1 = s2; s2 = ui; } //if regions are defined use this number oss >> nbe; //ignored here m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s3]); } fp.close(); return true; }
bool MeshTablesVolume<PFP>::importNodeWithELERegions(const std::string& filenameNode, const std::string& filenameELE, std::vector<std::string>& attrNames) { VertexAttribute<VEC3> position = m_map.template getAttribute<VEC3, VERTEX>("position") ; if (!position.isValid()) position = m_map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(position.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; //open file std::ifstream fnode(filenameNode.c_str(), std::ios::in); if (!fnode.good()) { CGoGNerr << "Unable to open file " << filenameNode << CGoGNendl; return false; } std::ifstream fele(filenameELE.c_str(), std::ios::in); if (!fele.good()) { CGoGNerr << "Unable to open file " << filenameELE << CGoGNendl; return false; } std::string line; //Reading NODE file //First line: [# of points] [dimension (must be 3)] [# of attributes] [# of boundary markers (0 or 1)] unsigned int nbe; { do { std::getline(fnode,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVertices; oss >> nbe; oss >> nbe; oss >> nbe; } //Reading number of tetrahedra in ELE file unsigned int nbv; { do { std::getline(fele,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVolumes; oss >> nbv ; oss >> nbv; } //Reading vertices std::map<unsigned int,unsigned int> verticesMapID; for(unsigned int i = 0 ; i < m_nbVertices ; ++i) { do { std::getline(fnode,line); }while(line.size() == 0); std::stringstream oss(line); int idv; oss >> idv; float x,y,z; oss >> x; oss >> y; oss >> z; //we can read colors informations if exists VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesMapID.insert(std::pair<unsigned int, unsigned int>(idv,id)); } // reading tetrahedra m_nbFaces.reserve(m_nbVolumes*4); m_emb.reserve(m_nbVolumes*12); for(unsigned i = 0; i < m_nbVolumes ; ++i) { do { std::getline(fele,line); } while(line.size() == 0); std::stringstream oss(line); oss >> nbe; m_nbFaces.push_back(4); int s0,s1,s2,s3; oss >> s0; oss >> s1; oss >> s2; oss >> s3; typename PFP::VEC3 P = position[verticesMapID[s0]]; typename PFP::VEC3 A = position[verticesMapID[s1]]; typename PFP::VEC3 B = position[verticesMapID[s2]]; typename PFP::VEC3 C = position[verticesMapID[s3]]; if (Geom::testOrientation3D<typename PFP::VEC3>(P,A,B,C) == Geom::UNDER) { int ui= s0; s0 = s3; s3 = s2; s2 = s1; s1 = ui; } m_emb.push_back(verticesMapID[s0]); m_emb.push_back(verticesMapID[s1]); m_emb.push_back(verticesMapID[s2]); m_emb.push_back(verticesMapID[s3]); } fnode.close(); fele.close(); return true; }
bool MeshTablesVolume<PFP>::importTetmesh(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<VEC3> position = m_map.template getAttribute<VEC3, VERTEX>("position") ; if (!position.isValid()) position = m_map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(position.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; //open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } std::string line; fp >> line; if (line!="Vertices") CGoGNerr << "Warning tetmesh file problem"<< CGoGNendl; fp >> m_nbVertices; std::cout << "READ: "<< m_nbVertices << std::endl; std::getline (fp, line); //reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices+1); verticesID.push_back(0xffffffff); for(unsigned int i = 0; i < m_nbVertices; ++i) { do { std::getline (fp, line); } while (line.size() == 0); std::stringstream oss(line); float x,y,z; oss >> x; oss >> y; oss >> z; // TODO : if required read other vertices attributes here VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesID.push_back(id); } fp >> line; if (line!="Tetrahedra") CGoGNerr << "Warning tetmesh file problem"<< CGoGNendl; fp >> m_nbVolumes; std::getline (fp, line); // reading tetrahedra m_nbFaces.reserve(m_nbVolumes*4); m_emb.reserve(m_nbVolumes*12); for(unsigned i = 0; i < m_nbVolumes ; ++i) { do { std::getline(fp,line); } while(line.size() == 0); std::stringstream oss(line); m_nbFaces.push_back(4); int s0,s1,s2,s3; oss >> s0; oss >> s1; oss >> s2; oss >> s3; typename PFP::VEC3 P = position[verticesID[s0]]; typename PFP::VEC3 A = position[verticesID[s1]]; typename PFP::VEC3 B = position[verticesID[s2]]; typename PFP::VEC3 C = position[verticesID[s3]]; if (Geom::testOrientation3D<typename PFP::VEC3>(P,A,B,C) == Geom::UNDER) { int ui=s1; s1 = s2; s2 = ui; } m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s3]); } fp.close(); return true; }
bool MeshTablesVolume<PFP>::importTet(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<VEC3, MAP> position = m_map.template getAttribute<VEC3, VERTEX, MAP>("position") ; if (!position.isValid()) position = m_map.template addAttribute<VEC3, VERTEX, MAP>("position") ; attrNames.push_back(position.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; //open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } std::string ligne; // reading number of vertices std::getline (fp, ligne); std::stringstream oss(ligne); oss >> m_nbVertices; // reading number of tetrahedra std::getline (fp, ligne); std::stringstream oss2(ligne); oss2 >> m_nbVolumes; //reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for(unsigned int i = 0; i < m_nbVertices; ++i) { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); float x,y,z; oss >> x; oss >> y; oss >> z; // TODO : if required read other vertices attributes here VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesID.push_back(id); } // reading volumes m_nbFaces.reserve(m_nbVolumes*4); m_emb.reserve(m_nbVolumes*12); unsigned int nbc = 0; for (unsigned int i = 0; i < m_nbVolumes ; ++i) { do { std::getline (fp, ligne); } while (ligne.size()==0); std::stringstream oss(ligne); int n; oss >> n; // type of volumes if(!oss.good()) { oss.clear(); char dummy; oss >> dummy; // type of volumes oss >> dummy; if(dummy == 'C')// connector { ++nbc; m_nbFaces.push_back(3); int s0,s1,s2,s3; oss >> s0; oss >> s1; oss >> s2; oss >> s3; //std::cout << "connector " << s0 << " " << s1 << " " << s2 << " " << s3 << std::endl; m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s3]); } }
bool MeshTablesVolume<PFP>::importOFFWithELERegions(const std::string& filenameOFF, const std::string& filenameELE, std::vector<std::string>& attrNames) { VertexAttribute<VEC3> position = m_map.template getAttribute<VEC3, VERTEX>("position") ; if (!position.isValid()) position = m_map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(position.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open files std::ifstream foff(filenameOFF.c_str(), std::ios::in); if (!foff.good()) { CGoGNerr << "Unable to open OFF file " << CGoGNendl; return false; } std::ifstream fele(filenameELE.c_str(), std::ios::in); if (!fele.good()) { CGoGNerr << "Unable to open ELE file " << CGoGNendl; return false; } std::string line; //OFF reading std::getline(foff, line); if(line.rfind("OFF") == std::string::npos) { CGoGNerr << "Problem reading off file: not an off file"<<CGoGNendl; CGoGNerr << line << CGoGNendl; return false; } //Reading number of vertex/faces/edges in OFF file unsigned int nbe; { do { std::getline(foff,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVertices; oss >> nbe; oss >> nbe; oss >> nbe; } //Reading number of tetrahedra in ELE file unsigned int nbv; { do { std::getline(fele,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVolumes; oss >> nbv ; oss >> nbv; } //Reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for(unsigned int i = 0 ; i < m_nbVertices ; ++i) { do { std::getline(foff,line); }while(line.size() == 0); std::stringstream oss(line); float x,y,z; oss >> x; oss >> y; oss >> z; //we can read colors informations if exists VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesID.push_back(id); } // reading tetrahedra m_nbFaces.reserve(m_nbVolumes*4); m_emb.reserve(m_nbVolumes*12); for(unsigned i = 0; i < m_nbVolumes ; ++i) { do { std::getline(fele,line); } while(line.size() == 0); std::stringstream oss(line); oss >> nbe; m_nbFaces.push_back(4); int s0,s1,s2,s3; oss >> s0; oss >> s1; oss >> s2; oss >> s3; typename PFP::VEC3 P = position[verticesID[s0]]; typename PFP::VEC3 A = position[verticesID[s1]]; typename PFP::VEC3 B = position[verticesID[s2]]; typename PFP::VEC3 C = position[verticesID[s3]]; if (Geom::testOrientation3D<typename PFP::VEC3>(P,A,B,C) == Geom::UNDER) { int ui= s0; s0 = s3; s3 = s2; s2 = s1; s1 = ui; } m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s3]); } foff.close(); fele.close(); return true; }
bool MeshTablesSurface<PFP>::importObj(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<typename PFP::VEC3> positions = m_map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; if (!positions.isValid()) positions = m_map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file std::ifstream fp(filename.c_str(), std::ios::binary); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } // fp.seekg(0, std::ios::end); // int ab = fp.tellg(); // fp.seekg(0, std::ios::beg); // int ac = fp.tellg(); std::string ligne; std::string tag; do { fp >> tag; std::getline (fp, ligne); }while (tag != std::string("v")); // lecture des sommets std::vector<unsigned int> verticesID; verticesID.reserve(102400); // on tape large (400Ko wahouuuuu !!) unsigned int i = 0; do { if (tag == std::string("v")) { std::stringstream oss(ligne); float x,y,z; oss >> x; oss >> y; oss >> z; VEC3 pos(x,y,z); unsigned int id = container.insertLine(); positions[id] = pos; verticesID.push_back(id); i++; } fp >> tag; std::getline(fp, ligne); } while (!fp.eof());
bool MeshTablesVolume<PFP>::importTet(const std::string& filename, std::vector<std::string>& attrNames, float scaleFactor) { VertexAttribute<VEC3> positions = m_map.template getAttribute<VEC3, VERTEX>("position") ; if (!positions.isValid()) positions = m_map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; //open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } std::string ligne; unsigned int nbv, nbt; // reading number of vertices std::getline (fp, ligne); std::stringstream oss(ligne); oss >> nbv; // reading number of tetrahedra std::getline (fp, ligne); std::stringstream oss2(ligne); oss2 >> nbt; //reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(nbv); for(unsigned int i = 0; i < nbv;++i) { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); float x,y,z; oss >> x; oss >> y; oss >> z; // TODO : if required read other vertices attributes here VEC3 pos(x*scaleFactor,y*scaleFactor,z*scaleFactor); unsigned int id = container.insertLine(); positions[id] = pos; verticesID.push_back(id); } m_nbVertices = nbv; m_nbVolumes = nbt; // lecture tetra // normalement m_nbVolumes*12 (car on ne charge que des tetra) m_nbFaces=nbt*4; m_emb.reserve(nbt*12); for (unsigned int i = 0; i < m_nbVolumes ; ++i) { do { std::getline (fp, ligne); } while (ligne.size()==0); std::stringstream oss(ligne); int n; oss >> n; // nb de faces d'un volume ? m_nbEdges.push_back(3); m_nbEdges.push_back(3); m_nbEdges.push_back(3); m_nbEdges.push_back(3); int s0,s1,s2,s3; oss >> s0; oss >> s1; oss >> s2; oss >> s3; m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s3]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s1]); m_emb.push_back(verticesID[s3]); m_emb.push_back(verticesID[s0]); m_emb.push_back(verticesID[s2]); m_emb.push_back(verticesID[s3]); } fp.close(); return true; }
bool MeshTablesSurface<PFP>::importMeshBin(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<typename PFP::VEC3> positions = m_map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; if (!positions.isValid()) { positions = m_map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; } attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file std::ifstream fp(filename.c_str(), std::ios::in | std::ios::binary); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } // Read header unsigned int Fmin, Fmax ; fp.read((char*)&m_nbVertices, sizeof(unsigned int)) ; fp.read((char*)&m_nbFaces, sizeof(unsigned int)) ; fp.read((char*)&Fmin, sizeof(unsigned int)) ; fp.read((char*)&Fmax, sizeof(unsigned int)) ; assert((Fmin == 3 && Fmax == 3) || !"Only triangular faces are handled yet") ; // Read foreach vertex std::vector<unsigned int> verticesID ; verticesID.reserve(m_nbVertices) ; for (unsigned int vxNum = 0 ; vxNum < m_nbVertices ; ++vxNum) { Geom::Vec3f pos ; fp.read((char*) &pos[0], sizeof(float)) ; fp.read((char*) &pos[1], sizeof(float)) ; fp.read((char*) &pos[2], sizeof(float)) ; unsigned int id = container.insertLine() ; positions[id] = pos ; verticesID.push_back(id) ; } // Read foreach face m_nbEdges.reserve(m_nbFaces) ; m_emb.reserve(m_nbVertices * 8) ; for (unsigned int fNum = 0; fNum < m_nbFaces; ++fNum) { const unsigned int faceSize = 3 ; fp.read((char*) &faceSize, sizeof(float)) ; m_nbEdges.push_back(faceSize) ; for (unsigned int i = 0 ; i < faceSize; ++i) { unsigned int index ; // index of embedding fp.read((char*) &index, sizeof(unsigned int)) ; m_emb.push_back(verticesID[index]) ; } } fp.close() ; return true ; }
bool MeshTablesSurface<PFP>::importOff(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<typename PFP::VEC3> positions = m_map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; if (!positions.isValid()) positions = m_map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } std::string ligne; // lecture de OFF std::getline (fp, ligne); if (ligne.rfind("OFF") == std::string::npos) { CGoGNerr << "Problem reading off file: not an off file" << CGoGNendl; CGoGNerr << ligne << CGoGNendl; return false; } // lecture des nombres de sommets/faces/aretes int nbe; { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); oss >> m_nbVertices; oss >> m_nbFaces; oss >> nbe; } //lecture sommets std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for (unsigned int i = 0; i < m_nbVertices;++i) { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); float x,y,z; oss >> x; oss >> y; oss >> z; // on peut ajouter ici la lecture de couleur si elle existe VEC3 pos(x,y,z); unsigned int id = container.insertLine(); positions[id] = pos; verticesID.push_back(id); } // lecture faces // normalement nbVertices*8 devrait suffire largement m_nbEdges.reserve(m_nbFaces); m_emb.reserve(m_nbVertices*8); for (unsigned int i = 0; i < m_nbFaces; ++i) { do { std::getline (fp, ligne); } while (ligne.size() == 0); std::stringstream oss(ligne); unsigned int n; oss >> n; m_nbEdges.push_back(n); for (unsigned int j = 0; j < n; ++j) { int index; // index du plongement oss >> index; m_emb.push_back(verticesID[index]); } // on peut ajouter ici la lecture de couleur si elle existe } fp.close(); return true; }
bool MeshTablesSurface<PFP>::importTrianBinGz(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<typename PFP::VEC3> positions = m_map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; if (!positions.isValid()) positions = m_map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file igzstream fs(filename.c_str(), std::ios::in|std::ios::binary); if (!fs.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } // read nb of points fs.read(reinterpret_cast<char*>(&m_nbVertices), sizeof(int)); // read points std::vector<unsigned int> verticesID; { // juste pour limiter la portee des variables verticesID.reserve(m_nbVertices); float* buffer = new float[m_nbVertices*3]; fs.read(reinterpret_cast<char*>(buffer), 3*m_nbVertices*sizeof(float)); float *ptr = buffer; for (unsigned int i = 0; i < m_nbVertices; ++i) { VEC3 pos; pos[0]= *ptr++; pos[1]= *ptr++; pos[2]= *ptr++; unsigned int id = container.insertLine(); positions[id] = pos; verticesID.push_back(id); } delete[] buffer; } // read nb of faces fs.read(reinterpret_cast<char*>(&m_nbFaces), sizeof(int)); m_nbEdges.reserve(m_nbFaces); m_emb.reserve(3*m_nbFaces); // read indices of faces { // juste pour limiter la portee des variables int* buffer = new int[m_nbFaces*6]; fs.read(reinterpret_cast<char*>(buffer),6*m_nbFaces*sizeof(float)); int *ptr = buffer; for (unsigned int i = 0; i < m_nbFaces; i++) { m_nbEdges.push_back(3); m_emb.push_back(verticesID[*ptr++]); m_emb.push_back(verticesID[*ptr++]); m_emb.push_back(verticesID[*ptr++]); } } fs.close(); return true; }
bool MeshTablesSurface<PFP>::importTrian(const std::string& filename, std::vector<std::string>& attrNames) { VertexAttribute<typename PFP::VEC3> positions = m_map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; if (!positions.isValid()) positions = m_map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; attrNames.push_back(positions.name()) ; AttributeContainer& container = m_map.template getAttributeContainer<VERTEX>() ; // open file std::ifstream fp(filename.c_str(), std::ios::in); if (!fp.good()) { CGoGNerr << "Unable to open file " << filename << CGoGNendl; return false; } // read nb of points fp >> m_nbVertices; // read points std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for (unsigned int i = 0; i < m_nbVertices; ++i) { VEC3 pos; fp >> pos[0]; fp >> pos[1]; fp >> pos[2]; unsigned int id = container.insertLine(); positions[id] = pos; verticesID.push_back(id); } // read nb of faces fp >> m_nbFaces; m_nbEdges.reserve(m_nbFaces); m_emb.reserve(3*m_nbFaces); // read indices of faces for (unsigned int i = 0; i < m_nbFaces; ++i) { m_nbEdges.push_back(3); // read the three vertices of triangle int pt; fp >> pt; m_emb.push_back(verticesID[pt]); fp >> pt; m_emb.push_back(verticesID[pt]); fp >> pt; m_emb.push_back(verticesID[pt]); // neighbour not always good in files !! int neigh; fp >> neigh; fp >> neigh; fp >> neigh; } fp.close(); return true; }
bool importOFFWithELERegions(typename PFP::MAP& map, const std::string& filenameOFF, const std::string& filenameELE, std::vector<std::string>& attrNames) { typedef typename PFP::VEC3 VEC3; VertexAttribute<VEC3> position = map.template addAttribute<VEC3, VERTEX>("position") ; attrNames.push_back(position.name()) ; AttributeContainer& container = map.template getAttributeContainer<VERTEX>() ; unsigned int m_nbVertices = 0, m_nbFaces = 0, m_nbEdges = 0, m_nbVolumes = 0; VertexAutoAttribute< NoMathIONameAttribute< std::vector<Dart> > > vecDartsPerVertex(map, "incidents"); // open files std::ifstream foff(filenameOFF.c_str(), std::ios::in); if (!foff.good()) { CGoGNerr << "Unable to open OFF file " << CGoGNendl; return false; } std::ifstream fele(filenameELE.c_str(), std::ios::in); if (!fele.good()) { CGoGNerr << "Unable to open ELE file " << CGoGNendl; return false; } std::string line; //OFF reading std::getline(foff, line); if(line.rfind("OFF") == std::string::npos) { CGoGNerr << "Problem reading off file: not an off file"<<CGoGNendl; CGoGNerr << line << CGoGNendl; return false; } //Reading number of vertex/faces/edges in OFF file unsigned int nbe; { do { std::getline(foff,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVertices; oss >> m_nbFaces; oss >> m_nbEdges; oss >> nbe; } //Reading number of tetrahedra in ELE file unsigned int nbv; { do { std::getline(fele,line); }while(line.size() == 0); std::stringstream oss(line); oss >> m_nbVolumes; oss >> nbv ; oss >> nbv; } CGoGNout << "nb points = " << m_nbVertices << " / nb faces = " << m_nbFaces << " / nb edges = " << m_nbEdges << " / nb tet = " << m_nbVolumes << CGoGNendl; //Reading vertices std::vector<unsigned int> verticesID; verticesID.reserve(m_nbVertices); for(unsigned int i = 0 ; i < m_nbVertices ; ++i) { do { std::getline(foff,line); }while(line.size() == 0); std::stringstream oss(line); float x,y,z; oss >> x; oss >> y; oss >> z; //we can read colors informations if exists VEC3 pos(x,y,z); unsigned int id = container.insertLine(); position[id] = pos; verticesID.push_back(id); } std::vector<std::vector<Dart> > vecDartPtrEmb; vecDartPtrEmb.reserve(m_nbVertices); DartMarkerNoUnmark m(map) ; //Read and embed tetrahedra TODO for(unsigned i = 0; i < m_nbVolumes ; ++i) { do { std::getline(fele,line); } while(line.size() == 0); std::stringstream oss(line); oss >> nbe; Dart d = Algo::Modelisation::createTetrahedron<PFP>(map); Geom::Vec4ui pt; oss >> pt[0]; oss >> pt[1]; oss >> pt[2]; oss >> pt[3]; //regions ? oss >> nbe; // Embed three vertices for(unsigned int j = 0 ; j < 3 ; ++j) { FunctorSetEmb<typename PFP::MAP, VERTEX> fsetemb(map, verticesID[pt[2-j]]); map.template foreach_dart_of_orbit<PFP::MAP::VERTEX_OF_PARENT>(d, fsetemb); //store darts per vertices to optimize reconstruction Dart dd = d; do { m.mark(dd) ; vecDartsPerVertex[pt[2-j]].push_back(dd); dd = map.phi1(map.phi2(dd)); } while(dd != d); d = map.phi1(d); } //Embed the last vertex d = map.phi_1(map.phi2(d)); FunctorSetEmb<typename PFP::MAP, VERTEX> fsetemb(map, verticesID[pt[3]]); map.template foreach_dart_of_orbit<PFP::MAP::VERTEX_OF_PARENT>(d, fsetemb); //store darts per vertices to optimize reconstruction Dart dd = d; do { m.mark(dd) ; vecDartsPerVertex[pt[3]].push_back(dd); dd = map.phi1(map.phi2(dd)); } while(dd != d); } foff.close(); fele.close(); //Association des phi3 unsigned int nbBoundaryFaces = 0 ; for (Dart d = map.begin(); d != map.end(); map.next(d)) { if (m.isMarked(d)) { std::vector<Dart>& vec = vecDartsPerVertex[map.phi1(d)]; Dart good_dart = NIL; for(typename std::vector<Dart>::iterator it = vec.begin(); it != vec.end() && good_dart == NIL; ++it) { if(map.template getEmbedding<VERTEX>(map.phi1(*it)) == map.template getEmbedding<VERTEX>(d) && map.template getEmbedding<VERTEX>(map.phi_1(*it)) == map.template getEmbedding<VERTEX>(map.phi_1(d)) /*&& map.template getEmbedding<VERTEX>(*it) == map.template getEmbedding<VERTEX>(map.phi1(d)) */) { good_dart = *it ; } } if (good_dart != NIL) { map.sewVolumes(d, good_dart, false); m.template unmarkOrbit<FACE>(d); } else { m.template unmarkOrbit<PFP::MAP::FACE_OF_PARENT>(d); ++nbBoundaryFaces; } } } if (nbBoundaryFaces > 0) { std::cout << "closing" << std::endl ; map.closeMap(); CGoGNout << "Map closed (" << nbBoundaryFaces << " boundary faces)" << CGoGNendl; } return true; }