[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