c++ - VTK Iso Slider 不工作或不显示滑块小部件
问题描述
我的代码中有一些疯狂的问题,这些问题是:
1) 正如您在下面的代码中看到的,如果我执行它,我将得到一个没有sliderWidget 的3D 预览模型。(固定的)
2) 如果我将这条线从 更改为mapper->SetInputConnection(surface->GetOutputPort());
,mapper->SetInputConnection(reader->GetOutputPort());
我将得到一个 sliderWidget 但我不会看到 3D 模型。(固定的)
3)如果我尝试设置自定义键事件,它会起作用并更改值,但每次更改我都需要等到它重新加载或构建 3d dicom(它的工作就像你每次运行并创建一个 3D 模型而不像滑块一样) .
class vtkSliderCallback : public vtkCommand
{
public:
int counter = 1;
static vtkSliderCallback *New()
{
return new vtkSliderCallback;
}
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkSliderWidget *sliderWidget =
reinterpret_cast<vtkSliderWidget*>(caller);
cout << this->counter << endl;
this->SphereSource->SetValue(this->counter++, static_cast<vtkSliderRepresentation *>(sliderWidget->GetRepresentation())->GetValue());
}
vtkSliderCallback():SphereSource(0) {}
vtkMarchingCubes *SphereSource;
};
int main(int argc, char* argv[])
{
// Verify input arguments
if ( argc < 4 )
{
std::cout << "Usage: " << argv[0]
<< " DicomSiresFolder" << " isoValueStep" << " OutputDirectory" << std::endl;
return EXIT_FAILURE;
}
std::string folder = argv[1];
// A sphere
vtkSmartPointer<vtkImageData> volume =
vtkSmartPointer<vtkImageData>::New();
vtkSmartPointer<vtkDICOMImageReader> reader =
vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(folder.c_str());
reader->Update();
volume->DeepCopy(reader->GetOutput());
vtkSmartPointer<vtkMarchingCubes> surface =
vtkSmartPointer<vtkMarchingCubes>::New();
surface->SetInputData(volume);
surface->ComputeNormalsOn();
surface->SetValue(0, 400);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(surface->GetOutputPort());
mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetInterpolationToFlat();
// A renderer and render window
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
// An interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actors to the scene
renderer->AddActor(actor);
// Render an image (lights and cameras are created automatically)
renderWindow->Render();
vtkSmartPointer<vtkSliderRepresentation3D> sliderRep =
vtkSmartPointer<vtkSliderRepresentation3D>::New();
sliderRep->SetMinimumValue(-800.0);
sliderRep->SetMaximumValue(800.0);
sliderRep->SetTitleText("Iso Resolution");
sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToWorld();
sliderRep->GetPoint1Coordinate()->SetValue(-4,6,0);
sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToWorld();
sliderRep->GetPoint2Coordinate()->SetValue(4,6,0);
sliderRep->SetSliderLength(0.075);
sliderRep->SetSliderWidth(0.05);
sliderRep->SetEndCapLength(0.05);
vtkSmartPointer<vtkSliderWidget> sliderWidget =
vtkSmartPointer<vtkSliderWidget>::New();
sliderWidget->SetInteractor(renderWindowInteractor);
sliderWidget->SetRepresentation(sliderRep);
sliderWidget->SetAnimationModeToAnimate();
sliderWidget->EnabledOn();
vtkSmartPointer<vtkSliderCallback> callback =
vtkSmartPointer<vtkSliderCallback>::New();
callback->SphereSource = surface;
sliderWidget->AddObserver(vtkCommand::InteractionEvent,callback);
renderWindowInteractor->Initialize();
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
更新: 我修复了第 1 点和第 2 点的问题,但仍然需要修复问题 3 。
解决方案
您的回调正在更改 vtkMarchingCube 的值,因此您每次都在运行一个行进立方体,所以是的,它每次都在重建一个网格。据我了解您需要做什么,一种解决方案可以是预先计算所有可能值的 vtkMarchingCubes 输出:不优雅(但如果您有足够的内存,它可以工作)。在任何情况下,使用 vtkFlyingEdges3D 而不是 vtkMarchingCubes,它要快得多(它可以足够快地解决您的问题而无需任何其他修改)。
推荐阅读
- python - UnboundLocalError:分配前引用的局部变量“state_claim_ratio_df”
- xamarin - 使用 MvvmCross 在 Xamarin 表单中根据用户输入显示自定义字段
- powershell - PowerShell中密码的RegEx验证
- node.js - PhpStorm/WebStorm 终端显示旧 NPM 版本
- c# - 如何删除默认的 ASP.NET Core Identity 端点?
- selenium - 虽然 Xpath 可用,但会抛出 element not found 错误
- c# - 如果按钮在列表中,则更改按钮
- csv - sqlite3 导入带有列和行分隔符的 csv
- html - angularjs注入器:location.path的unpr错误
- java - 使用 Jackson 将类似列表的 JSON 对象映射到 Java 列表