[vtkusers] Another Try: storing picked points

George Kamucha kamucha at hfm.e-technik.uni-kassel.de
Mon Nov 4 05:40:05 EST 2002


Hi,
I posted the following question sometimes back, got no response and am
trying once more,
hoping and hoping to get a response........

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?


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