Как определить взаимодействие клавиш CallBack в VTK - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь использовать функцию обратного вызова для запуска действия при нажатии клавиши (клавиатуры). Для этого я реализую пример «KeyPressObserver». Моя цель - увеличить радиус сферы, когда я нажимаю на стрелку «Вправо».

В коде, который я показываю, как я изменил пример, чтобы достичь своей цели.

void KeypressCallbackFunction(
    vtkObject* caller,
    long unsigned int eventId,
    void* clientData,
    void* callData);

std::string key = "";

int main(int, char* [])
{
    // Create a sphere
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();

    sphereSource->SetCenter(0.0, 0.0, 0.0);
    sphereSource->SetRadius(5.0);
    sphereSource->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());

    // Create an actor
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 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);

    vtkSmartPointer<vtkCallbackCommand> keypressCallback = vtkSmartPointer<vtkCallbackCommand>::New();
    keypressCallback->SetCallback(KeypressCallbackFunction);
    renderWindowInteractor->AddObserver(vtkCommand::KeyPressEvent, keypressCallback);
    keypressCallback->SetClientData(sphereSource);

    //key = renderWindowInteractor->GetKeySym();
    renderer->InteractiveOn();
    renderer->AddActor(actor);
    renderWindowInteractor->Initialize();
    renderer->SetBackground(1, 1, 1); // Background color white
    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

void KeypressCallbackFunction(vtkObject* caller, long unsigned int
    vtkNotUsed(eventId), void* clientData, void* callData)
{
    std::cout << "Keypress callback" << std::endl;

    vtkRenderWindowInteractor* iren = static_cast<vtkRenderWindowInteractor*>(caller);

    std::cout << "Pressed: " << iren->GetKeySym() << std::endl;

    key = iren->GetKeySym();

    vtkSphereSource* sphere = static_cast<vtkSphereSource*>(clientData);

    if (key == "Right") {
        std::cout << "TEST RIGHT" << std::endl;

        sphere->SetRadius(10);
        sphere->Modified();
        sphere->Update();
    }
}

Проблема в том, что когда я запускаю этот код, действие, связанное с нажатием клавиши, запускается толькопосле этого я нажимаю стрелку вправо и после щелчка мышью. Я хотел бы начать действие только со стрелкой вправо, а не со вторым щелчком мыши. В чем проблема? Я не нашел ничего онлайн для решения этой проблемы, пожалуйста, помогите.

...