]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx
#3507 Undo and Redo Meshes
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkCreateMeshFromPoints.cxx
index b804dff795705d81e803d1bcdd80e364db1799e4..abee3e687157ae877e78500b7fd828b79558fd1b 100644 (file)
@@ -61,41 +61,54 @@ void CreateMeshFromPoints::Process()
                        pointsCentroid[1] /= sizeLstX;
                        pointsCentroid[2] /= sizeLstX;
                        
-                       if(bbGetInputCloseSurface())
-                       {
-                               //Correct surface normals if needed
-                               double pointSurf1[3], pointSurf2[3], pointSurf3[3];
-                               double vect1[3], vect2[3];
-                               double surfNormal[3], vectorCenter[3];
-                               double dotNormalSurf = 0;
-                               
-                               for(int pIndex = 0; pIndex < lstIndexs[0]-1; pIndex++){
-                                       pointSurf1[0] = lstX[pIndex];
-                                       pointSurf1[1] = lstY[pIndex];
-                                       pointSurf1[2] = lstZ[pIndex];
-                                       vtkMath::Subtract(pointsCentroid, pointSurf1, vectorCenter);
-                                       
-                                       pointSurf2[0] = lstX[pIndex+lstIndexs[1]];
-                                       pointSurf2[1] = lstY[pIndex+lstIndexs[1]];
-                                       pointSurf2[2] = lstZ[pIndex+lstIndexs[1]];
-                                       pointSurf3[0] = lstX[pIndex+1];
-                                       pointSurf3[1] = lstY[pIndex+1];
-                                       pointSurf3[2] = lstZ[pIndex+1];
-                                       vtkMath::Subtract(pointSurf2, pointSurf1, vect1);
-                                       vtkMath::Subtract(pointSurf3, pointSurf1, vect2);
-                                       vtkMath::Cross(vect1, vect2, surfNormal);
-                                       dotNormalSurf += vtkMath::Dot(surfNormal, vectorCenter);
-                               }
-                               if(dotNormalSurf > 0){
-                                       points->Delete();
-                                       points = vtkPoints::New();
-                                       for(int splineI = 0; splineI < lstIndexs.size(); splineI++){                            
-                                               for (i=lstIndexs[splineI]-1; i >= 0;i--)
-                                               {
-                                                       points->InsertNextPoint(lstX[splineI*lstIndexs[0]+i],lstY[splineI*lstIndexs[0]+i],lstZ[splineI*lstIndexs[0]+i]);
-                                               }
-                                       }
+                       if ((bbGetInputCloseSurface()==true)  && (lstIndexs.size()>=2) )
+            {  
+               //check if initial and end points are the same in all splines (splines are in line shape and not U shape)
+               //to not apply changes because clean polydata will take care of it.
+                               int count = 0;
+                               bool differentPoints = false;
+                               for(i=0; i < lstIndexs.size() && !differentPoints;i++){
+                                       bool sameStart = lstX[count] != lstX[count+lstIndexs[i]-1] && lstY[count] != lstY[count+lstIndexs[i]-1] && lstZ[count] != lstZ[count+lstIndexs[i]-1];
+                                       bool sameEnd = lstX[count] != lstX[count+lstIndexs[i]-1] && lstY[count] != lstY[count+lstIndexs[i]-1] && lstZ[count] != lstZ[count+lstIndexs[i]-1];
+                                       if(!(sameStart && sameEnd)) differentPoints = true;
+                                       count += lstIndexs[i];
                                }
+                //Correct surface normals if needed
+                if(differentPoints)
+                       {
+                           double pointSurf1[3], pointSurf2[3], pointSurf3[3];
+                           double vect1[3], vect2[3];
+                           double surfNormal[3], vectorCenter[3];
+                           double dotNormalSurf = 0;
+                           for(int pIndex = 0; pIndex < lstIndexs[0]-1; pIndex++)
+                           {
+                                   pointSurf1[0] = lstX[pIndex];
+                                   pointSurf1[1] = lstY[pIndex];
+                                   pointSurf1[2] = lstZ[pIndex];
+                                   vtkMath::Subtract(pointsCentroid, pointSurf1, vectorCenter);
+                                   pointSurf2[0] = lstX[pIndex+lstIndexs[1]];
+                                   pointSurf2[1] = lstY[pIndex+lstIndexs[1]];
+                                   pointSurf2[2] = lstZ[pIndex+lstIndexs[1]];
+                                   pointSurf3[0] = lstX[pIndex+1];
+                                   pointSurf3[1] = lstY[pIndex+1];
+                                   pointSurf3[2] = lstZ[pIndex+1];
+                                   vtkMath::Subtract(pointSurf2, pointSurf1, vect1);
+                                   vtkMath::Subtract(pointSurf3, pointSurf1, vect2);
+                                   vtkMath::Cross(vect1, vect2, surfNormal);
+                                   dotNormalSurf += vtkMath::Dot(surfNormal, vectorCenter);
+                           } // for pIndex
+
+                                       if(dotNormalSurf > 0){
+                                               points->Delete();
+                                               points = vtkPoints::New();
+                                               for(int splineI = 0; splineI < lstIndexs.size(); splineI++){
+                                                       for (i=lstIndexs[splineI]-1; i >= 0;i--)
+                                                       {
+                                                               points->InsertNextPoint(lstX[splineI*lstIndexs[0]+i],lstY[splineI*lstIndexs[0]+i],lstZ[splineI*lstIndexs[0]+i]);
+                                                       } // for i
+                                               } // for splineI
+                                       } // if dotNormalSurf
+                               }// if differentPoints
                        }
                        //