Dear Flo, I have had a similar problem and the solution I adopted may
not be elegant but it works. Use a static attribute ( i.e., "This",
note the uppercase "T") that you  can use in the callback. The
attribute is a pointer to a class PLUS. PLUSīs constructor would
initialize it to "this" (something like "This = this"). Another
solution would be to make static all the pointer attributes you need to
use in your callback (iren ren, picker and so on...). I also tried this
second path but I found it is a lit more messy.<br>
<br>
Hope this help<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Luca<br>
<br>
<br><br><div><span class="gmail_quote">On 7/10/07, <b class="gmail_sendername">Flo</b> &lt;<a href="mailto:snrf@no-log.org">snrf@no-log.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Dear all:<br><br>I&#39;m using vtk 5.0 on MaxosX and with Qt 4.0.<br><br>I&#39;m trying to convert the annotatePick.cxx example (also attached),<br>that works as a single app,&nbsp;&nbsp;to something that would fit in a broader<br>
application (i.e. at least within classes and methods !).<br>However, I can&#39;t handle the fact that the callback function must be<br>static within the class while the callback function needs some<br>private object of the class PLUS, the fact that the
<br>vtkCallbackCommand-&gt;SetCallback() method need a function pointer.<br><br>So far, I have the following error:<br><br>error: invalid use of member &#39;SimpleView::MouseMotion&#39; in static<br>member function ....... same for iren, ren and picker !
<br><br>Can someone point me to some directions or give me a better way to<br>get pixel coordinates.<br><br>Thanks.<br><br>Flo.<br><br>Code -<br><br>Method that should start the callback<br><br>void SimpleView::on_ButStart_clicked()
<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MouseMotion = 0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sphere = vtkSphereSource::New();<br><br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper = vtkPolyDataMapper::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper-&gt;SetInput(sphere-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper-&gt;GlobalImmediateModeRenderingOn();
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VTKF.Load_Sphere *sphereMapper = new VTKF.Load_Sphere ();<br><br>&nbsp;&nbsp;&nbsp;&nbsp; sphereActor = vtkActor::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereActor-&gt;SetMapper(sphereMapper);<br><br>// create the spikes by glyphing the sphere with a cone.&nbsp;&nbsp;Create the
<br>mapper<br>// and actor for the glyphs.<br>&nbsp;&nbsp;&nbsp;&nbsp; cone = vtkConeSource::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph = vtkGlyph3D::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetInput(sphere-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetSource(cone-&gt;GetOutput());<br>
&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetVectorModeToUseNormal();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetScaleModeToScaleByVector();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetScaleFactor(0.25);<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeMapper-&gt;SetInput(glyph-&gt;GetOutput());
<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeActor = vtkActor::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeActor-&gt;SetMapper(spikeMapper);<br><br><br>// Create a cell picker.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;picker2 = vtkCellPicker::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pickObserver = PickCommand::New();<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//pickObserver-&gt;SetPtr(/*picker2,*/ textActor, textMapper, renWin);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; picker2-&gt;AddObserver( vtkCommand::EndPickEvent, pickObserver );<br><br>// Create a text mapper and actor to display the results of picking.
<br>&nbsp;&nbsp;&nbsp;&nbsp; textMapper = vtkTextMapper::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop = textMapper-&gt;GetTextProperty();<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetFontFamilyToArial();<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetFontSize(12);<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;BoldOn();<br>//&nbsp;&nbsp;&nbsp;&nbsp;tprop-&gt;ShadowOn();
<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetColor(1, 0, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor = vtkActor2D::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;SetMapper(textMapper);<br><br>// Create the Renderer, RenderWindow, and RenderWindowInteractor
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;style = vtkInteractorStyleTrackballCamera::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; pickerCommand = vtkCallbackCommand::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; //pickerCommand-&gt;SetCallback(&amp;PickerInteractionCallback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pickerCommand-&gt;SetCallback(&amp;Test);
<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::LeftButtonPressEvent,<br>pickerCommand);<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::MouseMoveEvent, pickerCommand);<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::LeftButtonReleaseEvent,
<br>pickerCommand);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;SetInteractorStyle(style);<br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;SetPicker(picker2);<br><br>// Add the actors to the renderer, set the background and size<br><br>&nbsp;&nbsp;&nbsp;&nbsp; ren-&gt;AddActor2D(textActor);
<br><br>&nbsp;&nbsp;&nbsp;&nbsp; ren-&gt;AddActor(sphereActor);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren-&gt;AddActor(spikeActor);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren-&gt;SetBackground(1, 1, 1);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ren-&gt;AddActor(sphereActor);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren-&gt;AddActor(spikeActor);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renWin-&gt;Render();
<br><br><br><br><br><br>}<br><br>------------------------------------------<br>-----------------------------------------<br><br>Header file<br><br>class SimpleView : public QMainWindow, private Ui_MainWindow<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; Q_OBJECT
<br><br>static void Test(vtkObject* vtkNotUsed(object),unsigned long<br>event,void* clientdata, void* vtkNotUsed(calldata))<br>{<br><br>&nbsp;&nbsp; vtkInteractorStyleTrackballCamera * style =<br>(vtkInteractorStyleTrackballCamera*)clientdata;
<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;switch( event )<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::LeftButtonPressEvent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseMotion = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnLeftButtonDown();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::LeftButtonReleaseEvent:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (MouseMotion == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pick = iren-&gt;GetEventPosition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
picker2-&gt;Pick((double)pick[0], (double)pick[1], 0.0, ren);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnLeftButtonUp();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::MouseMoveEvent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseMotion = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnMouseMove();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br><br><br>}<br><br>public:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; // Constructor/Destructor<br>&nbsp;&nbsp;&nbsp;&nbsp; SimpleView(QWidget* parent = 0);<br>&nbsp;&nbsp;&nbsp;&nbsp; ~SimpleView() {};<br><br>public slots:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//virtual void vtkTest();<br>
<br>private slots:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void on_ButStart_clicked();<br><br>private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkSphereSource* sphere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyDataMapper *sphereMapper, *spikeMapper;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkActor *sphereActor, *spikeActor;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkConeSource* cone;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkGlyph3D* glyph;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PickCommand* pickObserver;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkTextProperty *tprop;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkInteractorStyleTrackballCamera *style;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCallbackCommand *pickerCommand;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkActor2D *textActor;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkTextMapper *textMapper;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkRenderWindow *renWin;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkCamera *cam1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int MouseMotion;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkRenderWindowInteractor *iren;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkRenderer *ren;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkCellPicker *picker2;
<br><br><br>};<br><br><br><br>class PickCommand : public vtkCommand<br>{<br><br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; static PickCommand *New() { return new PickCommand; }<br>&nbsp;&nbsp;&nbsp;&nbsp; void Delete() { delete this; }<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; virtual void Execute(vtkObject *caller, unsigned long l, void
<br>*callData)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (picker-&gt;GetCellId() &lt; 0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double selpt[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;GetSelectionPoint(selpt);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double x = selpt[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double y = selpt[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double pickPos[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;GetPickPosition( pickPos );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double xp = pickPos[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double yp = pickPos[1];
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double zp = pickPos[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char text[120];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sprintf( text, &quot;(%5.5f,&nbsp;&nbsp;%5.5f,&nbsp;&nbsp;%5.5f)&quot;, xp, yp,
zp );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textMapper-&gt;SetInput( text );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;SetPosition(x, y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOn();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renWin-&gt;Render(); // faire un pointeur de meme que pour
<br>picker !!!!<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void SetPtr(vtkCellPicker *pickerptr, vtkActor2D *textActorptr,<br>vtkTextMapper *textMapperptr, vtkRenderWindow *renWinptr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;picker = pickerptr;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textActor = textActorptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textMapper = textMapperptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renWin = renWinptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkCellPicker *picker;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkActor2D *textActor;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkTextMapper *textMapper;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkRenderWindow *renWin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkRenderWindowInteractor *iren;<br>};<br><br>--------------------------------<br>-------------------------------------
<br><br>Annotate EXAMPLE<br><br>#include &quot;vtkSphereSource.h&quot;<br>#include &quot;vtkPolyDataMapper.h&quot;<br>#include &quot;vtkLODActor.h&quot;<br>#include &quot;vtkConeSource.h&quot;<br>#include &quot;vtkGlyph3D.h
&quot;<br>#include &quot;vtkCellPicker.h&quot;<br>#include &quot;vtkTextMapper.h&quot;<br>#include &quot;vtkActor2D.h&quot;<br>#include &quot;vtkInteractorStyleTrackballCamera.h&quot;<br>#include &quot;vtkRenderer.h&quot;
<br>#include &quot;vtkRenderWindow.h&quot;<br>#include &quot;vtkRenderWindowInteractor.h&quot;<br>#include &quot;vtkTextProperty.h&quot;<br>#include &quot;vtkCallbackCommand.h&quot;<br>#include &quot;vtkCamera.h&quot;<br>
<br>int MouseMotion;<br>vtkRenderer *ren1;<br>vtkRenderWindow *renWin;<br>vtkRenderWindowInteractor *iren;<br>vtkCellPicker *picker;<br>vtkActor2D *textActor;<br>vtkTextMapper *textMapper;<br><br>class PickCommand : public vtkCommand
<br>{<br>public:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; static PickCommand *New() { return new PickCommand; }<br>&nbsp;&nbsp;&nbsp;&nbsp; void Delete() { delete this; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp; virtual void Execute(vtkObject *caller, unsigned long l, void<br>*callData)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (picker-&gt;GetCellId() &lt; 0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double selpt[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;GetSelectionPoint(selpt);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double x = selpt[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double y = selpt[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double pickPos[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;GetPickPosition( pickPos );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double xp = pickPos[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double yp = pickPos[1];
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double zp = pickPos[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char text[120];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sprintf( text, &quot;(%5.5f,&nbsp;&nbsp;%5.5f,&nbsp;&nbsp;%5.5f)&quot;, xp, yp,
zp );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textMapper-&gt;SetInput( text );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;SetPosition(x, y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOn();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renWin-&gt;Render();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>};<br>
<br>void PickerInteractionCallback( vtkObject* vtkNotUsed(object),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned
long event,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void*
clientdata,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void*
vtkNotUsed(calldata) )<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkInteractorStyleTrackballCamera * style =<br>(vtkInteractorStyleTrackballCamera*)clientdata;<br>&nbsp;&nbsp;&nbsp;&nbsp; switch( event )<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::LeftButtonPressEvent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseMotion = 0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnLeftButtonDown();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::LeftButtonReleaseEvent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (MouseMotion == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pick = iren-&gt;GetEventPosition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
picker-&gt;Pick((double)pick[0], (double)pick[1], 0.0, ren1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnLeftButtonUp();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; case vtkCommand::MouseMoveEvent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseMotion = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;OnMouseMove();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br><br><br>int main(int argc, char* argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; MouseMotion = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkSphereSource *sphere = vtkSphereSource::New();<br><br>&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper-&gt;SetInput(sphere-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper-&gt;GlobalImmediateModeRenderingOn();<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkLODActor *sphereActor = vtkLODActor::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereActor-&gt;SetMapper(sphereMapper);
<br><br>// create the spikes by glyphing the sphere with a cone.&nbsp;&nbsp;Create the<br>mapper<br>// and actor for the glyphs.<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkConeSource *cone = vtkConeSource::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkGlyph3D *glyph = vtkGlyph3D::New();<br>
&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetInput(sphere-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetSource(cone-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetVectorModeToUseNormal();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetScaleModeToScaleByVector();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;SetScaleFactor(
0.25);<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeMapper-&gt;SetInput(glyph-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkLODActor *spikeActor = vtkLODActor::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeActor-&gt;SetMapper(spikeMapper);
<br><br>// Create a cell picker.<br>&nbsp;&nbsp;&nbsp;&nbsp; PickCommand* pickObserver = PickCommand::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; picker = vtkCellPicker::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;AddObserver( vtkCommand::EndPickEvent, pickObserver );<br><br>// Create a text mapper and actor to display the results of picking.
<br>&nbsp;&nbsp;&nbsp;&nbsp; textMapper = vtkTextMapper::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkTextProperty *tprop = textMapper-&gt;GetTextProperty();<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetFontFamilyToArial();<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetFontSize(12);<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;BoldOn();<br>//&nbsp;&nbsp;&nbsp;&nbsp;tprop-&gt;ShadowOn();
<br>&nbsp;&nbsp;&nbsp;&nbsp; tprop-&gt;SetColor(1, 0, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor = vtkActor2D::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;SetMapper(textMapper);<br><br>// Create the Renderer, RenderWindow, and RenderWindowInteractor
<br><br>&nbsp;&nbsp;&nbsp;&nbsp; vtkInteractorStyleTrackballCamera *style =<br>vtkInteractorStyleTrackballCamera::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkCallbackCommand * pickerCommand = vtkCallbackCommand::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; pickerCommand-&gt;SetClientData(style);<br>
&nbsp;&nbsp;&nbsp;&nbsp; pickerCommand-&gt;SetCallback(&amp;PickerInteractionCallback);<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::LeftButtonPressEvent,<br>pickerCommand);<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::MouseMoveEvent, pickerCommand);
<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;AddObserver(vtkCommand::LeftButtonReleaseEvent,<br>pickerCommand);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren1 = vtkRenderer::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; renWin = vtkRenderWindow::New();<br>&nbsp;&nbsp;&nbsp;&nbsp; renWin-&gt;AddRenderer(ren1);<br>&nbsp;&nbsp;&nbsp;&nbsp; iren = vtkRenderWindowInteractor::New();
<br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;SetRenderWindow(renWin);<br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;SetInteractorStyle(style);<br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;SetPicker(picker);<br><br>// Add the actors to the renderer, set the background and size<br><br>&nbsp;&nbsp;&nbsp;&nbsp; ren1-&gt;AddActor2D(textActor);
<br>&nbsp;&nbsp;&nbsp;&nbsp; ren1-&gt;AddActor(sphereActor);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren1-&gt;AddActor(spikeActor);<br>&nbsp;&nbsp;&nbsp;&nbsp; ren1-&gt;SetBackground(1, 1, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp; renWin-&gt;SetSize(300, 300);<br><br>// Get the camera and zoom in closer to the image.<br>&nbsp;&nbsp;&nbsp;&nbsp; vtkCamera *cam1 = ren1-&gt;GetActiveCamera();
<br>&nbsp;&nbsp;&nbsp;&nbsp; cam1-&gt;Zoom(1.4);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;Initialize();<br>&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;Start();<br><br>&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;RemoveObserver( pickObserver );<br>&nbsp;&nbsp;&nbsp;&nbsp; sphere-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereMapper-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; sphereActor-&gt;Delete();
<br>&nbsp;&nbsp;&nbsp;&nbsp; cone-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; glyph-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeMapper-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; spikeActor-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; picker-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; textMapper-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; textActor-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; pickerCommand-&gt;Delete();
<br>&nbsp;&nbsp;&nbsp;&nbsp; style-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; ren1-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; renWin-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp; pickObserver-&gt;Delete();<br>//&nbsp;&nbsp;&nbsp;&nbsp;iren-&gt;Delete();<br>}<br><br><br>_______________________________________________<br>This is the private VTK discussion list.
<br>Please keep messages on-topic. Check the FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ">http://www.vtk.org/Wiki/VTK_FAQ</a><br>Follow this link to subscribe/unsubscribe:<br><a href="http://www.vtk.org/mailman/listinfo/vtkusers">
http://www.vtk.org/mailman/listinfo/vtkusers</a><br></blockquote></div><br>