VTK Iso Slider 不工作或不显示滑块小部件

Posted

技术标签:

【中文标题】VTK Iso Slider 不工作或不显示滑块小部件【英文标题】:VTK Iso Slider not working or not showing slider widget 【发布时间】:2018-11-10 00:00:02 【问题描述】:

我的代码中有一些疯狂的问题,这些问题是:

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

【问题讨论】:

【参考方案1】:

您的回调正在更改 vtkMarchingCube 的值,因此您每次都在运行一个行进立方体,所以是的,它每次都在重建一个网格。据我了解您需要做什么,一种解决方案可以是预先计算所有可能值的 vtkMarchingCubes 输出:不优雅(但如果您有足够的内存,它可以工作)。 在任何情况下,使用 vtkFlyingEdges3D 而不是 vtkMarchingCubes,它要快得多(它可以足够快地解决您的问题而无需任何其他修改)。

【讨论】:

以上是关于VTK Iso Slider 不工作或不显示滑块小部件的主要内容,如果未能解决你的问题,请参考以下文章

自定义 jquery 移动滑块标签

更改 jQuery UI 滑块值选项时动画滑块句柄?

Slick Slider - 在多个滑块上显示计数器

CPP / JUCE 音频编程框架 - 滑块阵列不工作 - 单滑块工作

将 Slider 小部件中的值传递到 firestore 数据库

Image Slider JS 的一些问题