Adam
Adam

Reputation: 1

Mouse control is lost after using vtk interactor

I'm trying to visualize a vtk unstructuredgrid mesh. In order to get the coordinate of a point of my mesh I use the vtk interactor. I'm able to get the point coordinate by selecting the point using OnRightButtonDown() "overrid" . However, I loose control of my window . means I can not rotate, translate or zoom my mesh. I tried to do use OnRightButtonDoubleClick() but this doesn't seem to work . Any idea how may I get the node coordinate using the interactor without affecting the mouse event behavior or how to re-initialize it when the mouse button is Up...

    foo
    {
    ...
    // vtk visualization    
    container = new QWidget(ui->graphicsView);
    qvtkWidget = new QVTKOpenGLNativeWidget(container);
    ...

    //Create and link the mapper actor and renderer together.
    mapper = vtkSmartPointer<vtkDataSetMapper>::New();
    actor = vtkSmartPointer<vtkActor>::New();
    renderer = vtkSmartPointer<vtkRenderer>::New();
    ...

    // add elements nodes
    ...
    mapper->SetInputData(eleNodeIdsPtr);
    actor->SetMapper(mapper);
    renderer->AddActor(actor);

    // ste up camera
    renderer->SetBackground(0.06, 0.2, 0.5);
    double pos[3] = { 0, 0.2, 1 };
    double focalPoint[3] = { 0, 0, 0 };
    double viewUp[3] = { 1, 1, 1 };
    renderer->GetActiveCamera()->SetPosition(pos);
    renderer->GetActiveCamera()->SetFocalPoint(focalPoint);
    renderer->GetActiveCamera()->SetViewUp(viewUp);
    renderer->GetActiveCamera()->Zoom(0.5);

    //Add render
    qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
    qvtkWidget->show();

    // Select node
    renderWindowInteractor = 
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(qvtkWidget- 
    >GetRenderWindow());
    vtkNew<InteractorStyle2> style;
    renderWindowInteractor->SetInteractorStyle(style);
    style->eleNodeIdsPtr = eleNodeIdsPtr;
    style->xyzGlobalPtr = xyzGlobalPtr;
    renderWindowInteractor->Initialize();
   }

   // Define interaction style
   class InteractorStyle2 : public vtkInteractorStyleTrackballActor
    {
    public:
    static InteractorStyle2* New();
    vtkTypeMacro(InteractorStyle2, vtkInteractorStyleTrackballActor);
    vtkNew<vtkNamedColors> color;

    ...
    void OnLeftButtonDown()  //...>>>This doesn't work!!
    {
    
    }
    void OnLeftButtonDown() override // .. this work but the I can't controle the transformation anymore!!
    {
        this->PointPicker = vtkSmartPointer<vtkPointPicker>::New();
        // Get the selected point
        int x = this->Interactor->GetEventPosition()[0];
        int y = this->Interactor->GetEventPosition()[1];
        this->FindPokedRenderer(x, y);

        this->PointPicker->Pick(this->Interactor->GetEventPosition()[0],
            this->Interactor->GetEventPosition()[1],
            0, // always zero.
            this->Interactor->GetRenderWindow()
            ->GetRenderers()
            ->GetFirstRenderer());

        if (this->PointPicker->GetPointId() >= 0)
        {
            this->StartPan();
            this->SelectedPoint = this->PointPicker->GetPointId();
            double p[3];
            this->eleNodeIdsPtr->GetPoint(this->SelectedPoint, p);
            std::cout << "p: " << p[0] << " " << p[1] << " " << p[2] << std::endl;
        }
    }

    vtkSmartPointer<vtkPointPicker> PointPicker;
    vtkIdType SelectedPoint;
    vtkSmartPointer<vtkUnstructuredGrid>  eleNodeIdsPtr;
    vtkSmartPointer< vtkPoints >  xyzGlobalPtr;
    }
    vtkStandardNewMacro(InteractorStyle2);
    }

Upvotes: 0

Views: 469

Answers (1)

Nico Vuaille
Nico Vuaille

Reputation: 2498

You should call the OnLeftButtonDown (or up) of the parent class, by adding this line at the end of your method impl:

vtkInteractorStyleTrackballActor::OnLeftButtonDown();

A similar example

Upvotes: 0

Related Questions