]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx
#3501 new box GlyphPolyDataNormals (Pablo)
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkCreateMeshFromPoints.cxx
index 671b2645d49df41b4253a31fa6315bfd42168602..2c17fb7be02d511263fc4fd5f4531dd4d0bc56a7 100644 (file)
@@ -5,6 +5,7 @@
 #include "bbcreaVtkPackage.h"
 
 #include "vtkTriangleStrip.h"
+#include <vtkMath.h>
 
 namespace bbcreaVtk
 {
@@ -38,7 +39,7 @@ void CreateMeshFromPoints::Process()
                std::vector<int> lstIndexs              = bbGetInputLstIndexs();
                if ( (lstIndexs.size()<=1) || (lstX.size()==0) || (lstX.size()!=lstY.size()) || (lstY.size()!=lstZ.size()) )
                {
-                       printf("Warnning! CreateMeshFromPoints::Process: List of points X Y Z  and LstIndexes is not correct\n");
+                       printf("PG CreateMeshFromPoints::Process: List of points X Y Z  and LstIndexes is not correct\n");
                        bbSetOutputOut(NULL);
                } else  {
                        int ii,sizeSegment1,sizeSegment2;
@@ -82,7 +83,17 @@ void CreateMeshFromPoints::Process()
                                } // for ii 
                                iGeneral=iGeneral+sizeSegment1;
                                cells->InsertNextCell(triangleStrip);
-                       } //for  LstIndexs         
+                       } //for  LstIndexs
+                       
+                       //false = Open
+                       //true = Close
+                       if(bbGetInputOpenClose()){                      
+                               CloseContourSides(lstIndexs, true);
+                       }
+                       else{
+                               CloseOpenContourSurface(lstIndexs);
+                       }
+                       
 //                     vtkPolyData *polydata = vtkPolyData::New();
                        if (polydata!=NULL) polydata->Delete();
                        polydata = vtkPolyData::New();
@@ -100,6 +111,118 @@ void CreateMeshFromPoints::Process()
                        triangle->Update();
                        bbSetOutputOut( clean->GetOutput() );
                }// if listXYZ size
+               printf("CreateMeshFromPoints::Process: End\n");
+}
+
+void CreateMeshFromPoints::CloseContourSides(std::vector<int> lstIndexs, bool uPointOrder){
+       int     sizeLstIdexes = lstIndexs.size();
+       int sizePoints = bbGetInputLstX().size();
+
+       int firstIndex, end, centroidId, numPointsFace;
+       int increment = uPointOrder?1:sizeLstIdexes;
+       double centroid[3], currentPoint[3] = {};
+       
+       for(int facesIdx = 0; facesIdx < 2; facesIdx++){
+               std::fill(std::begin(centroid), std::end(centroid), 0);
+               if(facesIdx == 0){
+                       firstIndex = 0;
+                       numPointsFace = uPointOrder?lstIndexs[0]: sizeLstIdexes;
+                       end = uPointOrder?firstIndex + numPointsFace:sizePoints - lstIndexs[sizeLstIdexes - 1] + 1;
+               }
+               else{
+                       firstIndex = uPointOrder?sizePoints - lstIndexs[sizeLstIdexes-1]:lstIndexs[0] - 1;
+                       numPointsFace = uPointOrder?lstIndexs[sizeLstIdexes-1]:sizeLstIdexes;
+                       end = uPointOrder?firstIndex + numPointsFace:sizePoints;
+               }
+               if(numPointsFace > 1){
+                       double lastPoint[3] = {};
+                       CalcCentroid(centroid, firstIndex, end, increment, numPointsFace);
+                       centroidId = points->InsertNextPoint(centroid[0], centroid[1], centroid[2]);
+                       vtkSmartPointer<vtkTriangleStrip> triangleStrip1 = vtkSmartPointer<vtkTriangleStrip>::New();
+                       triangleStrip1->GetPointIds()->SetNumberOfIds(numPointsFace*2+1);
+                       if(facesIdx == 0){                              
+                               int initial = firstIndex;
+                               int triangleIndex = 0;
+                               for(int index = initial; index < end; index+=increment){
+                                       triangleStrip1->GetPointIds()->SetId(triangleIndex,index);
+                                       if(index+increment >= end){
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+1,initial);
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+2,centroidId);
+                                       }
+                                       else{
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId);
+                                       }
+                                       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);
+                                       if(index-increment <= initial){
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+1,triangleStripStart);
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+2,centroidId);
+                                       }
+                                       else{
+                                               triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId);
+                                       }
+                                       triangleIndex+=2;
+                               }
+                               cells->InsertNextCell(triangleStrip1);
+                       }
+               }
+       }
+
+}
+
+void CreateMeshFromPoints::CloseOpenContourSurface(std::vector<int> lstIndexs){
+       int     sizeLstIdexes = lstIndexs.size();
+       int sizeLstX = bbGetInputLstX().size();
+       bool linePointOrder = false;
+
+       if(linePointOrder){
+               CloseContourSides(lstIndexs, false);
+               CloseContourBottom(false);
+       }
+       else{
+               CloseContourSides(lstIndexs, true);
+               CloseContourBottom(true);
+       }
+               
+}
+
+void CreateMeshFromPoints::CalcCentroid(double(&centroid)[3], int start, int end, int increment, int numPoints){
+       double currPoint[3] = {};
+       for(int i = start; i < end; i+=increment){
+               points->GetPoint(i, currPoint);
+               centroid[0] += currPoint[0];
+               centroid[1] += currPoint[1];
+               centroid[2] += currPoint[2];
+       }
+       centroid[0] /= numPoints;
+       centroid[1] /= numPoints;
+       centroid[2] /= numPoints;
+}
+
+void CreateMeshFromPoints::CloseContourBottom(bool uPointOrder){
+       std::vector<int> lstIndexs = bbGetInputLstIndexs();
+       int sizeLstIdexes = lstIndexs.size();
+       int sizeLstX = bbGetInputLstX().size();
+       
+       vtkSmartPointer<vtkTriangleStrip> triangleStripBottom = vtkSmartPointer<vtkTriangleStrip>::New();
+       triangleStripBottom->GetPointIds()->SetNumberOfIds(sizeLstIdexes*2);
+       int triangleIndex = 0, currentId = 0, nextId = 0;
+       for(int splineIndex = 0; splineIndex < sizeLstIdexes;splineIndex++){
+               triangleStripBottom->GetPointIds()->SetId(triangleIndex, currentId);
+               nextId = uPointOrder?currentId + lstIndexs[splineIndex] - 1:sizeLstX - sizeLstIdexes + splineIndex;
+               triangleStripBottom->GetPointIds()->SetId(triangleIndex+1, nextId);
+               triangleIndex+=2;
+               currentId = uPointOrder?nextId + 1: splineIndex+1;
+       }
+       cells->InsertNextCell(triangleStripBottom);
 }
 
 //===== 
@@ -111,6 +234,7 @@ void CreateMeshFromPoints::bbUserSetDefaultValues()
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
 //   bbSetInputIn(0);
+       bbSetInputOpenClose(false);
        points          = NULL;
        cells           = NULL;
        polydata        = NULL;