]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkBooleanOperationPolyDataFilter.cxx
#3518 BooleanOperationPolyDataFilter Replace option
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkBooleanOperationPolyDataFilter.cxx
index 6cb69d57990c780c5a9780163efb5624f72ba075..f806b26e59f5a0c50572a6d994db7bd281718d65 100644 (file)
@@ -6,9 +6,11 @@
 
 // #include "vtkBooleanOperationPolyDataFilter.h"
 #include "vtkPolyDataBooleanFilter.h"
+#include "vtkPoints.h"
 
 #include "vtkCleanPolyData.h"
 #include "vtkTriangleFilter.h"
+#include "vtkFillHolesFilter.h"
 
 
 namespace bbcreaVtk
@@ -36,111 +38,117 @@ void BooleanOperationPolyDataFilter::Process()
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
   
-       if ((bbGetInputIn1()!=NULL)  && (bbGetInputIn2()!=NULL) )
-       {
+    if ((bbGetInputOperation()>=0) && (bbGetInputOperation()<=2)) // 0:Union   1:Intersection   2:Difference
+    {
 
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-printf("EED Warnning BooleanOperationPolyDataFilter::Process  Put this code at the end of CreateMesh.. or create 2 new boxes\n");
-               vtkCleanPolyData *clean1 = vtkCleanPolyData::New();
-               vtkCleanPolyData *clean2 = vtkCleanPolyData::New();
-               clean1->SetInputData( bbGetInputIn1() );
-               clean2->SetInputData( bbGetInputIn2() );
-               clean1->Update();
-               clean2->Update();
-               vtkTriangleFilter *triangle1 = vtkTriangleFilter::New();
-               vtkTriangleFilter *triangle2 = vtkTriangleFilter::New();
-               triangle1->SetInputData( clean1->GetOutput() );
-               triangle2->SetInputData( clean2->GetOutput() );
-               triangle1->Update();
-               triangle2->Update();
-
-        vtkPolyDataBooleanFilter *booleanOperation = vtkPolyDataBooleanFilter::New();
-        booleanOperation->SetInputData(0, triangle1->GetOutput() );
-        booleanOperation->SetInputData(1, triangle2->GetOutput() );
-        if (bbGetInputOperation()==0 )
-        {
-            booleanOperation->SetOperModeToUnion();
-        }
-        if (bbGetInputOperation()==1 )
-        {
-            booleanOperation->SetOperModeToIntersection();
-        }
-        if (bbGetInputOperation()==2 )
+        if ((bbGetInputIn1()!=NULL)  && (bbGetInputIn2()!=NULL) )
         {
-            booleanOperation->SetOperModeToDifference();
-        }
-
+            //TRIANGLE FILTER NOT NEEDED, this can handle non triangle meshes.
+            //  vtkPolyDataBooleanFilter  is not a vtk filter   (this one yes: vtkBooleanOperationPolyDataFilter )
+            
+            //   https://github.com/zippy84/vtkbool
+            //  vtkPolyDataBooleanFilter is a local code creaVtk lib
+            vtkPolyDataBooleanFilter *booleanOperation = vtkPolyDataBooleanFilter::New();
+            booleanOperation->SetInputData(0, bbGetInputIn1() );
+            booleanOperation->SetInputData(1, bbGetInputIn2() );
+            if (bbGetInputOperation()==0 )
+            {
+                booleanOperation->SetOperModeToUnion();
+            }
+            if (bbGetInputOperation()==1 )
+            {
+                booleanOperation->SetOperModeToIntersection();
+            }
+            if (bbGetInputOperation()==2 )
+            {
+                booleanOperation->SetOperModeToDifference();
+            }
 /*
-               vtkBooleanOperationPolyDataFilter *booleanOperation = vtkBooleanOperationPolyDataFilter::New();
-               booleanOperation->SetInputData(0, triangle1->GetOutput() );
-               booleanOperation->SetInputData(1, triangle2->GetOutput() );
-               if (bbGetInputOperation()==0 )
-               {
-                       booleanOperation->SetOperationToUnion();
-               }
-               if (bbGetInputOperation()==1 )
-               {
-            booleanOperation->SetOperationToIntersection();
-               }
-               if (bbGetInputOperation()==2 )
-               {
-            booleanOperation->SetOperationToDifference();
-            booleanOperation->SetReorientDifferenceCells( bbGetInputReorientDifferenceCells() );
-        }
+            vtkBooleanOperationPolyDataFilter *booleanOperation = vtkBooleanOperationPolyDataFilter::New();
+            booleanOperation->SetInputData(0, triangle1->GetOutput() );
+            booleanOperation->SetInputData(1, triangle2->GetOutput() );
+            if (bbGetInputOperation()==0 )
+            {
+                booleanOperation->SetOperationToUnion();
+            }
+            if (bbGetInputOperation()==1 )
+            {
+                booleanOperation->SetOperationToIntersection();
+            }
+            if (bbGetInputOperation()==2 )
+            {
+                booleanOperation->SetOperationToDifference();
+                booleanOperation->SetReorientDifferenceCells( bbGetInputReorientDifferenceCells() );
+            }
  */
-        
-               booleanOperation->Update();
-               bbSetOutputOut( booleanOperation->GetOutput() );
-       } else {
-               printf("EED Warnning!  BooleanOperationPolyDataFilter::Process   vtkPolyData In1 or In2  is EMPTY\n");
-       } // if In1 In2 != NULL
+            booleanOperation->Update();
+            vtkPoints *points = booleanOperation->GetOutput()->GetPoints();
+            if (points!=NULL)
+            {
+//              vtkFillHolesFilter *fillHolesFilter = vtkFillHolesFilter::New();
+//              fillHolesFilter->SetInputData( booleanOperation->GetOutput() );
+//              fillHolesFilter->SetHoleSize(100000.0);
+//              fillHolesFilter->Update();
+//              bbSetOutputOut( fillHolesFilter->GetOutput() );
+                /*
+                 *Added boxes(triangleFilter and CleanPolyData) to handle this outside the box
+                 *
+                    vtkTriangleFilter *triangleEnd = vtkTriangleFilter::New();
+                    vtkCleanPolyData *cleanEnd = vtkCleanPolyData::New();
+                    bbSetOutputOut( cleanEnd->GetOutput() );
+                 */
+                bbSetOutputOut( booleanOperation->GetOutput() );
+            } else {
+                bbSetOutputOut( NULL );
+            } // if points!=NULL
+        } else {
+            bbSetOutputOut( NULL );
+            printf("EED Warnning!  BooleanOperationPolyDataFilter::Process   vtkPolyData In1 or In2  is EMPTY\n");
+        } // if In1 In2 != NULL
+    } else if ( bbGetInputOperation()==3) // 3:Replace
+    {
+        bbSetOutputOut( bbGetInputIn2() );
+    } else {
+        bbSetOutputOut( NULL );
+    } // if  Operation
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void BooleanOperationPolyDataFilter::bbUserSetDefaultValues()
 {
-
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
    bbSetInputIn1(NULL);
    bbSetInputIn2(NULL);
    bbSetInputOperation(0);
    bbSetInputReorientDifferenceCells(true);
-  
+   bbSetOutputOut(NULL);
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void BooleanOperationPolyDataFilter::bbUserInitializeProcessing()
 {
-
 //  THE INITIALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should allocate the internal/output pointers 
-//    if any 
-
-  
+//    if any
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void BooleanOperationPolyDataFilter::bbUserFinalizeProcessing()
 {
-
 //  THE FINALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should desallocate the internal/output pointers 
 //    if any
-  
 }
-}
-// EO namespace bbcreaVtk
+
+// EO namespace bbcreaVtk