importTet.hpp 6.22 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
* Copyright (C) 2009, IGG Team, LSIIT, University of Strasbourg                *
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library is distributed in the hope that it will be useful, but WITHOUT  *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
* Web site: https://iggservis.u-strasbg.fr/CGoGN/                              *
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include "Algo/Modelisation/polyhedron.h"
#include <vector>

namespace CGoGN
{
namespace Algo
{
namespace Import 
{

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
36
bool importTet(typename PFP::MAP& map, char* filename, std::vector<std::string>& attrNames, float scaleFactor)
Pierre Kraemer's avatar
Pierre Kraemer committed
37 38 39
{
	typedef typename PFP::VEC3 VEC3;

Pierre Kraemer's avatar
Pierre Kraemer committed
40 41 42 43
	AttribContainer& container = map.getAttributeContainer(VERTEX_CELL) ;
	AttributeHandler<VEC3> position = map.template addAttribute<VEC3>(VERTEX_ORBIT, "position") ;
	attrNames.push_back(position.name()) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
44
	unsigned int m_nbVertices=0, m_nbFaces=0, m_nbEdges=0, m_nbVolumes=0;
Pierre Kraemer's avatar
Pierre Kraemer committed
45
	AutoAttributeHandler<  NoMathIONameAttribute< std::vector<Dart> > > vecDartsPerVertex(map, VERTEX_ORBIT, "incidents");
Pierre Kraemer's avatar
Pierre Kraemer committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

	// open file
	std::ifstream fp(filename, std::ios::in);
	if (!fp.good())
	{
		std::cerr << "Unable to open file " << filename<< std::endl;
		return false;
	}

	std::string ligne;
	int nbv,nbt;
	// lecture des nombres de sommets/tetra
	std::getline (fp, ligne);
	std::stringstream oss(ligne);
	oss >> nbv;

	//std::cout << "nbV = " << nbv << std::endl;

	std::getline (fp, ligne);
	std::stringstream oss2(ligne);
	oss2 >> nbt;

	//std::cout << "nbT = " << nbt << std::endl;

	//lecture sommets
	std::vector<unsigned int> verticesID;
	verticesID.reserve(nbv);
	for(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;
		// on peut ajouter ici la lecture de couleur si elle existe
		VEC3 pos(x*scaleFactor,y*scaleFactor,z*scaleFactor);

		//std::cout << "VEC3 = " << pos << std::endl;

Pierre Kraemer's avatar
Pierre Kraemer committed
91 92
		unsigned int id = container.insertLine();
		position[id] = pos;
Pierre Kraemer's avatar
Pierre Kraemer committed
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

		verticesID.push_back(id);
	}
	m_nbVertices = verticesID.size();

	//std::cout << "nbVertices = " << m_nbVertices << std::endl;
	m_nbVolumes = nbt;
	//std::cout << "nbVolumes = " << m_nbVolumes << std::endl;

	// lecture tetra
	// normalement m_nbVolumes*12 (car on ne charge que des tetra)

	m_nbFaces=nbt*4;

	std::cout << "nb points = " << m_nbVertices << " / nb faces = " << m_nbFaces << " / nb edges = " << m_nbEdges << " / nb tet = " << m_nbVolumes << std::endl;

	//Read and embed tetrahedra TODO
Pierre Kraemer's avatar
Pierre Kraemer committed
110 111 112 113
	for(unsigned int i = 0; i < m_nbVolumes ; ++i)
	{
		int nbe;
		do
Pierre Kraemer's avatar
Pierre Kraemer committed
114
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
115 116
			std::getline(fp,ligne);
		} while(ligne.size() == 0);
Pierre Kraemer's avatar
Pierre Kraemer committed
117

Pierre Kraemer's avatar
Pierre Kraemer committed
118 119 120
		std::stringstream oss(ligne);
		oss >> nbe;
//		std::cout << "tetra number : " << nbe << std::endl;
Pierre Kraemer's avatar
Pierre Kraemer committed
121

Pierre Kraemer's avatar
Pierre Kraemer committed
122 123 124 125 126 127 128
		//Algo::Modelisation::Polyhedron<PFP>::createOrientedTetra(map);
		Dart d = Algo::Modelisation::Polyhedron<PFP>::createOrientedPolyhedron(map,4);
		Geom::Vec4ui pt;
		oss >> pt[0];
		oss >> pt[1];
		oss >> pt[2];
		oss >> pt[3];
Pierre Kraemer's avatar
Pierre Kraemer committed
129

Pierre Kraemer's avatar
Pierre Kraemer committed
130 131
		//regions ?
		oss >> nbe;
Pierre Kraemer's avatar
Pierre Kraemer committed
132

Pierre Kraemer's avatar
Pierre Kraemer committed
133
//		std::cout << "\t embedding number : " << pt[0] << " " << pt[1] << " " << pt[2] << " " << pt[3] << std::endl;
Pierre Kraemer's avatar
Pierre Kraemer committed
134

Pierre Kraemer's avatar
Pierre Kraemer committed
135 136 137 138
		// Embed three vertices
		for(unsigned int j=0 ; j<3 ; ++j)
		{
//			std::cout << "\t embedding number : " << pt[j];
Pierre Kraemer's avatar
Pierre Kraemer committed
139

Pierre Kraemer's avatar
Pierre Kraemer committed
140
			FunctorSetEmb<typename PFP::MAP> femb(map,VERTEX_ORBIT,verticesID[pt[j]]);
Pierre Kraemer's avatar
Pierre Kraemer committed
141 142 143 144

			Dart dd = d;
			do {
				femb(dd);
Pierre Kraemer's avatar
Pierre Kraemer committed
145 146 147 148
				//vecDartPtrEmb[pt[j]].push_back(dd);
				vecDartsPerVertex[pt[j]].push_back(dd);
				dd = map.phi1(map.phi2(dd));
			} while(dd!=d);
Pierre Kraemer's avatar
Pierre Kraemer committed
149

Pierre Kraemer's avatar
Pierre Kraemer committed
150 151 152
			d = map.phi1(d);

//			std::cout << " done" << std::endl;
Pierre Kraemer's avatar
Pierre Kraemer committed
153 154
		}

Pierre Kraemer's avatar
Pierre Kraemer committed
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
		//Embed the last vertex
//		std::cout << "\t embedding number : " << pt[3] << std::endl;
		d = map.phi_1(map.phi2(d));

		FunctorSetEmb<typename PFP::MAP> femb(map,VERTEX_ORBIT,verticesID[pt[3]]);
		Dart dd = d;
		do {
			femb(dd);
//			std::cout << "embed" << std::endl;
			//vecDartPtrEmb[pt[3]].push_back(dd);
			vecDartsPerVertex[pt[3]].push_back(dd);
			dd = map.phi1(map.phi2(dd));
		} while(dd != d);

//		std::cout << "end tetra" << std::endl;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
171

Pierre Kraemer's avatar
Pierre Kraemer committed
172
//	std::cout << "end 1/2" << std::endl;
Pierre Kraemer's avatar
Pierre Kraemer committed
173

Pierre Kraemer's avatar
Pierre Kraemer committed
174 175 176 177 178 179 180 181
	//Association des phi3
	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
		std::vector<Dart>& vec = vecDartsPerVertex[d];

		for(typename std::vector<Dart>::iterator it = vec.begin(); it!=vec.end(); ++it)
		{
			if(map.phi3(*it)==*it)
Pierre Kraemer's avatar
Pierre Kraemer committed
182
			{
Pierre Kraemer's avatar
Pierre Kraemer committed
183 184
				bool sewn=false;
				for(typename std::vector<Dart>::iterator itnext=it+1; itnext!=vec.end() && !sewn; ++itnext)
Pierre Kraemer's avatar
Pierre Kraemer committed
185
				{
Pierre Kraemer's avatar
Pierre Kraemer committed
186 187
					if(map.getDartEmbedding(VERTEX_ORBIT,map.phi1(*it))==map.getDartEmbedding(VERTEX_ORBIT,map.phi_1(*itnext))
					&& map.getDartEmbedding(VERTEX_ORBIT,map.phi_1(*it))==map.getDartEmbedding(VERTEX_ORBIT,map.phi1(*itnext)))
Pierre Kraemer's avatar
Pierre Kraemer committed
188
					{
Pierre Kraemer's avatar
Pierre Kraemer committed
189 190
						map.sewVolumes(*it,map.phi_1(*itnext));
						sewn = true;
Pierre Kraemer's avatar
Pierre Kraemer committed
191 192 193 194
					}
				}
			}
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
195
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
196 197 198 199 200

	fp.close();
	return true;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
201 202 203 204 205
} // namespace Import

} // namespace Algo

} // namespace CGoGN