как отключить горячую клавишу 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);