VTK Iso Slider не работает или не показывает виджет слайдера - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть некоторые сумасшедшие проблемы в моем коде, и эти проблемы:

1) Как вы видите в приведенном ниже коде, если я выполню его, у меня будет 3D-модель предварительного просмотра без sliderWidget. (Fixed)

2) Если я изменю эту строку с mapper->SetInputConnection(surface->GetOutputPort()); на mapper->SetInputConnection(reader->GetOutputPort());, я получу виджет-слайдер, но не увижу 3D-модель. (фиксированный)

3) Если я попытаюсь установить пользовательское ключевое событие, оно будет работать и менять значение, но при каждом изменении мне нужно ждать, пока он перезагрузится или создаст 3D-диктом (это работает так, как будто вы запускаете и создаете 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;
}

enter image description here enter image description here

UPDATE: I Исправлена ​​проблема в пунктах 1 и 2, но все еще Проблема 3 , которую необходимо исправить.

1 Ответ

0 голосов
/ 11 ноября 2018

Ваш обратный вызов меняет значение для vtkMarchingCube, поэтому вы запускаете марширующие кубы каждый раз, так что да, он каждый раз перестраивает сетку. Насколько я понимаю, что вам нужно сделать, одним из решений может быть предварительное вычисление вывода vtkMarchingCubes для всех возможных значений: не элегантно (но это может сработать, если у вас достаточно памяти). В любом случае, используйте vtkFlyingEdges3D вместо vtkMarchingCubes, это намного быстрее (это может быть достаточно быстро, чтобы решить вашу проблему без каких-либо других изменений).

...