]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkImageThresholdConnectivity.cxx
#3498 Connectivity Filter Threshold
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkImageThresholdConnectivity.cxx
index 71366434d86e5184c05c28be6b201ca48bbb589d..25b85a633fb7aafeb8f6aa8c2dc494428a2b8492 100644 (file)
@@ -3,6 +3,9 @@
 //===== 
 #include "bbcreaVtkImageThresholdConnectivity.h"
 #include "bbcreaVtkPackage.h"
+#include "vtkImageThresholdConnectivity.h"
+#include "vtkPoints.h"
+
 namespace bbcreaVtk
 {
 
@@ -13,7 +16,6 @@ BBTK_BLACK_BOX_IMPLEMENTATION(ImageThresholdConnectivity,bbtk::AtomicBlackBox);
 //===== 
 void ImageThresholdConnectivity::Process()
 {
-
 // THE MAIN PROCESSING METHOD BODY
 //   Here we simply set the input 'In' value to the output 'Out'
 //   And print out the output value
@@ -26,49 +28,174 @@ void ImageThresholdConnectivity::Process()
 //    * TYPE is the C++ type of the input/output
 //      (the one provided in the attribute 'type' of the tag 'input')
 
-  
-       printf("EED ImageThresholdConnectivity::Process  Error this box is not implemented .... \n");
-       printf("EED ImageThresholdConnectivity::Process  Error this box is not implemented .... \n");
-       printf("EED ImageThresholdConnectivity::Process  Error this box is not implemented .... \n");
-       printf("EED ImageThresholdConnectivity::Process  Error this box is not implemented .... \n");
+    std::vector<int> lstX;
+    std::vector<int> lstY;
+    std::vector<int> lstZ;
+    std::vector<int> point = bbGetInputPoint();
+
+    if (bbGetInputPoint().size()==3)
+    {
+        lstX.push_back( point[0] );
+        lstY.push_back( point[1] );
+        lstZ.push_back( point[2] );
+    } else {
+        lstX = bbGetInputLstX();
+        lstY = bbGetInputLstY();
+        lstZ = bbGetInputLstZ();
+    }
+    
+    if ( (bbGetInputIn()!=NULL) && (lstX.size()>0) && (lstX.size()==lstY.size()) && (lstX.size()==lstZ.size()) )
+    {
+        vtkImageThresholdConnectivity *filter = vtkImageThresholdConnectivity::New();
+        double spc[3];
+        bbGetInputIn()->GetSpacing(spc);
+        int border  = bbGetInputBorder();
+        int minX    = 32000;
+        int minY    = 32000;
+        int minZ    = 32000;
+        int maxX    = -32000;
+        int maxY    = -32000;
+        int maxZ    = -32000;
+        int i,size  = lstX.size();
+        double p[3];
+        vtkPoints *points = vtkPoints::New();
+        for (i=0; i<size; i++)
+        {
+            p[0] = lstX[i]*spc[0];
+            p[1] = lstY[i]*spc[1];
+            p[2] = lstZ[i]*spc[2];
+            points->InsertNextPoint(p);
+            if ( lstX[i] < minX ) { minX = lstX[i]; }
+            if ( lstY[i] < minY ) { minY = lstY[i]; }
+            if ( lstZ[i] < minZ ) { minZ = lstZ[i]; }
+            if ( lstX[i] > maxX ) { maxX = lstX[i]; }
+            if ( lstY[i] > maxY ) { maxY = lstY[i]; }
+            if ( lstZ[i] > maxZ ) { maxZ = lstZ[i]; }
+        } // for i
+        filter->SetSeedPoints( points );
+        filter->SetInputData( bbGetInputIn() );
+        if (bbGetInputThreshold().size()==2)
+        {
+            filter->ThresholdBetween( bbGetInputThreshold()[0] , bbGetInputThreshold()[1] );
+        } else {
+            filter->ThresholdBetween( 0, 100 );
+        }// if Thershold size
+        
+    //    filter->SetNeighborhoodRadius (4, 4, 4 );
+        filter->SetInValue(255);
+        filter->SetOutValue(0);
+    //    filter->ReplaceInOn();
+    //    filter->ReplaceOutOn();
+        filter->SetSliceRangeX(minX-border,maxX+border);
+        filter->SetSliceRangeY(minY-border,maxY+border);
+        filter->SetSliceRangeZ(minZ-border,maxZ+border);
+        filter->Update();
+        bbSetOutputOut( filter->GetOutput() );
+    } else {
+        bbSetOutputOut( NULL );
+    }// if lst
 }
 //===== 
 // 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 ImageThresholdConnectivity::bbUserSetDefaultValues()
 {
-
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
-   bbSetInputIn(NULL);
-  
+    bbSetInputIn(NULL);
+    bbSetInputBorder(10);
+    std::vector<double> maskValue;
+    maskValue.push_back(0);
+    maskValue.push_back(255);
+    bbSetInputMaskValue(maskValue);
+
 }
+
 //===== 
 // 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 ImageThresholdConnectivity::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 ImageThresholdConnectivity::bbUserFinalizeProcessing()
 {
-
 //  THE FINALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should desallocate the internal/output pointers 
 //    if any
-  
 }
+
+
+//=========================================================================
+void ImageThresholdConnectivity::bbSetStatusAndPropagate(BlackBoxInputConnector* c, IOStatus s)
+{
+  bbtkBlackBoxDebugMessage("change",5,
+               "=> BlackBox::bbSetStatusAndPropagate(input,"
+               <<GetIOStatusString(s)<<")"
+               <<std::endl);
+
+  if (s==UPTODATE) bbtkError("bbSetStatusAndPropagate with status UPTODATE!");
+  c->SetStatus(s);
+
+  // Flash reaction
+  /*
+  if (bbGetBoxProcessModeValue() == Flash)
+    {
+  this->bbExecute();
+    }
+  */
+
+
+  OutputConnectorMapType::const_iterator o;
+  for ( o = bbGetOutputConnectorMap().begin();
+    o != bbGetOutputConnectorMap().end(); ++o )
+    {
+
+
+  if (o->first=="BoxChange")
+  {
+      o->second->SetStatus(UPTODATE);
+  }
+
+
+
+//EED 24/08/2015
+// EED CASPITAS 2
+  if (o->second->GetStatus()==UPTODATE)
+//    if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==OUTOFDATE))
+//    if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==MODIFIED))
+    {
+      o->second->SetStatus(OUTOFDATE);
+      o->second->SignalChange(GetThisPointer<BlackBox>(),o->first);
+    } // if
+  } // for
+  
+
+  if (  ( bbBoxProcessModeIsReactive()
+     || (c==bbGetInputConnectorMap().find("BoxExecute")->second))
+     && (bbCanReact() ) )
+    {
+  bbtkBlackBoxDebugMessage("change",2,
+           "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
+      bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
+    } // if
+  bbtkBlackBoxDebugMessage("change",5,
+               "<= BlackBox::bbSetStatusAndPropagate(input)"
+               <<std::endl);
 }
-// EO namespace bbcreaVtk
+//=========================================================================
+
+
+
+
+}// EO namespace bbcreaVtk