medimage 发表于 2015-12-6 12:33:41

VTK例子24-vtkCellPicker

本帖最后由 medimage 于 2015-12-6 12:46 编辑

vtkCellPickervtkObject与vtkCommand共同完成消息的相应。一旦vtkObject的某一事件触发,vtkCommand即会执行其Execute成员函数,该函数内部会调用一个用户自定义的回调函数,这就给用户提供了的控制能力。  vtkInteractorStyleTrackballCamera负责响应键盘与鼠标的事件。该例中,vtkInteractorStyleTrackballCamera与vtkCallbackCommand共同完成了对鼠标点击的响应。一旦点击事件触发,vtkCallbackCommand调用Execute(),该函数调用自定义的回调函数PickerInteractionCallback(),该回调函数内部调用vtkCellPicker:pick(),而该函数触发了vtkCommand::EndPickEvent事件,PickCommand::Execute作出响应,输出坐标


This example demonstrates cell picking using vtkCellPicker.It displaysthe results of picking using a vtkTextMapper.
converted from TCL#include "stdafx.h"#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;         picker->GetSelectionPoint(selpt);         double x = selpt;         double y = selpt;         double pickPos;         picker->GetPickPosition( pickPos );         double xp = pickPos;         double yp = pickPos;         double zp = pickPos;         char text;         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, (double)pick, 0.0, ren1);       }       style->OnLeftButtonUp();       break;   case vtkCommand::MouseMoveEvent:       MouseMotion = 1;       style->OnMouseMove();       break;   }}void 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();}

medinfo 发表于 2015-12-6 22:27:23

很不错噢

admin 发表于 2015-12-8 23:43:17

谢谢分享!

mdeimage 发表于 2016-5-11 12:34:38

一直在摸索,还是楼主厉害!

李孟 发表于 2016-5-12 18:37:16

这个东西一定要看看

biochemistry 发表于 2016-5-16 20:33:29

好好好好哈

李孟 发表于 2016-5-21 09:06:05

回复看下,!!

medstd 发表于 2016-5-22 06:35:57

大哥谢了

medrt 发表于 2016-5-22 21:04:40

江西魏工 发表于 2016-5-24 03:04:54

谢谢啊版主
页: [1]
查看完整版本: VTK例子24-vtkCellPicker