]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkMeshDeformation.cxx
#3493 MeshManager
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkMeshDeformation.cxx
index b5b429492f2e29219dc5d60c6ed88299071c978c..47bf806d454819ddf306ee3a5264ffe72a0d9fcb 100644 (file)
@@ -27,14 +27,25 @@ void MeshDeformation::Process()
 //      (the one provided in the attribute 'type' of the tag 'input')
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
-  
-    double s = bbGetInputS();
-    bool ok=true;
-    if (bbGetInputDirection().size()==3)
+
+    std::vector<double> lstCenter = bbGetInputCenter();
+
+    double  s   = bbGetInputS();
+    bool    ok  = false;
+    if (bbGetInputTypeIn()==0) // direction
     {
-        ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) );
-    }
-    if ( (bbGetInputIn()!=NULL) && (ok==true))
+        if (bbGetInputDirection().size()==3)
+        {
+            ok = !( (bbGetInputDirection()[0]==0) && (bbGetInputDirection()[1]==0) && (bbGetInputDirection()[2]==0) );
+        }
+    } // if TypeIn 0
+    
+    if (bbGetInputTypeIn()==1)  // center
+    {
+        ok = ( lstCenter.size()==3 );
+    } // if TypeIn 1
+
+    if ( (bbGetInputIn()!=NULL) && (ok==true) && (bbGetInputEdgeId()>=0) && (bbGetInputActive()==true) )
     {
         vtkPoints* points=bbGetInputIn()->GetPoints();
         long    i,size=points->GetNumberOfPoints();
@@ -46,16 +57,39 @@ void MeshDeformation::Process()
         sy = sx;
         sz = sy;
 
+        double displcement_x = 0;
+        double displcement_y = 0;
+        double displcement_z = 0;
+        
+        if (bbGetInputTypeIn()==0) // Direction
+        {
+            displcement_x = bbGetInputDirection()[0];
+            displcement_y = bbGetInputDirection()[1];
+            displcement_z = bbGetInputDirection()[2];
+        } // if TypeIn 0 Direction
+        if (bbGetInputTypeIn()==1) // Center
+        {
+            if (EdgeIdBack==bbGetInputEdgeId() )
+            {
+                displcement_x = (lstCenter[0]-backLstCenter[0])/1.0;
+                displcement_y = (lstCenter[1]-backLstCenter[1])/1.0;
+                displcement_z = (lstCenter[2]-backLstCenter[2])/1.0;
+            } // if EdgeIdBack!=bbGetInputEdgeId()
+            backLstCenter[0] = lstCenter[0];
+            backLstCenter[1] = lstCenter[1];
+            backLstCenter[2] = lstCenter[2];
+        } // if TypeIn 1 Center
         points->GetPoint( bbGetInputEdgeId() , pb );
-
         if (EdgeIdBack!=bbGetInputEdgeId() )
         {
-            voiIdPoints.clear();
             EdgeIdBack = bbGetInputEdgeId();
+            displcement_x = 0;
+            displcement_y = 0;
+            displcement_z = 0;
+            voiIdPoints.clear();
             for ( i=0 ; i<size ; i++)
             {
                 points->GetPoint(i,p);
-
                 if ( (p[0]>(pb[0]-sx)) && (p[0]<(pb[0]+sx)) &&
                      (p[1]>(pb[1]-sy)) && (p[1]<(pb[1]+sy)) &&
                      (p[2]>(pb[2]-sz)) && (p[2]<(pb[2]+sz)) )
@@ -64,39 +98,34 @@ void MeshDeformation::Process()
                 } // if
             } // for i
         } // back
-        double displcement_x = 0;
-        double displcement_y = 0;
-        double displcement_z = 0;
-        if (bbGetInputDirection().size()==3)
-        {
-            displcement_x = bbGetInputDirection()[0];
-            displcement_y = bbGetInputDirection()[1];
-            displcement_z = bbGetInputDirection()[2];
-        }
-        size=voiIdPoints.size();
-        for (i=0;i<size;i++)
-        {
-            points->GetPoint( voiIdPoints[i] , p );
-            double x = p[0] - pb[0]; //distance between a point and seed point
-            double y = p[1] - pb[1];
-            double z = p[2] - pb[2];
-            double distance = std::sqrt(std::pow(x, 2) + std::pow(y, 2) + std::pow(z, 2));
 
-//        https://en.wikipedia.org/wiki/Generalized_normal_distribution
-// with Gama function
-            
-            double weight = exp(-distance * 1. / s);
-            if (weight > 0.0001)
+        if ( !((displcement_x==0) &&(displcement_y==0) && (displcement_z==0)) )
+        {
+            size=voiIdPoints.size();
+            for (i=0;i<size;i++)
             {
-                np[0] = p[0] + weight*displcement_x;
-                np[1] = p[1] + weight*displcement_y;
-                np[2] = p[2] + weight*displcement_z;
-                points->SetPoint( voiIdPoints[i] , np );
-            } // if
-        } // for
-        points->Modified();
-        bbGetInputIn()->Modified();
-    } // In != NULL
+                points->GetPoint( voiIdPoints[i] , p );
+                double x = p[0] - pb[0]; //distance between a point and seed point
+                double y = p[1] - pb[1];
+                double z = p[2] - pb[2];
+                double distance = std::sqrt(std::pow(x, 2) + std::pow(y, 2) + std::pow(z, 2));
+
+    //        https://en.wikipedia.org/wiki/Generalized_normal_distribution
+    // with Gama function
+                
+                double weight = exp(-distance * 1. / s);
+                if (weight > 0.0001)
+                {
+                    np[0] = p[0] + weight*displcement_x;
+                    np[1] = p[1] + weight*displcement_y;
+                    np[2] = p[2] + weight*displcement_z;
+                    points->SetPoint( voiIdPoints[i] , np );
+                } // if
+            } // for
+            points->Modified();
+            bbGetInputIn()->Modified();
+        } // if distance_x y z  != 0
+    } // In != NULL    ok    active
 }
 //===== 
 // 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)
@@ -106,7 +135,9 @@ void MeshDeformation::bbUserSetDefaultValues()
 
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
-   bbSetInputIn(NULL);
+    bbSetInputActive(true);
+    bbSetInputTypeIn(0);
+    bbSetInputIn(NULL);
     std::vector<double> direction;
     direction.push_back(1);
     direction.push_back(0);
@@ -115,6 +146,10 @@ void MeshDeformation::bbUserSetDefaultValues()
     EdgeIdBack=-1;
     bbSetInputEdgeId(EdgeIdBack);
     bbSetInputS(10);
+    
+    backLstCenter.push_back(0);
+    backLstCenter.push_back(0);
+    backLstCenter.push_back(0);
 }
 //===== 
 // 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)