[vtkusers] Can't execute point picking with following code
Flo
snrf at no-log.org
Fri Jul 13 12:11:09 EDT 2007
Dear Luca:
I tried your first suggestion:
In a class SimpleView I have:
public:
static void Test(vtkObject* vtkNotUsed(object),unsigned long
event,void* clientdata, void* vtkNotUsed(calldata));
private:
static SimpleView *This;
and in the SimpleView constructor I declared:
This=this
Finally, in Test I do as follows:
SimpleView::This->MouseMotion (also tried This->MouseMotion ) and
same for iren, ren and picker
BUT then during the linking process I have the following error:
/usr/bin/ld: Undefined symbols:
SimpleView::This
How did you manage to bypass that ? I actually think your way is
good, better than any idea I had, but can't pass that linking error.
Further help of yours would be more than appreciated !
Thanks again for the hint.
Flo.
On 10-Jul-07, at 7:33 AM, Luca Pallozzi Lavorante wrote:
> 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.
>
> Hope this help
>
> Luca
>
>
>
> On 7/10/07, Flo <snrf at no-log.org> wrote: Dear all:
>
> I'm using vtk 5.0 on MaxosX and with Qt 4.0.
>
> I'm trying to convert the annotatePick.cxx example (also attached),
> that works as a single app, to something that would fit in a broader
> application (i.e. at least within classes and methods !).
> However, I can't handle the fact that the callback function must be
> static within the class while the callback function needs some
> private object of the class PLUS, the fact that the
> vtkCallbackCommand->SetCallback() method need a function pointer.
>
> So far, I have the following error:
>
> error: invalid use of member 'SimpleView::MouseMotion' in static
> member function ....... same for iren, ren and picker !
>
> Can someone point me to some directions or give me a better way to
> get pixel coordinates.
>
> Thanks.
>
> Flo.
>
> Code -
>
> Method that should start the callback
>
> void SimpleView::on_ButStart_clicked()
> {
>
> MouseMotion = 0;
>
> sphere = vtkSphereSource::New();
>
> sphereMapper = vtkPolyDataMapper::New();
> sphereMapper->SetInput(sphere->GetOutput());
> sphereMapper->GlobalImmediateModeRenderingOn();
>
> //VTKF.Load_Sphere *sphereMapper = new VTKF.Load_Sphere ();
>
> sphereActor = vtkActor::New();
> sphereActor->SetMapper(sphereMapper);
>
> // create the spikes by glyphing the sphere with a cone. Create the
> mapper
> // and actor for the glyphs.
> cone = vtkConeSource::New();
> glyph = vtkGlyph3D::New();
> glyph->SetInput(sphere->GetOutput());
> glyph->SetSource(cone->GetOutput());
> glyph->SetVectorModeToUseNormal();
> glyph->SetScaleModeToScaleByVector();
> glyph->SetScaleFactor(0.25);
> vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New();
> spikeMapper->SetInput(glyph->GetOutput());
> spikeActor = vtkActor::New();
> spikeActor->SetMapper(spikeMapper);
>
>
> // Create a cell picker.
>
> picker2 = vtkCellPicker::New();
> pickObserver = PickCommand::New();
>
> //pickObserver->SetPtr(/*picker2,*/ textActor, textMapper,
> renWin);
>
> picker2->AddObserver( vtkCommand::EndPickEvent, pickObserver );
>
> // Create a text mapper and actor to display the results of picking.
> textMapper = vtkTextMapper::New();
> tprop = textMapper->GetTextProperty();
> tprop->SetFontFamilyToArial();
> tprop->SetFontSize(12);
> tprop->BoldOn();
> // tprop->ShadowOn();
> tprop->SetColor(1, 0, 0);
> textActor = vtkActor2D::New();
> textActor->VisibilityOff();
> textActor->SetMapper(textMapper);
>
> // Create the Renderer, RenderWindow, and RenderWindowInteractor
>
> style = vtkInteractorStyleTrackballCamera::New();
> pickerCommand = vtkCallbackCommand::New();
> //pickerCommand->SetCallback(&PickerInteractionCallback);
> pickerCommand->SetCallback(&Test);
> style->AddObserver(vtkCommand::LeftButtonPressEvent,
> pickerCommand);
> style->AddObserver(vtkCommand::MouseMoveEvent, pickerCommand);
> style->AddObserver(vtkCommand::LeftButtonReleaseEvent,
> pickerCommand);
>
>
> iren->SetInteractorStyle(style);
> iren->SetPicker(picker2);
>
> // Add the actors to the renderer, set the background and size
>
> ren->AddActor2D(textActor);
>
> ren->AddActor(sphereActor);
> ren->AddActor(spikeActor);
> ren->SetBackground(1, 1, 1);
>
>
> ren->AddActor(sphereActor);
> ren->AddActor(spikeActor);
>
> renWin->Render();
>
>
>
>
>
> }
>
> ------------------------------------------
> -----------------------------------------
>
> Header file
>
> class SimpleView : public QMainWindow, private Ui_MainWindow
> {
> Q_OBJECT
>
> static void Test(vtkObject* vtkNotUsed(object),unsigned long
> event,void* clientdata, void* vtkNotUsed(calldata))
> {
>
> vtkInteractorStyleTrackballCamera * style =
> (vtkInteractorStyleTrackballCamera*)clientdata;
>
>
> switch( event )
> {
> case vtkCommand::LeftButtonPressEvent:
> MouseMotion = 0;
> style->OnLeftButtonDown();
> break;
> case vtkCommand::LeftButtonReleaseEvent:
> if (MouseMotion == 0)
> {
> int *pick = iren->GetEventPosition();
> picker2->Pick((double)pick[0], (double)pick[1], 0.0,
> ren);
> }
> style->OnLeftButtonUp();
> break;
> case vtkCommand::MouseMoveEvent:
> MouseMotion = 1;
> style->OnMouseMove();
> break;
> }
>
>
> }
>
> public:
>
> // Constructor/Destructor
> SimpleView(QWidget* parent = 0);
> ~SimpleView() {};
>
> public slots:
> //virtual void vtkTest();
>
> private slots:
> void on_ButStart_clicked();
>
> private:
> vtkSphereSource* sphere;
> vtkPolyDataMapper *sphereMapper, *spikeMapper;
> vtkActor *sphereActor, *spikeActor;
> vtkConeSource* cone;
> vtkGlyph3D* glyph;
>
> PickCommand* pickObserver;
> vtkTextProperty *tprop;
> vtkInteractorStyleTrackballCamera *style;
> vtkCallbackCommand *pickerCommand;
>
> vtkActor2D *textActor;
> vtkTextMapper *textMapper;
>
> vtkRenderWindow *renWin;
>
> vtkCamera *cam1;
>
> int MouseMotion;
> vtkRenderWindowInteractor *iren;
> vtkRenderer *ren;
> vtkCellPicker *picker2;
>
>
> };
>
>
>
> class PickCommand : public vtkCommand
> {
>
> public:
> static PickCommand *New() { return new PickCommand; }
> void Delete() { delete this; }
>
>
> virtual void Execute(vtkObject *caller, unsigned long l, void
> *callData)
> {
> if (picker->GetCellId() < 0 )
> {
> textActor->VisibilityOff();
> }
> else
> {
> double selpt[3];
> picker->GetSelectionPoint(selpt);
> double x = selpt[0];
> double y = selpt[1];
> double pickPos[3];
> picker->GetPickPosition( pickPos );
> double xp = pickPos[0];
> double yp = pickPos[1];
> double zp = pickPos[2];
>
> char text[120];
> sprintf( text, "(%5.5f, %5.5f, %5.5f)", xp, yp, zp );
> textMapper->SetInput( text );
> textActor->SetPosition(x, y);
> textActor->VisibilityOn();
> }
>
> renWin->Render(); // faire un pointeur de meme que pour
> picker !!!!
>
>
> }
>
> void SetPtr(vtkCellPicker *pickerptr, vtkActor2D
> *textActorptr,
> vtkTextMapper *textMapperptr, vtkRenderWindow *renWinptr)
> {
> picker = pickerptr;
> textActor = textActorptr;
> textMapper = textMapperptr;
> renWin = renWinptr;
> }
>
> private:
> vtkCellPicker *picker;
> vtkActor2D *textActor;
> vtkTextMapper *textMapper;
> vtkRenderWindow *renWin;
> vtkRenderWindowInteractor *iren;
> };
>
> --------------------------------
> -------------------------------------
>
> Annotate EXAMPLE
>
> #include "vtkSphereSource.h"
> #include "vtkPolyDataMapper.h"
> #include "vtkLODActor.h"
> #include "vtkConeSource.h"
> #include "vtkGlyph3D.h "
> #include "vtkCellPicker.h"
> #include "vtkTextMapper.h"
> #include "vtkActor2D.h"
> #include "vtkInteractorStyleTrackballCamera.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
> #include "vtkTextProperty.h"
> #include "vtkCallbackCommand.h"
> #include "vtkCamera.h"
>
> int MouseMotion;
> vtkRenderer *ren1;
> vtkRenderWindow *renWin;
> vtkRenderWindowInteractor *iren;
> vtkCellPicker *picker;
> vtkActor2D *textActor;
> vtkTextMapper *textMapper;
>
> class PickCommand : public vtkCommand
> {
> public:
>
> static PickCommand *New() { return new PickCommand; }
> void Delete() { delete this; }
>
> virtual void Execute(vtkObject *caller, unsigned long l, void
> *callData)
> {
> if (picker->GetCellId() < 0 )
> {
> textActor->VisibilityOff();
> }
> else
> {
> double selpt[3];
> picker->GetSelectionPoint(selpt);
> double x = selpt[0];
> double y = selpt[1];
> double pickPos[3];
> picker->GetPickPosition( pickPos );
> double xp = pickPos[0];
> double yp = pickPos[1];
> double zp = pickPos[2];
>
> char text[120];
> sprintf( text, "(%5.5f, %5.5f, %5.5f)", xp, yp, zp );
> textMapper->SetInput( text );
> textActor->SetPosition(x, y);
> textActor->VisibilityOn();
> }
>
> renWin->Render();
> }
> };
>
> void PickerInteractionCallback( vtkObject* vtkNotUsed(object),
> unsigned long event,
> void* clientdata,
> void* vtkNotUsed(calldata) )
> {
> vtkInteractorStyleTrackballCamera * style =
> (vtkInteractorStyleTrackballCamera*)clientdata;
> switch( event )
> {
> case vtkCommand::LeftButtonPressEvent:
> MouseMotion = 0;
> style->OnLeftButtonDown();
> break;
> case vtkCommand::LeftButtonReleaseEvent:
> if (MouseMotion == 0)
> {
> int *pick = iren->GetEventPosition();
> picker->Pick((double)pick[0], (double)pick[1], 0.0,
> ren1);
> }
> style->OnLeftButtonUp();
> break;
> case vtkCommand::MouseMoveEvent:
> MouseMotion = 1;
> style->OnMouseMove();
> break;
> }
> }
>
>
> int main(int argc, char* argv)
> {
> MouseMotion = 0;
> vtkSphereSource *sphere = vtkSphereSource::New();
>
> vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
> sphereMapper->SetInput(sphere->GetOutput());
> sphereMapper->GlobalImmediateModeRenderingOn();
> vtkLODActor *sphereActor = vtkLODActor::New();
> sphereActor->SetMapper(sphereMapper);
>
> // create the spikes by glyphing the sphere with a cone. Create the
> mapper
> // and actor for the glyphs.
> vtkConeSource *cone = vtkConeSource::New();
> vtkGlyph3D *glyph = vtkGlyph3D::New();
> glyph->SetInput(sphere->GetOutput());
> glyph->SetSource(cone->GetOutput());
> glyph->SetVectorModeToUseNormal();
> glyph->SetScaleModeToScaleByVector();
> glyph->SetScaleFactor( 0.25);
> vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New();
> spikeMapper->SetInput(glyph->GetOutput());
> vtkLODActor *spikeActor = vtkLODActor::New();
> spikeActor->SetMapper(spikeMapper);
>
> // Create a cell picker.
> PickCommand* pickObserver = PickCommand::New();
> picker = vtkCellPicker::New();
> picker->AddObserver( vtkCommand::EndPickEvent, pickObserver );
>
> // Create a text mapper and actor to display the results of picking.
> textMapper = vtkTextMapper::New();
> vtkTextProperty *tprop = textMapper->GetTextProperty();
> tprop->SetFontFamilyToArial();
> tprop->SetFontSize(12);
> tprop->BoldOn();
> // tprop->ShadowOn();
> tprop->SetColor(1, 0, 0);
> textActor = vtkActor2D::New();
> textActor->VisibilityOff();
> textActor->SetMapper(textMapper);
>
> // Create the Renderer, RenderWindow, and RenderWindowInteractor
>
> vtkInteractorStyleTrackballCamera *style =
> vtkInteractorStyleTrackballCamera::New();
> vtkCallbackCommand * pickerCommand = vtkCallbackCommand::New();
> pickerCommand->SetClientData(style);
> pickerCommand->SetCallback(&PickerInteractionCallback);
> style->AddObserver(vtkCommand::LeftButtonPressEvent,
> pickerCommand);
> style->AddObserver(vtkCommand::MouseMoveEvent, pickerCommand);
> style->AddObserver(vtkCommand::LeftButtonReleaseEvent,
> pickerCommand);
> ren1 = vtkRenderer::New();
> renWin = vtkRenderWindow::New();
> renWin->AddRenderer(ren1);
> iren = vtkRenderWindowInteractor::New();
> iren->SetRenderWindow(renWin);
> iren->SetInteractorStyle(style);
> iren->SetPicker(picker);
>
> // Add the actors to the renderer, set the background and size
>
> ren1->AddActor2D(textActor);
> ren1->AddActor(sphereActor);
> ren1->AddActor(spikeActor);
> ren1->SetBackground(1, 1, 1);
> renWin->SetSize(300, 300);
>
> // Get the camera and zoom in closer to the image.
> vtkCamera *cam1 = ren1->GetActiveCamera();
> cam1->Zoom(1.4);
>
> iren->Initialize();
> iren->Start();
>
> picker->RemoveObserver( pickObserver );
> sphere->Delete();
> sphereMapper->Delete();
> sphereActor->Delete();
> cone->Delete();
> glyph->Delete();
> spikeMapper->Delete();
> spikeActor->Delete();
> picker->Delete();
> textMapper->Delete();
> textActor->Delete();
> pickerCommand->Delete();
> style->Delete();
> ren1->Delete();
> renWin->Delete();
> pickObserver->Delete();
> // iren->Delete();
> }
>
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/
> Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/
> Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list