iTwin 修改快捷键
默认快捷键定义在IdleTool里 itwinjs-core\core\frontend\src\tools\IdleTool.ts可以看到itwinjs的默认快捷键的介绍* - Mouse/keyboard: * - mmb: pan * - shift-mmb: rotate * - wheel: zoom in/out * - double-mmb: fit view * - Touch: * - single-finger drag: rotate * - two-finger drag: pan * - pinch: zoom in/out * - double-tap: fit view鼠标中键Panshift鼠标中键Rotate滚轮Zoom in / outCtrl 鼠标中键: View.Look 或 View.Scroll自定义快捷键需求鼠标左键拖拽改为Pan鼠标中键改为Rotate同时要求单击选择扩展IdleToolimport { IModelApp, IdleTool, BeButton, BeButtonEvent, BeTouchEvent, BeWheelEvent, EventHandled, ViewHandleType, ViewManip, HitDetail, LocateResponse, } from itwin/core-frontend; export class MyIdleTool extends IdleTool { public static override toolId MyIdle; public static override hidden true; public allowOutsideProjectExtents: boolean true; public override async onDataButtonUp(ev: BeButtonEvent): PromiseEventHandled { if (undefined ev.viewport) return EventHandled.No; if (this.allowOutsideProjectExtents) { const hit await IModelApp.locateManager.doLocate(new LocateResponse(), true, ev.point, ev.viewport, ev.inputSource); if (hit?.isElementHit) { const viewport ev.viewport; viewport.iModel.selectionSet.replace(hit.sourceId); } } // ev.point is the current world coordinate point adjusted for snap and locks this.onReinitialize().catch(() { }); // Calls onRestartTool to exit return EventHandled.No; } // 拖拽事件全程在Idle监听左键拖拽直接启动Pan平移 public override async onMouseStartDrag(ev: BeButtonEvent): PromiseEventHandled { if (!ev.viewport) return EventHandled.No; let toolId: string; let handleId: ViewHandleType; switch (ev.button) { case BeButton.Data: // 左键拖拽固定为视图平移Pan toolId View.Pan; handleId ViewHandleType.Pan; break; case BeButton.Middle: // 保留原有中键逻辑 if (ev.isControlKey) { toolId ev.viewport.view.allow3dManipulations() ? View.Look : View.Scroll; handleId ev.viewport.view.allow3dManipulations() ? ViewHandleType.Look : ViewHandleType.Scroll; } else { toolId View.Rotate; handleId ViewHandleType.Rotate; } break; default: toolId View.Pan; handleId ViewHandleType.Pan; break; } const currViewTool IModelApp.toolAdmin.viewTool; if (currViewTool currViewTool instanceof ViewManip) { return currViewTool.startHandleDrag(ev, handleId); } const viewManipTool IModelApp.tools.create(toolId, ev.viewport, true, true) as ViewManip | undefined; if (viewManipTool await viewManipTool.run()) { return viewManipTool.startHandleDrag(ev, handleId); } return EventHandled.No; } public override async onMouseWheel(ev: BeWheelEvent): PromiseEventHandled { return super.onMouseWheel(ev); } public override async onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): PromiseEventHandled { return super.onTouchMoveStart(ev, startEv); } public override async onTouchTap(ev: BeTouchEvent): PromiseEventHandled { return super.onTouchTap(ev); } }初始化IModelApp.toolAdmin.idleTool new MyIdleTool(); IModelApp.toolAdmin.defaultToolId View.Pan;