43 #include <atl\atlmod.h>
44 #include "smartvars.h"
50 #pragma package(smart_init)
59 for (std::map<MG_FACE *, double *>::const_iterator it_face_tessPts =
lst_face_tessPts.begin();
63 double * tessPts = it_face_tessPts->second;
75 for (itTriang=0;itTriang <adjacentTriangles->
get_nb(); itTriang++)
79 if ( __face != refFace )
97 double angle =
acos(-(x1x2*x2x3));
100 normalTriangle += normal;
104 normalTriangle /= angleTot;
105 for (
int j=0;j<3;j++)
106 __normal[j]=normalTriangle[j];
110 for (
int j=0;j<3;j++)
203 for (
int i=0; i<3; i++)
204 center[i] = .5*(__bbox[i] + __bbox[3+i]);
207 for (
int i=0; i<3; i++)
208 step[i] = (__bbox[3+i] - __bbox[i])/__nb_steps[i];
212 for (
int i=0; i<6; i++) bbox[i] = __bbox[i];
214 for (
int i=0; i<3; i++)
215 bbox[i+3] += .1*step[i];
216 for (
int i=0; i<3; i++)
217 bbox[i] -= .1*step[i];
219 __grid.
initialiser(bbox[0], bbox[1], bbox[2], bbox[3], bbox[4], bbox[5], __nb_steps[0], __nb_steps[1], __nb_steps[2]);
232 if (tessellationTolerance != 0)
241 for (
unsigned it_shells = 0; it_shells < nb_shells; it_shells++)
245 for (
unsigned it_coface = 0; it_coface < nb_coface; it_coface++)
251 CComPtr<IFace2> sld_face;
256 printf(
"Face \"%s\" has %d triangles\n", face->
get_idoriginal().c_str(), nbTessTriang);
262 double bbox[6] = {1E308, 1E308, 1E308, -1E308, -1E308, -1E308};
263 for (std::map<MG_FACE *, double *>::const_iterator it_face_tessPts =
lst_face_tessPts.begin();
267 MG_FACE * face = it_face_tessPts->first;
268 double * tessPts = it_face_tessPts->second;
272 for (
long itPt = 0; itPt < 9*nbTessTriang; itPt += 3)
275 for (
int i=0; i<3; i++)
277 vertex[i] = tessPts[ itPt + i ];
278 if (vertex[i] < bbox[i])
279 bbox[i+0] = vertex[i];
280 if (vertex[i] > bbox[i+3])
281 bbox[i+3] = vertex[i];
291 int nb_step_grid [3] = {34,34,34};
292 cstr_grid<MG_NOEUD*>(bbox, nb_step_grid, grid);
293 double epsilon = 1E-8*
sqrt(pow(bbox[3]-bbox[0],2)+pow(bbox[4]-bbox[1],2)+pow(bbox[5]-bbox[2],2));
295 for (std::map<MG_FACE *, double *>::const_iterator it_face_tessPts =
lst_face_tessPts.begin();
299 MG_FACE * face = it_face_tessPts->first;
300 double * tessPts = it_face_tessPts->second;
304 for (
long iTriang = 0; iTriang < nbTessTriang; iTriang ++)
309 for (
int iVert = 0; iVert < 3; iVert ++)
312 for (
int j = 0; j < 3; j++)
313 vertex [j] = tessPts[ 9*iTriang + 3*iVert + j ];
319 int nb_neighbours = neighbouring_nodes.
get_nb();
320 double distance_closest_node = 1E308;
322 for (
int itNode=0; itNode<nb_neighbours; itNode++)
325 double node_vertex_distance = pow(n->
get_x()-vertex[0],2) + pow(n->
get_y()-vertex[1],2) + pow(n->
get_z()-vertex[2],2);
326 if ( node_vertex_distance < distance_closest_node )
328 distance_closest_node = node_vertex_distance;
335 triangNodes[iVert] =
tess->
ajouter_mg_noeud (face, vertex[0], vertex[1], vertex[2],TRIANGULATION);
337 grid.
inserer( triangNodes[iVert] );
341 triangNodes[iVert] = closest_node;
346 std::vector<MG_SEGMENT*> tmp;
357 std::vector<MG_NOEUD*> missing_vertex_node;
358 double epsilon_vertex = 1E-6*
sqrt(pow(bbox[3]-bbox[0],2)+pow(bbox[4]-bbox[1],2)+pow(bbox[5]-bbox[2],2));
361 for (
long iVert = 0; iVert < nb_vertices; iVert++)
364 double vertex_pos [3];
369 grid.
rechercher(vertex_pos[0], vertex_pos[1], vertex_pos[2], epsilon_vertex, neighbouring_nodes);
371 int nb_neighbours = neighbouring_nodes.
get_nb();
372 double distance_closest_node = 1E308;
374 for (
int itNode=0; itNode<nb_neighbours; itNode++)
377 double node_vertex_distance = pow(n->
get_x()-vertex_pos[0],2)+pow(n->
get_y()-vertex_pos[1],2)+pow(n->
get_z()-vertex_pos[2],2);
378 if ( node_vertex_distance < distance_closest_node && node_vertex_distance < epsilon_vertex*epsilon_vertex )
380 distance_closest_node = node_vertex_distance;
393 printf(
"Warning : while importing SW tessellation, the distance between the vertex and the tessellation node is\n");
394 printf(
"%e while the tolerance is %e\n",
sqrt(distance_closest_node), epsilon_vertex);
395 printf(
"Warning : while importing the tessellation from SW no tessellation node was found for vertex id %d\n", vertex->
get_id());
396 printf(
"A new node located of the missing vertex \n is gonna be inserted on the closest contour segment\n");
397 MG_NOEUD * n =
new MG_NOEUD(vertex, vertex_pos[0], vertex_pos[1], vertex_pos[2],TRIANGULATION);
399 missing_vertex_node.push_back(n);
404 LISTE_MG_SEGMENT::iterator itSeg;
410 unsigned nb_adj_triang = lst_triangle->
get_nb();
411 if (nb_adj_triang == 0)
413 if (nb_adj_triang == 1)
418 std::set <MG_FACE * > adjacent_faces;
420 for (
unsigned it_triang = 0; it_triang < nb_adj_triang; it_triang++)
425 adjacent_faces.insert(face);
427 if (adjacent_faces.size() > 1)
429 for (std::set <MG_FACE*>::const_iterator it_adjacent_face = adjacent_faces.begin();
430 it_adjacent_face != adjacent_faces.end();
433 MG_FACE * adj_face = *it_adjacent_face;
439 std::set <MG_ARETE *> lst_missing_vertex_edge;
440 for (
unsigned it_node = 0; it_node < missing_vertex_node.size(); it_node++)
442 MG_NOEUD * n = missing_vertex_node[it_node];
446 std::set <MG_FACE*> lst_adjacent_faces;
453 lst_missing_vertex_edge.insert(edge);
455 for (
int j=0; j < nb_adjacent_faces; j++)
463 std::set<MG_SEGMENT*> visited_segs;
464 std::set<MG_SEGMENT*> shared_segs;
465 for (std::set<MG_FACE *>::iterator
466 it_face = lst_adjacent_faces.begin();
467 it_face != lst_adjacent_faces.end();
474 for (std::vector<MG_SEGMENT *>::const_iterator
475 itSegs = segs.begin();
476 itSegs != segs.end();
479 bool segment_shared_by_several_faces = (visited_segs.find(*itSegs) != visited_segs.end() );
480 if (segment_shared_by_several_faces)
481 shared_segs.insert(*itSegs);
483 visited_segs.insert(*itSegs);
488 n_xyz[0] = n->
get_x();
489 n_xyz[1] = n->
get_y();
490 n_xyz[2] = n->
get_z();
493 double minDist = 1E99;
495 for (std::set<MG_SEGMENT *>::iterator it_seg = shared_segs.begin();
496 it_seg != shared_segs.end(); it_seg++)
499 double seg_xyz[2][3];
503 seg_xyz[0][0] = seg_nodes[0]->
get_x();
504 seg_xyz[0][1] = seg_nodes[0]->
get_y();
505 seg_xyz[0][2] = seg_nodes[0]->
get_z();
506 seg_xyz[1][0] = seg_nodes[1]->
get_x();
507 seg_xyz[1][1] = seg_nodes[1]->
get_y();
508 seg_xyz[1][2] = seg_nodes[1]->
get_z();
510 if (distance < minDist)
521 for (std::set<MG_FACE *>::iterator
522 it_face = lst_adjacent_faces.begin();
523 it_face != lst_adjacent_faces.end();
530 std::vector<MG_SEGMENT*>::iterator itSeg = std::find(segs.begin(), segs.end(), closestSeg);
531 if (itSeg != segs.end())
534 segs.push_back(splitSegs[0]);
535 segs.push_back(splitSegs[1]);
543 std::set<MG_ARETE *> lst_recognized_edge;
544 for (
long it_edge = 0; it_edge < nb_edges; it_edge++)
550 std::set<MG_FACE *> lst_adjacent_faces;
551 for (
int j=0; j < nb_adjacent_faces; j++)
559 std::set<MG_SEGMENT*> visited_segs;
560 std::set<MG_SEGMENT*> shared_segs;
561 for (std::set<MG_FACE *>::iterator
562 it_face = lst_adjacent_faces.begin();
563 it_face != lst_adjacent_faces.end();
570 for (std::vector<MG_SEGMENT *>::const_iterator
571 itSegs = segs.begin();
572 itSegs != segs.end();
575 bool segment_shared_by_several_faces = (visited_segs.find(*itSegs) != visited_segs.end() );
576 if (segment_shared_by_several_faces)
577 shared_segs.insert(*itSegs);
579 visited_segs.insert(*itSegs);
583 std::set<MG_ARETE*> lst_candidate_edge;
586 std::set < MG_SEGMENT * > segs = shared_segs;
591 std::vector <MG_SEGMENT *> visitedSegs;
592 std::vector <MG_NOEUD * > visitedNodes;
594 if (lst_missing_vertex_edge.find(edge) != lst_missing_vertex_edge.end())
595 printf(
"Trying to recognize segments of an edge which had a missing vertex !\n");
598 std::set < MG_SOMMET * > edgeExtremities;
600 MG_SOMMET * vertex2=((
MG_SOMMET*) visitedNodes[ visitedNodes.size()-1 ]->get_lien_topologie());
601 edgeExtremities.insert ( vertex1 );
602 edgeExtremities.insert ( vertex2 );
606 if (visitedSegs.size() == 0)
607 printf(
"No segments were found for edge %d", edge->
get_id());
612 if (lst_candidate_edge.size() == 1)
614 coincident_edge = *(lst_candidate_edge.begin());
620 std::set<MG_ARETE*>::iterator it_candidate_edge = lst_candidate_edge.find(coincident_edge);
621 if (it_candidate_edge != lst_candidate_edge.end())
622 lst_candidate_edge.erase(it_candidate_edge);
625 lst_recognized_edge.insert(coincident_edge);
627 if (coincident_edge != edge)
630 for (std::vector<MG_SEGMENT*>::iterator it_visitedSegs = visitedSegs.begin();
631 it_visitedSegs != visitedSegs.end();
639 for (
int j=0;j<2;j++)
641 if (nos[j]->get_lien_topologie()->get_dimension() >= 1)
650 if (lst_recognized_edge.find(edge) == lst_recognized_edge.end())
652 printf(
"Problem while classifying the segments of this edge no segment was found for edge %d\n", edge->
get_id());