From c4db26c7f74ead6e25e4a92d57b86580b4131571 Mon Sep 17 00:00:00 2001 From: Emilie Marchandise <emilie.marchandise@uclouvain.be> Date: Tue, 24 Apr 2012 10:13:00 +0000 Subject: [PATCH] Centerline field has now one action callback: run and three possible actions (closeVolume,extrudeWall ebd cutMesh) --- Mesh/CenterlineField.cpp | 77 +++++++++++++++++++++------------------- Mesh/CenterlineField.h | 15 ++++---- 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/Mesh/CenterlineField.cpp b/Mesh/CenterlineField.cpp index 5b14a10887..5897f27cd0 100644 --- a/Mesh/CenterlineField.cpp +++ b/Mesh/CenterlineField.cpp @@ -330,9 +330,9 @@ Centerline::Centerline(std::string fileName): kdtree(0), kdtreeR(0), nodes(0), n nbElemLayer = 3; update_needed = false; - is_cut = false; - is_closed = false; - is_extruded = false; + is_cut = 0; + is_closed = 0; + is_extruded = 0; } Centerline::Centerline(): kdtree(0), kdtreeR(0), nodes(0), nodesR(0){ @@ -345,20 +345,24 @@ Centerline::Centerline(): kdtree(0), kdtreeR(0), nodes(0), nodesR(0){ nbPoints = 25; hLayer = 0.3; nbElemLayer = 3; - is_cut = false; - is_closed = false; - is_extruded = false; + is_cut = 0; + is_closed = 0; + is_extruded = 0; - callbacks["closeVolume"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::closeVolume, "Create In/Outlet planar faces \n"); - callbacks["extrudeWall"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::extrudeWall, "Extrude wall \n"); - callbacks["cutMesh"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::cutMesh, "Cut the initial mesh in different mesh partitions using the centerlines \n"); + // callbacks["closeVolume"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::closeVolume, "Create In/Outlet planar faces \n"); + // callbacks["extrudeWall"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::extrudeWall, "Extrude wall \n"); + // callbacks["cutMesh"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::cutMesh, "Cut the initial mesh in different mesh partitions using the centerlines \n"); + + options["closeVolume"] = new FieldOptionInt(is_closed, "Action: Create In/Outlet planar faces"); + options["extrudeWall"] = new FieldOptionInt(is_extruded, "Action: Extrude wall"); + options["cutMesh"] = new FieldOptionInt(is_cut, "Action: Cut the initial mesh in different mesh partitions using the centerlines"); + callbacks["run"] = new FieldCallbackGeneric<Centerline>(this, &Centerline::run, "Run actions (closeVolume, extrudeWall, cutMesh) \n"); options["FileName"] = new FieldOptionString (fileName, "File name for the centerlines", &update_needed); options["nbPoints"] = new FieldOptionInt(nbPoints, "Number of mesh elements in a circle"); options["nbElemLayer"] = new FieldOptionInt(nbElemLayer, "Number of mesh elements the extruded layer"); options["hLayer"] = new FieldOptionDouble(hLayer, "Thickness (% of radius) of the extruded layer"); - } Centerline::~Centerline(){ @@ -615,7 +619,7 @@ void Centerline::buildKdTree(){ void Centerline::createSplitCompounds(){ - //number of discrete vertices, edges, faces and regions for cut mesh + //number of discrete vertices, edges, faces and regions for the mesh NV = current->getMaxElementaryNumber(0); NE = current->getMaxElementaryNumber(1); NF = current->getMaxElementaryNumber(2); @@ -810,7 +814,9 @@ void Centerline::createClosedVolume(){ for (unsigned int i = 0; i< boundEdges.size(); i++){ std::vector<std::vector<GEdge *> > myEdgeLoops; std::vector<GEdge *> myEdges; - GEdge * gec = current->getEdgeByTag(NE+boundEdges[i]->tag()); + GEdge * gec; + if(is_cut) gec = current->getEdgeByTag(NE+boundEdges[i]->tag()); + else gec = current->getEdgeByTag(boundEdges[i]->tag()); myEdges.push_back(gec); myEdgeLoops.push_back(myEdges); GFace *newFace = current->addPlanarFace(myEdgeLoops); @@ -851,33 +857,18 @@ void Centerline::extrudeBoundaryLayerWall(){ if (dir ==1 && hLayer > 0 ) hLayer *= -1.0; for (int i= 0; i< NF; i++){ - GFace *gf = current->getFaceByTag(NF+i+1);//at this moment compound is not meshed yet exist yet + GFace *gfc ; + if (is_cut) gfc = current->getFaceByTag(NF+i+1);//at this moment compound is not meshed yet exist yet + else gfc = current->getFaceByTag(i+1); current->setFactory("Gmsh"); - current->extrudeBoundaryLayer(gf, nbElemLayer, hLayer, dir, -5); + current->extrudeBoundaryLayer(gfc, nbElemLayer, hLayer, dir, -5); //view -5 to scale hLayer by radius in BoundaryLayers.cpp } } -void Centerline::closeVolume(){ - - is_closed = true; - //printf("calling closed volume \n"); - //exit(1); - -} - -void Centerline::extrudeWall(){ - is_extruded = true; - //printf("calling extrude wall \n"); - //exit(1); - -} - -void Centerline::cutMesh(){ - - is_cut = true; +void Centerline::run(){ if (update_needed){ std::ifstream input; @@ -888,6 +879,24 @@ void Centerline::cutMesh(){ update_needed = false; } + if (is_cut) cutMesh(); + else{ + current->createTopologyFromMesh(); + NV = current->getMaxElementaryNumber(0); + NE = current->getMaxElementaryNumber(1); + NF = current->getMaxElementaryNumber(2); + NR = current->getMaxElementaryNumber(3); + } + + if (is_closed) createClosedVolume(); + if (is_extruded) extrudeBoundaryLayerWall(); + +} + +void Centerline::cutMesh(){ + + is_cut = 1; + // std::vector<GFace*> currentFaces = current->bindingsGetFaces(); // for (int i=0; i< currentFaces.size(); i++){ // printf("gf =%d \n", currentFaces[i]->tag()); @@ -967,10 +976,6 @@ void Centerline::cutMesh(){ //create compounds createSplitCompounds(); - if (is_closed) createClosedVolume(); - - //extrude wall - if(is_extruded) extrudeBoundaryLayerWall(); Msg::Info("Splitting mesh by centerlines done "); diff --git a/Mesh/CenterlineField.h b/Mesh/CenterlineField.h index e39806bbaa..7fd5ff5ee2 100644 --- a/Mesh/CenterlineField.h +++ b/Mesh/CenterlineField.h @@ -63,9 +63,7 @@ class Centerline : public Field{ int nbPoints; double recombine; int NF, NV, NE, NR; - bool is_cut; - bool is_closed; - bool is_extruded; + int is_cut, is_closed, is_extruded; double hLayer; int nbElemLayer; @@ -140,14 +138,14 @@ class Centerline : public Field{ //Computes for each MLine the minRadius void distanceToSurface(); + //actions + void run(); + // Cut the mesh in different parts of small aspect ratio void cutMesh(); - //Create In and Outlet Planar Faces - void closeVolume(); - - //Create extruded wall - void extrudeWall(); + void createClosedVolume(); + //extrude outer wall void extrudeBoundaryLayerWall(); // Cut the tubular structure with a disk @@ -156,7 +154,6 @@ class Centerline : public Field{ //create discrete faces void createFaces(); - void createClosedVolume(); void createSplitCompounds(); //Print for debugging -- GitLab