medimage 发表于 2015-12-4 22:22:18

VTK例子4-vtkLineWidget测量距离

vtkLineWidget测量距离#include "stdafx.h"#include "vtkActor.h"#include "vtkCommand.h"#include "vtkInteractorEventRecorder.h"#include "vtkLineWidget.h"#include "vtkDICOMImageReader.h"#include "vtkRenderWindowInteractor.h"#include <vtkImageMapper.h>#include <vtkImageData.h>#include <vtkDICOMImageReader.h>#include <vtkActor2D.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkImageActor.h>#include <vtkImageShiftScale.h>#include <vtkProperty.h>#include <vtkTextActor.h>#include <math.h>#include <string.h>class vtkLWCallback : public vtkCommand{public:static vtkLWCallback *New()     { return new vtkLWCallback; }virtual void Execute(vtkObject *caller, unsigned long, void*)    {      vtkLineWidget *lineWidget = reinterpret_cast<vtkLineWidget*>(caller);      this->Actor->VisibilityOn();      double first,second;      lineWidget->GetPoint1 (first);      lineWidget->GetPoint2 (second);      lineWidget->SetPoint1 (first,first,0);      lineWidget->SetPoint2 (second,second,0);      double length;      length=sqrt((first-second)*(first-second)+                   (first-second)*(first-second));      char cAct;      sprintf((char *)cAct,"%.4f mm",length);//将length传给cAct      this->TextActor->SetInput (cAct);    }vtkLWCallback():Actor(0),TextActor(0) {}vtkImageActor *Actor;vtkTextActor *TextActor;};int main( int argc, char *argv[] ){    vtkDICOMImageReader* reader = vtkDICOMImageReader::New();          reader->SetFileName("C://DATADIR/brain/brain_008.dcm");      reader->SetDataByteOrderToLittleEndian();      reader->Update();    vtkImageMapper* mapper = vtkImageMapper::New();      mapper->SetInput(reader->GetOutput());      mapper->SetColorLevel(127);      mapper->SetColorWindow(255);     vtkImageShiftScale *ShiftScale = vtkImageShiftScale::New();         ShiftScale->SetInput((vtkDataObject *)reader->GetOutput());         ShiftScale->SetOutputScalarTypeToUnsignedChar();//       ShiftScale->SetShift (1024);         ShiftScale->ClampOverflowOn();         ShiftScale->Update();    vtkImageActor* actor = vtkImageActor::New();      actor->SetInput(ShiftScale->GetOutput());    vtkTextActor *mmm=vtkTextActor::New();      mmm->SetDisplayPosition(100, 10 );//设定注释位置      mmm->SetInput("hello!");vtkRenderer *ren1 = vtkRenderer::New();    vtkRenderWindow *renWin = vtkRenderWindow::New();    renWin->AddRenderer(ren1);vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();    iren->SetRenderWindow(renWin);vtkLWCallback *myCallback = vtkLWCallback::New();    myCallback->Actor = actor;    myCallback->TextActor = mmm;vtkLineWidget *lineWidget = vtkLineWidget::New();    lineWidget->SetInteractor(iren);    lineWidget->SetInput(reader->GetOutput());    lineWidget->SetAlignToYAxis();    lineWidget->PlaceWidget();    lineWidget->GetLineProperty()->SetColor(1,0,0);    lineWidget->GetHandleProperty()->SetColor(0,1,0);    lineWidget->AddObserver(vtkCommand::InteractionEvent,myCallback);ren1->AddActor(actor);ren1->AddActor(mmm);//显示注释文字// Add the actors to the renderer, set the background and size//ren1->SetBackground(0.1, 0.2, 0.4);renWin->SetSize(600, 600);ren1->InteractiveOff();iren->Initialize();renWin->Render();iren->SetKeyCode('i');iren->InvokeEvent(vtkCommand::CharEvent,NULL);ren1->InteractiveOff();// Remove the observers so we can go interactive. Without this the "-I"// testing option fails.iren->Start();myCallback->Delete();lineWidget->Delete();iren->Delete();renWin->Delete();ren1->Delete();return 0;}

江西魏工 发表于 2016-5-12 18:04:27

学习学习一下

hosstd 发表于 2016-5-15 08:11:41

好贴!!!
页: [1]
查看完整版本: VTK例子4-vtkLineWidget测量距离