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[3],second[3]; lineWidget->GetPoint1 (first); lineWidget->GetPoint2 (second); lineWidget->SetPoint1 (first[0],first[1],0); lineWidget->SetPoint2 (second[0],second[1],0); double length; length=sqrt((first[0]-second[0])*(first[0]-second[0])+ (first[1]-second[1])*(first[1]-second[1])); char cAct[100]; 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; }
测量距离
|