как отключить горячую клавишу vtk

Я хочу отключить горячие клавиши на vtk. На самом деле я использую vtk.js, но можно сказать мне обычным способом vtk.

Я хочу отключить следующие горячие клавиши здесь: "W": переключить виджет выбора области интереса (ROI) "S": переключить плоскости сечения в режиме объемного рендеринга "V": переключиться на точечную форму "R": сбросить камеру

Я попробовал установить InteractorStyleManipulator на OpenGLRenderwindow и попробовал способ fullScreenRender. но это не работает.

Как я мог пройти через это?

Благодарю вас!

    <div id="container"></div>
    <script>
        
        const container = document.querySelector('#container');

        //VTK renderwindow/renderer
        //const fullScreenRenderer = vtk.Rendering.Misc.vtkFullScreenRenderWindow.newInstance();
        const renderWindow = vtk.Rendering.Core.vtkRenderWindow.newInstance();
        const renderer     = vtk.Rendering.Core.vtkRenderer.newInstance();
        renderWindow.addRenderer(renderer);

        //webGL/opengl impl
        const openGLRenderWindow = vtk.Rendering.OpenGL.vtkRenderWindow.newInstance();
        openGLRenderWindow.setContainer(container);
        openGLRenderWindow.setSize(1000,1000);
        renderWindow.addView(openGLRenderWindow);

        //Interactor
        const interactor = vtk.Rendering.Core.vtkRenderWindowInteractor.newInstance();
        interactor.setView(openGLRenderWindow);
        interactor.initialize();
        interactor.bindEvents(container);

        //Interactor style
        const trackball = vtk.Interaction.Style.vtkInteractorStyleTrackballCamera.newInstance();
        interactor.setInteractorStyle(trackball);

        //disable_shortcuts
        let interactorstyle = vtk.Interaction.Style.vtkInteractorStyleManipulator.newInstance();
        interactorstyle.handleKeyPress = (callData) => {
            const rwi = model.interactor;
            let ac = null;
            switch (callData.key) {
            case 'r':
            case 'R':
                //callData.pokedRenderer.resetCamera();
                //rwi.render();
                break;

            case 'w':
            case 'W':
                // ac = callData.pokedRenderer.getActors();
                // ac.forEach((anActor) => {
                // anActor.getProperty().setRepresentationToWireframe();
                // });
                //rwi.render();
                // break;
                break;

            case 's':
            case 'S':
                // ac = callData.pokedRenderer.getActors();
                // ac.forEach((anActor) => {
                // anActor.getProperty().setRepresentationToSurface();
                // });
                //rwi.render();
                break;

            case 'v':
            case 'V':
                // ac = callData.pokedRenderer.getActors();
                // ac.forEach((anActor) => {
                // anActor.getProperty().setRepresentationToPoints();
                // });
                //rwi.render();
                break;

            default:
                break;
            }
        };
        //fullScreenRenderer.getInteractor().setInteractorStyle(interactorstyle);

        //Pipeline
        const cone  =   vtk.Filters.Sources.vtkConeSource.newInstance();
        const actor =   vtk.Rendering.Core.vtkActor.newInstance();
        const mapper=   vtk.Rendering.Core.vtkMapper.newInstance();

        actor.setMapper(mapper);
        mapper.setInputConnection(cone.getOutputPort());
        renderer.addActor(actor);

        //const LUT = vtk.Common.Core.vtkLookUpTable.newInstance();

        //Render
        renderer.resetCamera();
        renderWindow.render();

3 ответа

Вот пример реализации.

Чтобы это стало возможным, вам необходимо создать собственный стиль взаимодействия. Создайте подкласс стиля взаимодействия и обработайте события нажатия клавиш, переопределив функцию onKeyPress() и не пересылайте события нажатия клавиш.

Если вам нужно перенаправить события, вызовите функцию родительского класса onKeyPress().

Код, представленный здесь, находится на C++, вы можете преобразовать его в javascript.

// Creating the custom interaction style
class CustomInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static CustomInteractorStyle* New();
    vtkTypeMacro(CustomInteractorStyle, vtkInteractorStyleTrackballCamera);

    // Override onKeyPress Function
    virtual void OnKeyPress() override
    {
        vtkRenderWindowInteractor* renderWindowInteractor = this->Interactor;
        switch (rwi->GetKeySym())
        {
        case "w":
        {
            // Handle the event on 'w' key press
            break;
        }
        case "s":
        {
            // Handle the event on 's' key press
            break;
        }
        case "v":
        {
            // Handle the event on 'v' key press
            break;
        }
        case "r":
        {
            // Handle the event on 'r' key press
            break;
        }
        default:
            break;
        }
        
        // If you still want to forward the key press events
        // After handling the events. this would be like addition
        // Include the below statement
        // vtkInteractorStyleTrackballCamera::OnKeyPress();
    }
};
vtkStandardNewMacro(CustomInteractorStyle);

Я не знаю js, но в C++ мне нужно переопределить класс взаимодействия для стиля взаимодействия, где мне нужно избавиться от этих ускорителей.

Например, чтобы избавиться от ускорителей в vtkInteractorStyleTrackballCamera, я переопределил этот класс и переписал обработчик OnKeyPress.

Чтобы VTK (9.0) прекратил внутреннюю обработку нажатия клавиши, кажется, что виртуальная функция OnChar() должна быть переопределена, а не OnKeyPress.

Например:

      // Creating the custom interaction style
class CustomInteractorStyle : public vtkInteractorStyleTrackballCamera
{
  public:
  static CustomInteractorStyle* New();
  vtkTypeMacro(CustomInteractorStyle, vtkInteractorStyleTrackballCamera);

  // Override onChar Function
  virtual void OnChar() override
  {
    vtkRenderWindowInteractor* renderWindowInteractor = this->Interactor;
    
    //Disable vtk processing of 'e' press
    if(ch != 'e')
    {
      vtkInteractorStyle::OnKeyPress();
    }
  }
};
vtkStandardNewMacro(CustomInteractorStyle);
Другие вопросы по тегам