importTet.hpp 6.29 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, const std::string& 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

	// open file
Pierre Kraemer's avatar
Pierre Kraemer committed
48
	std::ifstream fp(filename.c_str(), std::ios::in);
Pierre Kraemer's avatar
Pierre Kraemer committed
49 50
	if (!fp.good())
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
51
		std::cerr << "Unable to open file " << filename << std::endl;
Pierre Kraemer's avatar
Pierre Kraemer committed
52 53 54 55
		return false;
	}

	std::string ligne;
Pierre Kraemer's avatar
Pierre Kraemer committed
56
	unsigned int nbv, nbt;
Pierre Kraemer's avatar
Pierre Kraemer committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
	// 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);
Pierre Kraemer's avatar
Pierre Kraemer committed
73
	for(unsigned int i = 0; i < nbv;++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
	{
		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
		// Embed three vertices
Pierre Kraemer's avatar
Pierre Kraemer committed
136
		for(unsigned int j = 0 ; j < 3 ; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
137 138
		{
//			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

			Dart dd = d;
Pierre Kraemer's avatar
Pierre Kraemer committed
143 144
			do
			{
Pierre Kraemer's avatar
Pierre Kraemer committed
145
				femb(dd);
Pierre Kraemer's avatar
Pierre Kraemer committed
146 147 148 149
				//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
150

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
156 157 158 159
		//Embed the last vertex
//		std::cout << "\t embedding number : " << pt[3] << std::endl;
		d = map.phi_1(map.phi2(d));

Pierre Kraemer's avatar
Pierre Kraemer committed
160
		FunctorSetEmb<typename PFP::MAP> femb(map, VERTEX_ORBIT, verticesID[pt[3]]);
Pierre Kraemer's avatar
Pierre Kraemer committed
161
		Dart dd = d;
Pierre Kraemer's avatar
Pierre Kraemer committed
162 163
		do
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
164 165 166 167 168 169 170 171 172
			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
173

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

Pierre Kraemer's avatar
Pierre Kraemer committed
176 177 178 179 180 181 182
	//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)
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
183
			if(map.phi3(*it) == *it)
Pierre Kraemer's avatar
Pierre Kraemer committed
184
			{
Pierre Kraemer's avatar
Pierre Kraemer committed
185 186
				bool sewn = false;
				for(typename std::vector<Dart>::iterator itnext = it+1; itnext != vec.end() && !sewn; ++itnext)
Pierre Kraemer's avatar
Pierre Kraemer committed
187
				{
Pierre Kraemer's avatar
Pierre Kraemer committed
188 189
					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
190
					{
Pierre Kraemer's avatar
Pierre Kraemer committed
191
						map.sewVolumes(*it, map.phi_1(*itnext));
Pierre Kraemer's avatar
Pierre Kraemer committed
192
						sewn = true;
Pierre Kraemer's avatar
Pierre Kraemer committed
193 194 195 196
					}
				}
			}
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
197
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
198 199 200 201 202

	fp.close();
	return true;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
203 204 205 206 207
} // namespace Import

} // namespace Algo

} // namespace CGoGN