+
+void ShowNPoints_Tools::MovePointInNormal()
+{
+ //move the currently selected control point in the direction or opposite of the normal vector of the closest point in the input mesh
+
+ WidgetShowNPoints* wsp = bbGetInputWidgetShowNPoints();
+ wsp->StopAutoAddPoints();
+ wsp->StopTrackPoint();
+ if((wsp->GetLstModelShowNPointsSize()>=2) //Check condition
+ && (wsp->GetModelShowNPoints()->GetLstPointsSize()>0)
+ && (bbGetInputParams().size() == 1)
+ && (bbGetInputMesh() != NULL)
+ && (bbGetInputSpacing().size() == 3))
+ {
+ if(bbGetInputParams()[0] != -1 && bbGetInputParams()[0] != 1){
+ printf("PG ShowNPoints_Tools::MovePointInNormal No direction provided, must be 1 or -1");
+ return;
+ }
+ double spc[3];
+ double x,y,z;
+ double p[3], normal[3];; // point to modify and normal
+ std::vector<double> pN(3); // new point
+
+ spc[0] = bbGetInputSpacing()[0];
+ spc[1] = bbGetInputSpacing()[1];
+ spc[2] = bbGetInputSpacing()[2];
+
+ vtkPoints *points = bbGetInputMesh()->GetPoints();
+ vtkStaticPointLocator *pointLocator = vtkStaticPointLocator::New();
+ pointLocator->SetDataSet( bbGetInputMesh() );
+ pointLocator->BuildLocator();
+
+ int idControlPoint = wsp->GetModelShowNPoints()->GetNearestPoint();
+ if(idControlPoint >= 0){
+ wsp->GetModelShowNPoints()->GetIdPoint(idControlPoint, &x, &y, &z);
+ p[0] = x;
+ p[1] = y;
+ p[2] = z;
+ int idMeshPoint = pointLocator->FindClosestPoint(p);
+ bbGetInputMesh()->GetPointData()->GetNormals()->GetTuple(idMeshPoint, normal);
+ int direction = bbGetInputParams()[0];
+ pN[0] = p[0] + direction*normal[0];
+ pN[1] = p[1] + direction*normal[1];
+ pN[2] = p[2] + direction*normal[2];
+
+ wsp->GetModelShowNPoints()->SetPointById(idControlPoint, pN);
+ wsp->GetViewShowNPoints()->RefreshPoint(idControlPoint);
+ wsp->SetOutputBox();
+ wsp->UndoRedo_SaveCollection();
+ }
+
+ }
+}