120 int id = __topo->
get_id();
137 else if (__G ==
_G21 )
165 std::ostringstream idOriginal;
180 printf(
"Error in GetMCFace ID = %d\n", __id);
217 printf(
"Deleting MC Edge\t : ID \"%lu\" at adress %p\n",__mcEdge->
get_id(), __mcEdge);
223 printf(
"Deleting MC Face\t : ID \"%lu\" at adress %p\n",__mcFace->
get_id(), __mcFace);
251 std::ostringstream idOriginal;
257 MCEdge * newMCEdge =
new MCEdge( idOriginal.str(), *__A, *__B);
273 std::ostringstream idOriginal;
274 idOriginal<<
"MCEdge" ;
277 MCEdge * newMCEdge =
new MCEdge(idOriginal.str(), __curve);
314 cout <<
"GetMCEdge : Error: Did not find the MCEdge corresponding to the ID \""<<__id<<
"\"\n";
354 printf(
"Error in GetMCVertex (int id) method : can't find the arc ID %d in G10 Graph !\n", __id);
366 return (
a->GetUserData() == __mcVertex );
381 std::set < MG_FACE * > lst_ref_faces;
382 std::set < MG_ARETE * > lst_ref_edges;
383 std::set < MG_SOMMET * > lst_ref_vertices;
387 for (
unsigned it_shells = 0; it_shells < nb_shells; it_shells++)
391 for (
unsigned it_coface = 0; it_coface < nb_coface; it_coface++)
394 lst_ref_faces.insert(face);
397 for (
unsigned it_loop = 0; it_loop < nb_loop; it_loop++)
402 for (
unsigned it_edge = 0; it_edge < nb_edge; it_edge++)
405 lst_ref_edges.insert(edge);
416 std::map <MG_FACE *, MCFace *> mapRefToMCFace;
417 std::map <MG_ARETE *, MCEdge *> mapRefToMCEdge;
418 std::map <MG_SOMMET *, MCVertex *> mapRefToMCVertex;
421 for (std::set<MG_SOMMET*>::iterator it_vert = lst_ref_vertices.begin();
422 it_vert != lst_ref_vertices.end(); it_vert++)
429 mapRefToMCVertex [ refVertex ] = mcVertex;
433 for (std::set <MG_ARETE *>::iterator it_edge = lst_ref_edges.begin();
434 it_edge != lst_ref_edges.end();
442 mapRefToMCEdge [ refEdge ] = mcEdge;
446 for (std::set<MG_FACE*>::iterator it_face = lst_ref_faces.begin();
447 it_face != lst_ref_faces.end();
455 mapRefToMCFace [ refFace ] = mcFace;
459 for (std::set<MG_FACE*>::iterator it_face = lst_ref_faces.begin();
460 it_face != lst_ref_faces.end();
466 MCFace * mcFace = mapRefToMCFace [ refFace ];
468 printf(
"Initializing\tMC Face\tID \"%lu\" \t(Ref Face ID \"%lu\")\n",mcFace->
get_id(), refFace->
get_id());
481 for (std::set <MG_ARETE *>::iterator it_edge = lst_ref_edges.begin();
482 it_edge != lst_ref_edges.end();
488 MCEdge * mcEdge = mapRefToMCEdge [ refEdge ];
491 printf(
"Initializing\t MC Edge\t%lu of %lu : ID = \"%lu\" \t(Reference Edge ID \"%lu\")\n", std::distance(lst_ref_edges.begin(), it_edge)+1, lst_ref_edges.size(), mcEdge->
get_id(), refEdge->
get_id());
499 std::vector <int> nodes;
504 MCFace * mcFace = mapRefToMCFace [ refFace ];
507 nodes.push_back(mcFace->
get_id());
517 for (std::set<MG_SOMMET*>::iterator it_vertex = lst_ref_vertices.begin();
518 it_vertex != lst_ref_vertices.end();
524 MCVertex * mcVertex = mapRefToMCVertex [ refVertex ];
529 std::vector <int> nodes;
537 MCFace * mcFace = mapRefToMCFace [ refFace ];
539 if (std::find (nodes.begin(), nodes.end(), mcFace->
get_id()) == nodes.end())
540 nodes.push_back(mcFace->
get_id());
551 std::vector <int> nodes;
555 MCEdge * mcEdge = mapRefToMCEdge [ refEdge ];
557 nodes.push_back(mcEdge->
get_id());
571 std::vector <MCVertex*> extremities;
584 std::string graphNeato;
585 std::ofstream neatoFile;
586 neatoFile.open( __filename );
588 std::cout << graphNeato;
589 neatoFile << graphNeato;
603 int id = mcVertex->
get_id();
622 std::vector <MCVertex * > origEdgeExtremities;
629 if ( __splitRefVertex == NULL )
631 printf(
"Can't split MC Edge in MC body\n");
638 printf(
"Inserting MC Vertex\t : ID \"%lu\" \n", __mcVertex->
get_id());
655 for (Graph::Arc::MultimapNodesById::iterator itG21Node = G21A[2]->Nodes().begin();
656 itG21Node != G21A[2]->
Nodes().end();
659 faceId[i] = itG21Node->first;
660 G21N[i++] = itG21Node->second;
666 edgeId[2] = __mcEdge->
get_id();
667 for (i = 0; i < 2; i++)
668 edgeId[i] = __result[i]->get_id();
671 for (i = 0; i < 2; i++)
690 G10A[2]->
Add(G10N[i]);
691 G10N[i]->
Add(G10A[2]);
703 for (
int j=0; j<2; j++)
704 if (origEdgeExtremities[j]->
Contains( refVertex ))
705 V = origEdgeExtremities[j];
714 G10A[i]->
Add(G10N[i]);
715 G10N[i]->
Add(G10A[i]);
724 G20Arc->
Add(G20Node[i]);
725 G20Node[i]->
Add(G20Arc);
728 printf(
"G10A[2]->Rank = %d\n", G10A[2]->Rank());
737 MCEdge * newMCEdge = __result[i];
739 std::vector<MCVertex*> mcVertexExtremities;
752 __mctChanges->
V.insert( std::make_pair ((
MCVertex*)NULL, __mcVertex));
754 __mctChanges->
E.insert( std::make_pair (__mcEdge, (
MCEdge*) NULL) );
755 __mctChanges->
E.insert( std::make_pair ((
MCEdge*) NULL, __result[0]) );
756 __mctChanges->
E.insert( std::make_pair ((
MCEdge*) NULL, __result[1]) );
763 __rtChanges->
V.insert( std::make_pair ((
MCVertex*)NULL , __splitRefVertex) );
765 __rtChanges->
E.insert( std::make_pair (__origRefEdge , __splitRefEdges[0]) );
766 __rtChanges->
E.insert( std::make_pair (__origRefEdge , __splitRefEdges[1]) );
777 std::ofstream neatoFile;
778 neatoFile.open( __filename );
779 neatoFile <<
"graph \""<< __graphname <<
"\" {" << std::endl;
780 neatoFile <<
"node [ shape=box , color = blue ]\n";
785 neatoFile <<
"\""<<itarcs->first<<
"\" [ shape=point, style=filled, fillcolor=red ]\n";
789 neatoFile <<
"\""<< itnodes->first <<
"\"";
791 neatoFile <<
"\""<< itarcs->first <<
"\"";
792 neatoFile <<
" [ len=1 ] ";
793 neatoFile << std::endl;
796 neatoFile <<
"}" << std::endl;
797 neatoFile << std::endl;
817 printf(
"MC Vertex %ld does not exist !\n", topo->
get_id());
831 if (mctopo != topo || topo2 != topo)
833 printf(
"MC Edge %ld does not exist !\n", topo->
get_id());
845 printf(
"MC Face %ld does not exist !\n", topo->
get_id());
852 printf(
"The topological link claims a dimension \"%d\" > 2 or < 0 !\n", topo->
get_dimension());
857 printf(
"Topo = NULL\n");
869 if (
V2(_mcBody, edge22) ==
false)
870 printf(
"MC Edge ID=%lu not OK\n", edge22->get_id());
880 int __id = __mcEdge->
get_id();
887 printf(
"Deleting MC Edge\t : ID \"%d\" at adress %p \n", __id, __mcEdge);
897 Graph::Arc::MultimapNodesById::iterator itNode = arcG21->
Nodes().begin();
900 faceId[i] = itNode->first;
901 faceNode[i] = itNode->second;
914 faceId[2] = newMCFace->
get_id();
915 faceNode[2] =
_G21->
MergeNodes(faceNode[0], faceNode[1], faceId[2]);
929 printf (
"Adding new merged face %d = { %d + %d }\n", faceId[2], faceId[0], faceId[1]);
957 printf(
"Deleting MC Vertex\t : ID \"%lu\" at adress %p\n",__mcVertex->
get_id(), __mcVertex);
964 if ( g1vArc->
Rank() == 2 )
967 std::vector <MCEdge *> edge;
973 std::set<MCFace*>::iterator itr=listMCFaces.begin();
974 for (
unsigned i=0;i<2;i++)
987 printf(
"the deleted vertex was adjacent to %d / %lu faces\n",
_G20->
GetArc( __mcVertex->
get_id() )->
Rank(), listMCFaces.size());
988 printf(
"the deleted vertex was adjacent to %d edges\n",
_G10->
GetArc( __mcVertex->
get_id() )->
Rank());
1006 std::vector<MCVertex*> mcVertexExtremities;
1011 if (newPolyCurve->
get_sommet1() != mcVertexExtremities[0]->GetRefVertex())
1021 __mctChanges->
V.insert( std::make_pair (__mcVertex, (
MCVertex*) NULL) );
1023 __mctChanges->
E.insert( std::make_pair (edge[0], newMCEdge) );
1024 __mctChanges->
E.insert( std::make_pair (edge[1], newMCEdge) );
1027 else if (g1vArc->
Rank() == 0)
1035 __mctChanges->
V.insert( std::make_pair (__mcVertex, (
MCVertex*) NULL) );
1040 printf(
"Warning : MCBody can't delete vertex %d because its rank equals %d\n", g1vArc->
Id(), g1vArc->
Rank());
1048 Graph::Arc * V1_G10Arc, *V2_G10Arc, *V1_G20Arc, *V2_G20Arc;
1049 V1=__deleteVertex; V1_id=V1->
get_id();
1050 V2=__targetVertex; V2_id=
V2->get_id();
1057 Graph::Arc::MultimapNodesById::iterator itNode;
1060 for (itNode = V1_G10Arc_MapNodes.begin(); itNode != V1_G10Arc_MapNodes.end(); itNode++)
1067 for (itNode = V1_G10Arc_MapNodes.begin(); itNode != V1_G10Arc_MapNodes.end(); itNode++)
1074 for (itNode = V1_G20Arc_MapNodes.begin(); itNode != V1_G20Arc_MapNodes.end(); itNode++)
1108 printf(
"Contracting\tMC Edge \"%lu\" to MC Vertex \"%lu\"\n", __mcEdge->
get_id(), __targetVertex->
get_id());
1110 MCVertex * V3 = __targetVertex, * V4;
1112 int V4_id, V3_id, E3_id;
1113 Graph::Arc * V4_G10Arc, *V3_G10Arc, * V4_G20Arc, *V3_G20Arc, * E3_G21Arc;
1125 for (Graph::Node::MultimapArcsById::const_iterator incidentArcIter = E3_G10Node->
IncidentArcs().begin();
1128 if (incidentArcIter->first != V3_id)
1129 V4_G10Arc = incidentArcIter->second;
1131 V4_id = V4->get_id();
1137 for (Graph::Arc::MultimapNodesById::const_iterator itNode = initialV4Nodes.begin();
1138 itNode != initialV4Nodes.end();
1141 int id = itNode->first;
1145 printf(
"Warning while Contracting\tMC Edge \"%d\" to MC Vertex \"%d\" \nArc %d is a loop of node %d\n",
1146 V4_id, E3_id, V3_id,
id);
1153 for (Graph::Arc::MultimapNodesById::const_iterator itNode = initialV4Nodes.begin();
1154 itNode != initialV4Nodes.end();
1157 oldEdges.insert(
GetMCEdge(itNode->second));
1160 for (Graph::Arc::MultimapNodesById::const_iterator itNode = initialV4Nodes.begin();
1161 itNode != initialV4Nodes.end();
1164 int id = itNode->first;
1173 int newId = newEdge->
get_id();
1176 printf(
"Edge Contraction : merging edges %d and %d in new edge %d\n",
node->Id(), E3_id, newId);
1182 newEdges.insert(newEdge);
1185 for (Graph::Arc::MultimapNodesById::const_iterator itNode = V4_G20Arc->
Nodes().begin();
1186 itNode != V4_G20Arc->
Nodes().end();
1190 int idN = itNode->first;
1191 if (E3_G21Arc->
Nodes().find(idN) == E3_G21Arc->
Nodes().end())
1197 for (Graph::Arc::MultimapNodesById::const_iterator itNode = initialV4Nodes.begin();
1198 itNode != initialV4Nodes.end();
1212 for (std::set<MCEdge*>::iterator itEdge=newEdges.begin();itEdge!=newEdges.end();itEdge++)
1214 MCEdge * newEdge = *itEdge;
1216 std::vector<MCVertex*> mcVertexExtremities;
1232 for ( Graph::Node::MultimapArcsById::const_iterator it = arcsOfG10Node.begin();
1233 it != arcsOfG10Node.end(); it++)
1239 std::set < MCFace * >
1242 std::set < MCFace * > result;
1251 for (Graph::Arc::MultimapNodesById::const_iterator it = nodesOfG21Arc.begin();
1252 it != nodesOfG21Arc.end();
1257 result.insert( mcFace );
1265 std::set < MCEdge * >
1268 std::set < MCEdge * > result;
1277 for (Graph::Node::MultimapArcsById::const_iterator it = arcsOfG21Node.begin();
1278 it != arcsOfG21Node.end();
1289 std::vector < std::vector < MCEdge * > >
1292 std::set < std::set < Graph::Node * > > loops;
1293 std::vector < std::vector < MCEdge * > > result;
1300 std::set < std::set < Graph::Node * > > scc;
1303 for (std::set < std::set < Graph::Node * > >::iterator it1 = scc.begin();
1308 std::vector <MCEdge * > loop;
1309 const std::set < Graph::Node * > & loopNodes = *it1;
1310 for ( std::set < Graph::Node * >::const_iterator it2 = loopNodes.begin();
1311 it2 != loopNodes.end();
1316 loop.push_back(mcEdge);
1318 result.push_back(loop);
1325 std::vector < std::vector < MCEdge * > >
1328 std::set < std::set < Graph::Node * > > loops;
1329 std::vector < std::vector < MCEdge * > > result;
1336 std::vector < std::vector < Graph::Node * > > cycles;
1339 for (std::vector < std::vector < Graph::Node * > >::iterator it1 = cycles.begin();
1340 it1 != cycles.end();
1344 std::vector <MCEdge * > mcEdgeLoop;
1345 std::vector < Graph::Node * > & cycleNodes = *it1;
1346 for ( std::vector < Graph::Node * >::iterator it2 = cycleNodes.begin();
1347 it2 != cycleNodes.end();
1352 mcEdgeLoop.push_back(mcEdge);
1354 result.push_back(mcEdgeLoop);
1357 for (Graph::Graph::MapNodesById::const_iterator itNode =
G10->
GetNodes().begin();
1362 for (Graph::Node::MultimapArcsById::const_iterator itArc =
node->IncidentArcs().begin();
1363 itArc !=
node->IncidentArcs().end();
1369 std::vector < MCEdge * > loop;
1371 loop.push_back(mcEdge);
1372 result.push_back(loop);
1386 for ( Graph::Node::MultimapArcsById::const_iterator it = arcsOfG20Node.begin();
1387 it != arcsOfG20Node.end(); it++)
1398 for (Graph::Arc::MultimapNodesById::const_iterator it =
a->Nodes().begin();
1399 it !=
a->Nodes().end();
1403 __list.push_back(mcEdge);
1412 for (Graph::Arc::MultimapNodesById::const_iterator it =
a->Nodes().begin();
1413 it !=
a->Nodes().end();
1417 __list.insert(mcEdge);
1427 for (Graph::Arc::MultimapNodesById::const_iterator it =
a->Nodes().begin();
1428 it !=
a->Nodes().end();
1432 __list.insert(mcFace);
1437 std::set < Graph::Node * > nodes;
1447 for (Graph::Node::MultimapArcsById::const_iterator it = arcsOfG21Node.begin();
1448 it != arcsOfG21Node.end();
1453 nodes.insert(g10Node);
1472 for (
unsigned it_shells = 0; it_shells < nb_shells; it_shells++)
1477 for (
unsigned it_coface = 0; it_coface < nb_coface; it_coface++)
1486 for (
unsigned it_loop = 0; it_loop < nb_loop; it_loop++)
1491 for (
unsigned it_edge = 0; it_edge < nb_edge; it_edge++)
1497 for (
int itRefEdge = 0; itRefEdge != mcEdge->
GetPolyCurve()->GetRefEdgeCount(); itRefEdge++)
1504 int nbInteriorFaces = 0;
1511 if (nbInteriorFaces == 1)
1512 iRefEdge = itRefEdge;
1516 if ( iRefEdge != -1 )
1567 std::ostringstream idBRepVolume;
1581 MG_SURFACE * surface = mcFace->get_surface();
1585 std::vector <MG_FACE*> faces;std::vector <MG_ARETE*> edges;std::vector <int> edgesense;
1586 for (std::set <MCEdge*>::iterator itEdge = mcEdgeArray.begin();
1587 itEdge != mcEdgeArray.end(); itEdge++)
1589 MCEdge * mcEdge = *itEdge;
1596 faces.push_back(mcFace);
1597 edges.push_back(mcEdge);
1599 edgesense.push_back(sense);
1605 faces.push_back(mcFace); faces.push_back(mcFace);
1606 edges.push_back(mcEdge);edges.push_back(mcEdge);
1607 edgesense.push_back(+1);edgesense.push_back(-1);
1610 std::vector < std::vector<CAD4FE::MakeLoops::CoEdge*> > loops;
1613 for (
unsigned k=0;k<loops.size();k++)
1617 for (
unsigned l=0;l<loops[k].size();l++)
1640 std::set<MCFace*> adjacentFaces;
1642 std::set<MCEdge*> adjacentEdges;
1645 if ( adjacentFaces.size() == 1 && adjacentEdges.size() == 0)
1647 *__mcFace = *(adjacentFaces.begin());
1668 std::vector<MCVertex*> edgeVertices;
1669 for (
int i=0;i<2;i++) edgeVertices.push_back(__mcVertex);
1692 std::set < CAD4FE::MCFace * > lst_mc_faces;
1693 std::set < CAD4FE::MCEdge * > lst_mc_edges;
1694 std::set < CAD4FE::MCVertex * > lst_mc_vertices;
1695 std::set < MG_COQUILLE * > lst_mc_shell;
1696 std::set < MG_BOUCLE * > lst_mc_loop;
1700 for (
unsigned it_shells = 0; it_shells < nb_shells; it_shells++)
1703 lst_mc_shell.insert(shell);
1705 for (
unsigned it_coface = 0; it_coface < nb_coface; it_coface++)
1708 lst_mc_faces.insert(face);
1711 for (
unsigned it_loop = 0; it_loop < nb_loop; it_loop++)
1714 lst_mc_loop.insert(loop);
1717 for (
unsigned it_edge = 0; it_edge < nb_edge; it_edge++)
1720 lst_mc_edges.insert(edge);
1732 LISTE_MG_TRIANGLE::iterator itTri;
1735 if (lst_mc_faces.end() != lst_mc_faces.find((
CAD4FE::MCFace*)tri->get_lien_topologie()))
1737 LISTE_MG_SEGMENT::iterator itSeg;
1740 if (lst_mc_edges.end() != lst_mc_edges.find((
CAD4FE::MCEdge*)seg->get_lien_topologie())
1741 || lst_mc_faces.end() != lst_mc_faces.find((
CAD4FE::MCFace*)seg->get_lien_topologie())
1744 LISTE_MG_NOEUD::iterator itNo;
1748 lst_mc_vertices.end() != lst_mc_vertices.find((
CAD4FE::MCVertex*)no->get_lien_topologie())
1749 || lst_mc_edges.end() != lst_mc_edges.find((
CAD4FE::MCEdge*)no->get_lien_topologie())
1750 || lst_mc_faces.end() != lst_mc_faces.find((
CAD4FE::MCFace*)no->get_lien_topologie())
1759 for (std::set < MG_COQUILLE * >::iterator itShell = lst_mc_shell.begin();
1760 itShell != lst_mc_shell.end();
1763 for (std::set<CAD4FE::MCFace *>::iterator itFace = lst_mc_faces.begin(); itFace != lst_mc_faces.end(); itFace++)
1770 for (std::set < MG_BOUCLE * >::iterator itLoop = lst_mc_loop.begin();
1771 itLoop != lst_mc_loop.end();
1775 for (std::set<CAD4FE::MCEdge *>::iterator itEdge = lst_mc_edges.begin(); itEdge != lst_mc_edges.end(); itEdge++)
1782 for (std::set<CAD4FE::MCVertex *>::iterator itVertex = lst_mc_vertices.begin(); itVertex != lst_mc_vertices.end(); itVertex++)