Javascript 如何禁用vtk';s热键

Javascript 如何禁用vtk';s热键,javascript,c++,vtk,vtk.js,Javascript,C++,Vtk,Vtk.js,我想禁用vtk上的一些热键。 实际上,我使用的是vtk.js,但是可以用正常的vtk方式告诉我 我想在此处禁用以下热键: “W”:切换感兴趣区域(ROI)选择小部件 “S”:在体渲染模式下切换切片平面 “V”:切换到点形式 “R”:重置摄像机 我尝试在OpenGLRenderwindow上设置InteractiorStyleManipulator, 并尝试了全屏渲染方式。 但是它不起作用 我怎样才能度过难关 谢谢大家! <div id="container"&g

我想禁用vtk上的一些热键。 实际上,我使用的是vtk.js,但是可以用正常的vtk方式告诉我

我想在此处禁用以下热键: “W”:切换感兴趣区域(ROI)选择小部件 “S”:在体渲染模式下切换切片平面 “V”:切换到点形式 “R”:重置摄像机

我尝试在OpenGLRenderwindow上设置InteractiorStyleManipulator, 并尝试了全屏渲染方式。 但是它不起作用

我怎样才能度过难关

谢谢大家!

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

const container=document.querySelector(“#container”);
//VTK渲染器窗口/渲染器
//const fullScreenRenderer=vtk.Rendering.Misc.vtkFullScreenRenderWindow.newInstance();
const renderWindow=vtk.Rendering.Core.vtkRenderWindow.newInstance();
const renderer=vtk.Rendering.Core.vtkrender.newInstance();
添加渲染器(渲染器);
//webGL/openglimpl
const openGLRenderWindow=vtk.Rendering.OpenGL.vtkRenderWindow.newInstance();
openGLRenderWindow.setContainer(container);
openGLRenderWindow.setSize(10001000);
addView(openGLRenderWindow);
//互动者
const interactitor=vtk.Rendering.Core.vtkrenderWindowInteractior.newInstance();
setView(openGLRenderWindow);
interactior.initialize();
interactior.bindEvents(容器);
//交互者风格
const trackball=vtk.Interaction.Style.vtkInteractorStyleTrackballCamera.newInstance();
互动者。设置互动者风格(轨迹球);
//禁用快捷方式
让interactorstyle=vtk.Interaction.Style.vtkInteractorStyleManipulator.newInstance();
interactorstyle.handleKeyPress=(调用数据)=>{
const rwi=model.interactior;
设ac=null;
开关(callData.key){
案例“r”:
案例“R”:
//callData.pokedrender.resetCamera();
//rwi.render();
打破
案例“w”:
案例“W”:
//ac=callData.pokedrender.getActors();
//ac.forEach((anActor)=>{
//anActor.getProperty().SetRepresentationToDirectFrame();
// });
//rwi.render();
//中断;
打破
案例s:
案例S:
//ac=callData.pokedrender.getActors();
//ac.forEach((anActor)=>{
//anActor.getProperty().setRepresentationToSurface();
// });
//rwi.render();
打破
案例“v”:
案例“V”:
//ac=callData.pokedrender.getActors();
//ac.forEach((anActor)=>{
//anActor.getProperty().setRepresentationToPoints();
// });
//rwi.render();
打破
违约:
打破
}
};
//fullScreenRenderer.getInteractor().setInteractorStyle(interactorstyle);
//管道
const cone=vtk.Filters.Sources.vtkConeSource.newInstance();
const actor=vtk.Rendering.Core.vtkActor.newInstance();
const mapper=vtk.Rendering.Core.vtkMapper.newInstance();
actor.setMapper(mapper);
setInputConnection(cone.getOutputPort());
addActor(actor);
//const LUT=vtk.Common.Core.vtkLookUpTable.newInstance();
//渲染
resetCamera();
renderWindow.render();

< />代码> 我不知道<强> js,但是C++中我必须重写交互类,因为我需要去掉这些加速器。
例如,为了从vtkInteractorStyleTrackballCamera中去掉加速器,我重写了这个类,并重写了键盘处理程序。

下面是一个示例实现

您需要创建一个自定义的交互器样式来实现这一点。 子类化interactor样式,通过重写“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);