<html>
<body>
Dear vtkusers,<br><br>
I have a problem with point picking in an unstructured grid and
indicating the picked points in the renderwindow. If I apply the (nearly
identical) code to polydata the picking and showing works fine. The codes
were applied to a cube defined as polydata and as unstructrured
grid.<br><br>
Could it be that ugrid->Modify() does not work correctly? I use
vtkLatestRelease(4.2). <br><br>
If you have an answer to the problem, please let me know. <br>
Both codes:<br><br>
//For POLYDATA (wordks
fine)-------------------------------------------------------------------------------------------------------------------<br><br>
<font face="Courier New, Courier">//--- VTK HEADERS ---//<br>
#include "vtkActor.h"<br>
#include "vtkRenderer.h"<br>
#include "vtkRenderWindow.h"<br>
#include "vtkRenderWindowInterActor.h"<br>
//-------------<br>
#include "vtkCommand.h"<br>
#include "vtkIntArray.h"<br>
#include "vtkPointData.h"<br>
#include "vtkPointPicker.h"<br>
#include "vtkPolyData.h"<br>
#include "vtkPolyDataReader.h"<br>
#include "vtkPolyDataMapper.h"<br>
#include "vtkProperty.h"<br>
//-------------<br><br>
<br>
//--- GLOBALS ---//<br>
static vtkPolyData *polydata;<br>
static vtkPointPicker *picker = vtkPointPicker::New();<br>
static vtkIntArray *intarray = vtkIntArray::New();<br><br>
//--- PICKCOMMAND ---//<br>
class VcPick : public vtkCommand<br>
{<br>
public:<br>
<x-tab> </x-tab>static
VcPick *New() <br>
<x-tab> </x-tab><x-tab> </x-tab>{
<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>return
new VcPick; <br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab>void
Delete()<br>
<x-tab> </x-tab><x-tab> </x-tab>{
<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>delete
this; <br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab>virtual
void Execute(vtkObject *caller, unsigned long, void*)<br>
<x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>int
pid = picker->GetPointId() ;<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>if
( pid >= 0 ) <br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>cout
<< pid ;<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray
= (vtkIntArray *)polydata->GetPointData()->GetScalars();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>if
(intarray->GetValue(pid) == 0)<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray->SetValue(pid,1);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>polydata->GetPointData()->SetScalars(intarray);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>polydata->Modified();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>else<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray->SetValue(pid,0);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>polydata->GetPointData()->SetScalars(intarray);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>polydata->Modified();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
};<br><br>
void main()<br>
{<br>
//--- SOURCES ---//<br>
<x-tab> </x-tab>vtkPolyDataReader
*datareader = vtkPolyDataReader::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>datareader->SetFileName("Polydata.vtk");<br>
<x-tab> </x-tab>polydata =
datareader->GetOutput();<br><br>
//--- MAPPERS ---//<br>
<x-tab> </x-tab>vtkPolyDataMapper
*datamapper = vtkPolyDataMapper::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>datamapper->SetInput(polydata);<br><br>
<x-tab> </x-tab>vtkPolyDataMapper
*geomapper = vtkPolyDataMapper::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>geomapper->SetInput(polydata);<br><br>
//--- ACTORS ---//<br>
<x-tab> </x-tab>vtkActor
*dataactor = vtkActor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->SetMapper(datamapper);<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->GetProperty()->SetPointSize(10);<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->GetProperty()->SetRepresentationToPoints();<br><br>
<x-tab> </x-tab>vtkActor
*geoactor = vtkActor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->SetMapper(geomapper);<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->GetProperty()->SetColor(0,0,0);<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->GetProperty()->SetRepresentationToWireframe();<br><br>
//--- PICKING ---//<br>
<x-tab> </x-tab>VcPick
*vcpick = VcPick::New();<x-tab> </x-tab><br>
<x-tab> </x-tab><x-tab> </x-tab>picker->AddObserver(vtkCommand::EndPickEvent,
vcpick);<br><br>
//--- RENDERING ---//<br>
<x-tab> </x-tab>vtkRenderer
*ren1 = vtkRenderer::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->AddActor(geoactor);<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->AddActor(dataactor);<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->SetBackground(1,1,1);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><br>
vtkRenderWindow *renwin =
vtkRenderWindow::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>renwin->AddRenderer(ren1);<br><br>
<x-tab> </x-tab>vtkRenderWindowInteractor
*iren = vtkRenderWindowInteractor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>iren->SetRenderWindow(renwin);<br>
<x-tab> </x-tab><x-tab> </x-tab>iren->SetPicker(picker);<br><br>
<x-tab> </x-tab><x-tab> </x-tab>renwin->Render();<x-tab> </x-tab><br>
<x-tab> </x-tab><x-tab> </x-tab>iren->Start();<br>
}<br><br>
</font>//For UNSTRUCTURED (does not show the picked
points)-------------------------------------------------------------------------------------------------------------------<br><br>
<font face="Courier New, Courier">//--- VTK HEADERS ---//<br>
#include "vtkActor.h"<br>
#include "vtkRenderer.h"<br>
#include "vtkRenderWindow.h"<br>
#include "vtkRenderWindowInterActor.h"<br>
//-------------<br>
#include "vtkCommand.h"<br>
#include "vtkIntArray.h"<br>
#include "vtkPointData.h"<br>
#include "vtkPointPicker.h"<br>
#include "vtkUnstructuredGrid.h"<br>
#include "vtkUnstructuredGridReader.h"<br>
#include "vtkDataSetMapper.h"<br>
#include "vtkProperty.h"<br>
//-------------<br><br>
<br>
//--- GLOBALS ---//<br>
static vtkUnstructuredGrid *ugrid;<br>
static vtkPointPicker *picker = vtkPointPicker::New();<br>
static vtkIntArray *intarray = vtkIntArray::New();<br><br>
//--- PICKCOMMAND ---//<br>
class VcPick : public vtkCommand<br>
{<br>
public:<br>
<x-tab> </x-tab>static
VcPick *New() <br>
<x-tab> </x-tab><x-tab> </x-tab>{
<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>return
new VcPick; <br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab>void
Delete()<br>
<x-tab> </x-tab><x-tab> </x-tab>{
<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>delete
this; <br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab>virtual
void Execute(vtkObject *caller, unsigned long, void*)<br>
<x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>int
pid = picker->GetPointId() ;<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>if
( pid >= 0 ) <br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray
= (vtkIntArray *)ugrid->GetPointData()->GetScalars();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>if
(intarray->GetValue(pid) == 0)<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray->SetValue(pid,1);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>ugrid->GetPointData()->SetScalars(intarray);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>ugrid->Modified();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>cout
<<" on" << endl;<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>else<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>{<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>intarray->SetValue(pid,0);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>ugrid->GetPointData()->SetScalars(intarray);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>ugrid->Modified();<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>cout
<<" off" << endl;<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>}<br>
<x-tab> </x-tab><x-tab> </x-tab>}<br>
};<br><br>
void main()<br>
{<br>
//--- SOURCES ---//<br>
<x-tab> </x-tab>vtkUnstructuredGridReader
*gridreader = vtkUnstructuredGridReader::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>gridreader->SetFileName("UnstructuredGrid.vtk");<br>
<x-tab> </x-tab>ugrid =
gridreader->GetOutput();<br><br>
//--- MAPPERS ---//<br>
<x-tab> </x-tab>vtkDataSetMapper
*datamapper = vtkDataSetMapper::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>datamapper->SetInput(ugrid);<br><br>
<x-tab> </x-tab>vtkDataSetMapper
*geomapper = vtkDataSetMapper::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>geomapper->SetInput(ugrid);<br><br>
//--- ACTORS ---//<br>
<x-tab> </x-tab>vtkActor
*dataactor = vtkActor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->SetMapper(datamapper);<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->GetProperty()->SetPointSize(10);<br>
<x-tab> </x-tab><x-tab> </x-tab>dataactor->GetProperty()->SetRepresentationToPoints();<br><br>
<x-tab> </x-tab>vtkActor
*geoactor = vtkActor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->SetMapper(geomapper);<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->GetProperty()->SetColor(0,0,0);<br>
<x-tab> </x-tab><x-tab> </x-tab>geoactor->GetProperty()->SetRepresentationToWireframe();<br><br>
//--- PICKING ---//<br>
<x-tab> </x-tab>VcPick
*vcpick = VcPick::New();<x-tab> </x-tab><br>
<x-tab> </x-tab><x-tab> </x-tab>picker->AddObserver(vtkCommand::EndPickEvent,
vcpick);<br><br>
<br>
//--- RENDERING ---//<br>
<x-tab> </x-tab>vtkRenderer
*ren1 = vtkRenderer::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->AddActor(geoactor);<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->AddActor(dataactor);<br>
<x-tab> </x-tab><x-tab> </x-tab>ren1->SetBackground(1,1,1);<br>
<x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab><br>
vtkRenderWindow *renwin =
vtkRenderWindow::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>renwin->AddRenderer(ren1);<br><br>
<x-tab> </x-tab>vtkRenderWindowInteractor
*iren = vtkRenderWindowInteractor::New();<br>
<x-tab> </x-tab><x-tab> </x-tab>iren->SetRenderWindow(renwin);<br>
<x-tab> </x-tab><x-tab> </x-tab>iren->SetPicker(picker);<br><br>
<x-tab> </x-tab><x-tab> </x-tab>renwin->Render();<x-tab> </x-tab><br>
<x-tab> </x-tab><x-tab> </x-tab>iren->Start();<br>
}<br><br>
</font><x-sigsep><p></x-sigsep>
<font color="#0000FF">dr. R. van Tol<br>
WTCM Gieterijcentrum<br>
Technologiepark 9<br>
B-9052 Zwijnaarde<br>
tel.:0032 (0)9 2645704<br>
fax:0032 (0)9 2645848<br>
</font><font color="#000080"><a href="mailto:rob.vantol@wtcm.be" eudora="autourl">mailto:</a></font><a href="mailto:rob.vantol@wtcm.be" eudora="autourl"><font color="#0000FF">rob.vantol@wtcm.be</a></font></body>
</html>