[vtkusers] Problem with storing picked points - Full snippet

George Kamucha kamucha at hfm.e-technik.uni-kassel.de
Fri Nov 1 09:34:38 EST 2002


I sent this mail earlier, but I am sorry that the attached snippet was not complete. Below is the full version of the snippet:

Hi all,
I am trying to use vtkSelectPolyData  to select a part of  my surface data using a loop. To define the loop, I am selecting points on a surface using vtkPointPicker, and then
placing small spheres in the selected locations. The locations of the picked points are stored in vtkPoints and used in defining the loop. But it is simply not working! When I
check the points stored in the vtkPoints, I find that only the last picked point is valid, the others don't make any sense at all. Below is the snippet (to stop picking, I pick
three times outside the surface data).  Anybody with an idea on this? Please assist before I go bananas.

Best regards
George.

#include "vtkPolyDataReader.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkActor.h"
#include "vtkPointPicker.h"
#include "vtkSphereSource.h"
#include "vtkGlyph3D.h"
#include "vtkSelectPolyData.h"
#include "vtkClipPolyData.h"
#include  <stdio.h>
#include  <ctype.h>
#include  <iostream.h>


static void pickControl(void *);
static vtkRenderer *ren1;
static vtkRenderWindow *renWin;
static vtkPoints *points;
static int n, p;
vtkPolyDataReader *reader;

void main( int argc, char *argv[] )

{

n=0;
p=0;

//Load the original Laser surface data LaserNewd.vtk
reader = vtkPolyDataReader::New();
      reader->SetFileName ("../../../vtkdata/LaserNewd.vtk");
      reader->Update();

vtkPolyDataMapper *dataMapper = vtkPolyDataMapper::New();
      dataMapper->SetInput(reader->GetOutput());
      dataMapper->ScalarVisibilityOff();

vtkActor *dataActor = vtkActor::New();
       dataActor->SetMapper(dataMapper);
       dataActor->GetProperty()->SetColor(1, 1, 0);
       dataActor->GetProperty()->SetOpacity(0.5);

vtkPointPicker *pointpicker = vtkPointPicker::New();


ren1 = vtkRenderer::New();
renWin = vtkRenderWindow::New();
    renWin->AddRenderer(ren1);
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);
    iren->SetPicker(pointpicker);
    iren->SetEndPickMethod(pickControl, (void *)iren);

ren1->AddActor(dataActor);

// render the image
    ren1->SetBackground(1, 1, 1);
    renWin->SetSize(500,500);
    iren->Initialize();
    renWin->Render();
    iren->Start();

//Clean up

ren1->Delete();
renWin->Delete();
iren->Delete();
//reader->Delete();
dataMapper->Delete();
dataActor->Delete();
pointpicker->Delete();

 }



// Define picking method
static void pickControl(void *arg)
{
float *selPt;
float *pickpos;
float *pc;
int i;




vtkRenderWindowInteractor *iren = (vtkRenderWindowInteractor *)arg;
  vtkPointPicker *pointpicker = (vtkPointPicker *)iren->GetPicker();



  selPt = pointpicker->GetSelectionPoint();

    cout<<"Screen location:"<<selPt[0]<<" "<<selPt[1]<<"\n";



 if ( pointpicker->GetPointId() >= 0 )
    {
    p = p+1; //count number of points picked
    pickpos = pointpicker->GetPickPosition();

    cout<<"Point location:"<<pickpos[0]<<" "<<pickpos[1]<<" "<<pickpos[2]<<"\n";




//Define method for placing spheres
points=vtkPoints::New();
        points-> InsertNextPoint(pickpos);
        points-> Modified();

vtkPolyData *profile=vtkPolyData::New();
   profile->SetPoints(points);

vtkSphereSource *sphere=vtkSphereSource::New();
  sphere->SetRadius(2);

vtkGlyph3D *glyph=vtkGlyph3D::New();
    glyph->SetInput(profile);
    glyph->SetSource(sphere->GetOutput());

vtkPolyDataMapper *glyphMapper=vtkPolyDataMapper::New();
     glyphMapper->SetInput(glyph->GetOutput());


vtkActor *glyphActor=vtkActor::New();
  glyphActor->SetMapper(glyphMapper);
  glyphActor->GetProperty()->SetColor(1, 0, 0); //Set colour to red

ren1-> AddActor(glyphActor);

renWin->Render();


//points-> Delete();
profile->  Delete();
sphere->  Delete();
glyph->  Delete();
glyphMapper->  Delete();
glyphActor->  Delete();


   }
   else   if ( pointpicker->GetPointId() < 0 )
   {


         cout<<"No point picked here!"<<"\n";
         n=n+1;
         cout<<"n" <<n<<"\n";

       if (n >=3)
        {
         cout<<"Selection completed!"<<"\n";


// check the picked points, stored in vtkPoints
     for (i=0; i<p; i++)

       {
        pc = points->GetPoint(i);

        cout<<"point:"<<pc[0]<<" "<<pc[1]<<" "<<pc[2]<<"\n";//See components points
        }



vtkSelectPolyData *loop = vtkSelectPolyData::New();
    loop->SetInput(reader->GetOutput());
    loop->SetLoop(points);
    loop->GenerateSelectionScalarsOn();
    loop->SetSelectionModeToSmallestRegion(); //negative scalars inside
vtkClipPolyData *clip = vtkClipPolyData::New(); //clips out positive region
    clip->SetInput(loop->GetOutput());
vtkPolyDataMapper *clipMapper = vtkPolyDataMapper::New();
    clipMapper->SetInput(clip->GetOutput());
vtkActor *clipActor = vtkActor::New();
    clipActor->SetMapper(clipMapper);
    clipActor->AddPosition(1, 0, 0);
    clipActor->GetProperty()->SetColor(0, 0, 1); //Set colour blue

ren1->AddActor(clipActor);
renWin->Render();


reader->Delete();
points-> Delete();
loop->Delete();
clip->Delete();
clipMapper->Delete();
clipActor->Delete();

        }

  }

}





More information about the vtkusers mailing list