From 44e81956772de9b82c9c670ce043a557f9307c3d Mon Sep 17 00:00:00 2001 From: Pablo Garzon Date: Tue, 18 Apr 2023 13:42:22 +0200 Subject: [PATCH] #3502 Bug close surface in CreateMeshFromPoints --- .../src/bbcreaVtkCreateMeshFromPoints.cxx | 69 ++++++++++--------- .../src/bbcreaVtkCreateMeshFromPoints.h | 3 +- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx index c794d40..79b9991 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx @@ -5,6 +5,7 @@ #include "bbcreaVtkPackage.h" #include "vtkTriangleStrip.h" +#include "vtkTriangle.h" #include namespace bbcreaVtk @@ -86,28 +87,27 @@ void CreateMeshFromPoints::Process() } //for LstIndexs if(bbGetInputCloseSurface()) - { + { int lastId1 = lstIndexs[0]-1; int lastId2 = sizeLstX - 1; int firstId2 = sizeLstX - lstIndexs[sizeLstIdexes - 1]; - bool face1open = lstX[0] != lstX[lastId1] && lstY[0] != lstY[lastId1] && lstZ[0] != lstZ[lastId1]; - bool face2open = lstX[firstId2] != lstX[lastId2] && lstY[firstId2] != lstY[lastId2] && lstZ[firstId2] != lstZ[lastId2]; - - bool altFace1open = lstX[0] != lstX[firstId2] && lstY[0] != lstY[firstId2] && lstZ[0] != lstZ[firstId2]; - bool altFace2open = lstX[lastId1] != lstX[lastId2] && lstY[lastId1] != lstY[lastId2] && lstZ[lastId1] != lstZ[lastId2]; + bool face1open = std::fabs(lstX[0] - lstX[lastId1]) > 0.0001 && std::fabs(lstY[0] - lstY[lastId1]) > 0.0001 && std::fabs(lstZ[0] - lstZ[lastId1]) > 0.0001; + bool face2open = std::fabs(lstX[firstId2] - lstX[lastId2]) > 0.0001 && std::fabs(lstY[firstId2] - lstY[lastId2]) > 0.0001 && std::fabs(lstZ[firstId2] - lstZ[lastId2]) > 0.0001; - isClosedCont = false; + bool altFace1open = std::fabs(lstX[0] - lstX[firstId2]) > 0.0001 && std::fabs(lstY[0] - lstY[firstId2]) > 0.0001 && std::fabs(lstZ[0] - lstZ[firstId2]) > 0.0001; + bool altFace2open = std::fabs(lstX[lastId1] - lstX[lastId2]) > 0.0001 && std::fabs(lstY[lastId1] - lstY[lastId2]) > 0.0001 && std::fabs(lstZ[lastId1] - lstZ[lastId2]) > 0.0001; + //false = Open Contour //true = Closed Contour if(!face1open && !face2open) { - isClosedCont = true; - CloseContourSides(lstIndexs, true); +// isClosedCont = true; + CloseContourSides(lstIndexs, true, true); } else if(!altFace1open && !altFace2open) { - isClosedCont = true; - CloseContourSides(lstIndexs, false); +// isClosedCont = true; + CloseContourSides(lstIndexs, false, true); } else{ CloseOpenContourSurface(lstIndexs); @@ -140,7 +140,7 @@ void CreateMeshFromPoints::Process() * uPointOrder: Points are order in a U shape * lstIndexs: number of points on each spline */ -void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uPointOrder){ +void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uPointOrder, bool isClosedCont){ int sizeLstIdexes = lstIndexs.size(); int sizePoints = bbGetInputLstX().size(); @@ -169,36 +169,42 @@ void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uP { bool normalOrder = isPointingCorrectly(firstIndex, firstIndex+increment, centroid, contraryId); centroidId = points->InsertNextPoint(centroid[0], centroid[1], centroid[2]); - vtkSmartPointer triangleStrip1 = vtkSmartPointer::New(); - triangleStrip1->GetPointIds()->SetNumberOfIds(numPointsFace*2 + (!isClosedCont?2:0)); if( normalOrder ) { - int initial = firstIndex; - int triangleIndex = 0; - for(int index = initial; index < end; index+=increment){ - triangleStrip1->GetPointIds()->SetId(triangleIndex,index); - triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId);//1 + int initial = firstIndex; + for(int index = initial; index < end; index+=increment){ if(index+increment >= end && !isClosedCont){ - triangleStrip1->GetPointIds()->SetId(triangleIndex+2,initial);//2 - triangleStrip1->GetPointIds()->SetId(triangleIndex+3,centroidId);//3 + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, initial); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); + }else if(index+increment < end){ + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, index+increment); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); } - triangleIndex+=2; } - cells->InsertNextCell(triangleStrip1); } else { int initial = firstIndex-1; - int triangleIndex = 0; int triangleStripStart = end-1; for(int index = triangleStripStart; index > initial; index-=increment){ - triangleStrip1->GetPointIds()->SetId(triangleIndex,index); - triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId); if(index-increment <= initial && !isClosedCont){ - triangleStrip1->GetPointIds()->SetId(triangleIndex+2,triangleStripStart); - triangleStrip1->GetPointIds()->SetId(triangleIndex+3,centroidId); + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, triangleStripStart); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); + }else if(index-increment > initial){ + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, index-increment); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); } - triangleIndex+=2; } - cells->InsertNextCell(triangleStrip1); } }//if validCentroid }//if numPointsFace @@ -269,7 +275,7 @@ bool CreateMeshFromPoints::CheckLinePointOrder(){ */ void CreateMeshFromPoints::CloseOpenContourSurface(std::vector lstIndexs){ bool linePointOrder = CheckLinePointOrder(); - CloseContourSides(lstIndexs, !linePointOrder); + CloseContourSides(lstIndexs, !linePointOrder, false); CloseContourBottom(!linePointOrder); } @@ -352,7 +358,6 @@ void CreateMeshFromPoints::bbUserSetDefaultValues() // Here we initialize the input 'In' to 0 // bbSetInputIn(0); bbSetInputCloseSurface(false); - isClosedCont = NULL; points = NULL; cells = NULL; polydata = NULL; diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.h b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.h index 2dd7615..f92f342 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.h +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.h @@ -40,13 +40,12 @@ class bbcreaVtk_EXPORT CreateMeshFromPoints vtkPolyData *polydata; vtkCleanPolyData *clean; vtkTriangleFilter *triangle; - bool isClosedCont; bool CalcValidCentroid(double(¢roid)[3], int start, int end, int increment, int numPoints); bool CheckLinePointOrder(); bool isPointingCorrectly( int firstPointId, int secPointId, double(¢roid)[3], int contrPointId); void CloseContourBottom(bool uPointOrder); - void CloseContourSides(std::vector lstIndexs, bool uPointOrder); + void CloseContourSides(std::vector lstIndexs, bool uPointOrder, bool isClosedCont); void CloseOpenContourSurface(std::vector lstIndexs); //===== -- 2.45.1