diff --git a/Mesh/CenterlineField.cpp b/Mesh/CenterlineField.cpp index 6f3f93b597b91d10e63ff7f0e1decb86565af640..d926719b4be7a625f2c8afaaad03c3e6c53332c7 100644 --- a/Mesh/CenterlineField.cpp +++ b/Mesh/CenterlineField.cpp @@ -25,6 +25,8 @@ #include "GEntity.h" #include "Field.h" #include "GFace.h" +#include "discreteEdge.h" +#include "discreteFace.h" #if defined(HAVE_ANN) #include <ANN/ANN.h> @@ -194,6 +196,26 @@ void orderMLines(std::vector<MLine*> &lines, MVertex *vB, MVertex *vE){ // printf("in order vB= %d =%d \n", vB->getNum(), vE->getNum()); } +static void recurConnectByMEdge(const MEdge &e, + std::multimap<MEdge, MTriangle*, Less_Edge> &e2e, + std::set<MTriangle*> &group, + std::set<MEdge, Less_Edge> &touched, + std::set<MEdge, Less_Edge> &theCut) +{ + if (touched.find(e) != touched.end()) return; + touched.insert(e); + for (std::multimap <MEdge, MTriangle*, Less_Edge>::iterator it = e2e.lower_bound(e); + it != e2e.upper_bound(e); ++it){ + group.insert(it->second); + for (int i = 0; i < it->second->getNumEdges(); ++i){ + MEdge me = it->second->getEdge(i); + if (theCut.find(me) != theCut.end()){ touched.insert(me); break; } + recurConnectByMEdge(me, e2e, group, touched, theCut); + } + } +} + + void cutTriangle(MTriangle *tri, std::map<MEdge,MVertex*,Less_Edge> &cutEdges, std::set<MVertex*> &cutVertices, @@ -310,7 +332,7 @@ Centerline::~Centerline(){ void Centerline::importFile(std::string fileName){ - GModel *current = GModel::current(); + current = GModel::current(); std::vector<GEntity*> entities ; current->getEntities(entities) ; for(unsigned int i = 0; i < entities.size(); i++){ @@ -445,7 +467,7 @@ void Centerline::createBranches(int maxN){ edges.push_back(newBranch) ; } } - printf("in/outlets =%d branches =%d \n", color_edges.size(), edges.size()); + printf("in/outlets =%d branches =%d \n", (int)color_edges.size(), (int)edges.size()); //create children for(unsigned int i = 0; i < edges.size(); ++i) { @@ -619,10 +641,81 @@ void Centerline::buildKdTree(){ } +void Centerline::createFaces(std::vector<std::vector<MTriangle*> > &faces){ + + std::multimap<MEdge, MTriangle*, Less_Edge> e2e; + for(unsigned int i = 0; i < triangles.size(); ++i){ + for(int j = 0; j < 3; j++){ + e2e.insert(std::make_pair(triangles[i]->getEdge(j), triangles[i])); + } + } + int iGroup = 0; + while(!e2e.empty()){ + std::set<MTriangle*> group; + std::set<MEdge, Less_Edge> touched; + recurConnectByMEdge(e2e.begin()->first, e2e, group, touched, theCut); + std::vector<MTriangle*> temp; + temp.insert(temp.begin(), group.begin(), group.end()); + faces.push_back(temp); + for(std::set<MEdge, Less_Edge>::iterator it = touched.begin(); + it != touched.end(); ++it) + e2e.erase(*it); + } + printf("%d faces created \n", faces.size()); + + // int numBef = current->getMaxElementaryNumber(2) + 1; + // for(unsigned int i = 0; i < faces.size(); ++i){ + // int numF = current->getMaxElementaryNumber(2) + 1; + // discreteFace *f = new discreteFace(current, numF); + // current->add(f); + // discFaces.push_back(f); + // std::set<MVertex*> myVertices; + // std::vector<MTriangle*> myFace = faces[i]; + // for(int j= 0; j< myFace.size(); j++){ + // MTriangle *t = myFace[j]; + // f->triangles.push_back(t); + // for (int k= 0; k< 3; k++){ + // MVertex *v = t->getVertex(k); + // std::set<MVertex*>::iterator it = theCutV.find(v); + // if (it != theCutV.end()) myVertices.insert(v); + // } + // } + // f->mesh_vertices.insert(f->mesh_vertices.begin(), + // myVertices.begin(), myVertices.end()); + // } + + // printf("%d discrete Faces (bef =%d) (after =%d)\n", numAfter-numBef, numBef-1, numAfter-1); + +} + +void Centerline::createEdge(std::set<MEdge,Less_Edge> &newCut){ + + int numE = current->getMaxElementaryNumber(1) + 1; + printf("create discrete edge %d \n", numE); + discreteEdge *e = new discreteEdge(current, numE, 0, 0); + current->add(e); + discEdges.push_back(e); + std::set<MVertex*> allV; + std::set<MEdge,Less_Edge> ::iterator itcut = newCut.begin(); + for (; itcut != newCut.end(); itcut++){ + MVertex *v0 = itcut->getVertex(0); + MVertex *v1 = itcut->getVertex(1); + e->lines.push_back(new MLine(v0, v1)); + allV.insert(v0); + allV.insert(v1); + v0->setEntity(e); + v1->setEntity(e); + } + e->mesh_vertices.insert(e->mesh_vertices.begin(), allV.begin(), allV.end()); + theCutV.insert(allV.begin(), allV.end()); + +} + void Centerline::splitMesh(){ Msg::Info("Splitting surface mesh (%d tris) with centerline field ", triangles.size()); + //splitMesh for(unsigned int i = 0; i < edges.size(); i++){ printf("*** branch =%d \n", i); std::vector<MLine*> lines = edges[i].lines; @@ -640,6 +733,12 @@ void Centerline::splitMesh(){ } } + //create discreteFaces + std::vector<std::vector<MTriangle*> > faces; + createFaces(faces); + //createTopologyFromFace(faces); + + //print myCUT.pos FILE * f2 = fopen("myCUT.pos","w"); fprintf(f2, "View \"\"{\n"); std::set<MEdge,Less_Edge>::iterator itp = theCut.begin(); @@ -659,6 +758,17 @@ void Centerline::splitMesh(){ // t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(), // 1.0,1.0,1.0); // } + for (int i= 0; i< faces.size(); i++){ + std::vector<MTriangle*> tris = faces[i]; + for (int j= 0; j< tris.size(); j++){ + MTriangle *t = tris[j]; + fprintf(f2, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", + t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(), + t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(), + t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(), + (double)i, (double)i, (double)i); + } + } fprintf(f2,"};\n"); fclose(f2); @@ -666,6 +776,8 @@ void Centerline::splitMesh(){ } + + void Centerline::cutByDisk(SVector3 &PT, SVector3 &NORM, double &maxRad){ double a = NORM.x(); @@ -718,13 +830,14 @@ void Centerline::cutByDisk(SVector3 &PT, SVector3 &NORM, double &maxRad){ } if (isClosed(newCut)) { printf("closed cut \n"); + createEdge(newCut); triangles = newTris; theCut.insert(newCut.begin(),newCut.end()); //if (step > 1) printf("YOUPIIIIIIIIIIIIIIIIIIIIIII \n"); break; } else { - if (step ==9) printf("no closed cut %d \n", newCut.size()); + if (step ==9) printf("no closed cut %d \n", (int)newCut.size()); step++; // // triangles = newTris; // // theCut.insert(newCut.begin(),newCut.end()); diff --git a/Mesh/CenterlineField.h b/Mesh/CenterlineField.h index 5d89e58d2053b4746279b952e951615d92bc643c..099a935253aff77b8cc8d4c04bd0cb91ac147a89 100644 --- a/Mesh/CenterlineField.h +++ b/Mesh/CenterlineField.h @@ -21,6 +21,8 @@ class MLine; class MVertex; class GEntity; class MTriangle; +class discreteEdge; +class discreteFace; #if defined(HAVE_ANN) #include <ANN/ANN.h> @@ -48,6 +50,7 @@ struct Branch{ class Centerline : public Field{ protected: + GModel *current; ANNkd_tree *kdtree; ANNpointArray nodes; ANNidxArray index; @@ -71,6 +74,11 @@ class Centerline : public Field{ std::vector<MTriangle*> triangles; //the lines cut of the tubular mesh by planes std::set<MEdge,Less_Edge> theCut; + std::set<MVertex*> theCutV; + + //discrete edes and faces created by the cut + std::vector<discreteEdge*> discEdges; + std::vector<discreteFace*> discFaces; public: Centerline(std::string fileName); @@ -122,6 +130,10 @@ class Centerline : public Field{ // perpendicular to the tubular structure void cutByDisk(SVector3 &pt, SVector3 &dir, double &maxRad); + //create discrete Edge + void createEdge(std::set<MEdge,Less_Edge> &newCut); + void createFaces(std::vector<std::vector<MTriangle*> > &faces); + //Print for debugging void printSplit() const;