[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