[vtkusers] Can't execute point picking with following code
Flo
snrf at no-log.org
Mon Jul 9 23:54:36 EDT 2007
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();
}
More information about the vtkusers
mailing list