一、读取DICOM文件(vtkDICOMImageReader)
cpp
auto reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(folderPath.toStdString().c_str());
reader->Update();
二、获取vtkImageData
cpp
vtkSmartPointer<vtkImageData> m_imageData = reader->GetOutput();
三、设置"十字定位器"(vtkResliceCursor)
cpp
vtkSmartPointer<vtkResliceCursor> resliceCursor = vtkSmartPointer<vtkResliceCursor>::New();
//设置三视图同步定位点
resliceCursor->SetCenter(imageData->GetCenter());
//设置是否启用"厚切片(Thick Slab)模式"
resliceCursor->SetThickMode(0);
//设置图片数据
resliceCursor->SetImage(imageData);
四、创建三个render
cpp
vtkSmartPointer<vtkRenderer> renAxial =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> renSagittal =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> renCoronal =
vtkSmartPointer<vtkRenderer>::New();
五、创建三个 widget
cpp
vtkSmartPointer<vtkResliceCursorWidget> widgetAxial =
vtkSmartPointer<vtkResliceCursorWidget>::New();
vtkSmartPointer<vtkResliceCursorWidget> widgetSagittal =
vtkSmartPointer<vtkResliceCursorWidget>::New();
vtkSmartPointer<vtkResliceCursorWidget> widgetCoronal =
vtkSmartPointer<vtkResliceCursorWidget>::New();
六、创建 representation
cpp
vtkSmartPointer<vtkResliceCursorLineRepresentation> repAxial =
vtkSmartPointer<vtkResliceCursorLineRepresentation>::New();
vtkSmartPointer<vtkResliceCursorLineRepresentation> repSagittal =
vtkSmartPointer<vtkResliceCursorLineRepresentation>::New();
vtkSmartPointer<vtkResliceCursorLineRepresentation> repCoronal =
vtkSmartPointer<vtkResliceCursorLineRepresentation>::New();
七. 绑定 cursor(关键:共享同一个)
cpp
repAxial->GetResliceCursorActor()
->GetCursorAlgorithm()
->SetResliceCursor(cursor);
repSagittal->GetResliceCursorActor()
->GetCursorAlgorithm()
->SetResliceCursor(cursor);
repCoronal->GetResliceCursorActor()
->GetCursorAlgorithm()
->SetResliceCursor(cursor);
八、设置方向
cpp
repAxial->SetPlaneOrientationToZAxis(); // Axial
repSagittal->SetPlaneOrientationToXAxis(); // Sagittal
repCoronal->SetPlaneOrientationToYAxis(); // Coronal
九、设置 widget
cpp
widgetAxial->SetRepresentation(repAxial);
widgetSagittal->SetRepresentation(repSagittal);
widgetCoronal->SetRepresentation(repCoronal);
十、renderer + interactor
cpp
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renAxial);
renderWindow->AddRenderer(renSagittal);
renderWindow->AddRenderer(renCoronal);
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
十一、初始化Widget
cpp
widgetAxial->SetInteractor(interactor);
widgetSagittal->SetInteractor(interactor);
widgetCoronal->SetInteractor(interactor);
widgetAxial->EnabledOn();
widgetSagittal->EnabledOn();
widgetCoronal->EnabledOn();
十二、启动
cpp
renderWindow->Render();
interactor->Start();