mode
本文回答:
mapcadLayer.setMode / toggleMode / getMode / setModeToggleShortcut—— 编辑 / 浏览双模式切换(已对照vjmapext.d.ts与运行时核实)。
一、真实模式只有两个:edit | browse
type MapCadLayerMode = 'edit' | 'browse'
edit(默认):绘图/编辑/夹点全可用。browse:只读浏览——不存在view/admin/inspector等第三档。
切到 browse 时框架自动做三件事(setMode 内部):
inputManager.cancelCurrentInput()—— 取消正在进行的命令/输入;store.clearSelection()—— 清空选集;- 刷新显示级过滤 +
renderPipeline.forceFullRender(),并发mode:changed事件。
browse 下的实际约束:
gripManager.getActiveGrips()直接返回[]→ 不显示夹点;- 输入管理器
isBrowseMode()为 true → 绘制/编辑命令的输入流程被挡(属性面板里 "Display level (browse mode only)" 类选项也只在这时出现); - 实体拾取/框选输入被抑制。
二、切换 / 读取
mapcadLayer.setMode('browse'); // 只读
mapcadLayer.setMode('edit'); // 恢复编辑
mapcadLayer.toggleMode(); // edit ↔ browse 往返
const cur = mapcadLayer.getMode(); // 'edit' | 'browse'
切换快捷键(默认 UI 有「Mode: {shortcut}」工具条提示):
mapcadLayer.setModeToggleShortcut('ctrl+e'); // 传 null 取消
模式切换键就是
ShortcutMap里的modeToggle动作(默认'ctrl+shift+e'):setModeToggleShortcut(k)与setShortcuts({ modeToggle: k })完全等价,getShortcuts().modeToggle可读回(见 shortcuts)。
三、事件
mapcadLayer.eventBus.on('mode:changed', ({ mode }) => {
console.log('当前模式:', mode); // payload 是 { mode },不是 {from,to}
myToolbar.update(mode === 'edit'); // 你自己的工具栏按它启用/禁用
});
四、UI 层典型用法
mapcadLayer.eventBus.on('mode:changed', ({ mode }) => {
const editing = mode === 'edit';
document.querySelector('#tool-draw').style.display = editing ? '' : 'none';
document.querySelector('#tool-edit').style.display = editing ? '' : 'none';
});
mapcadLayer.setMode(userHasEditPermission ? 'edit' : 'browse');
五、没有「按模式过滤命令」注册项
commandRegistry.register(name, cmdClass, description?) 只收 3 个参数,没有 modes 选项。要在浏览模式拦命令,两条路:
- 依赖框架自带行为:browse 态输入被抑制,绘图/编辑命令走不下去;
- 自定义命令自己拦:
CommandContext没有layer字段,在注册处闭包持有 layer 引用再判:
const layer = mapcadLayer;
class GuardedCmd {
async main(ctx) { // 实例方法,不能写 static
if (layer.getMode() === 'browse') return;
// ...
}
}
layer.commandRegistry.register('GUARDED', GuardedCmd);
六、mode 不是权限系统
| 层 | 作用 | 例 |
|---|---|---|
| mode | 前端 UX | 禁按钮 / 禁夹点 / 拦命令输入 |
| 后端权限 | 数据层 | 拒 save / 拒导出 |
不要依赖 mode 做安全——控制台 mapcadLayer.setMode('edit') 即可绕过;真正的权限必须在服务端校验。
七、常见坑
- 切 browse 后工具栏按钮仍亮:忘了监听
mode:changed;payload 键是mode(新值),没有from/to。 - 以为有
view/admin档:只有edit/browse两值;setMode('admin')不会报错(模式是字符串)但等效于非 browse——语义上不要这么用。 - browse 下夹点消失当 bug:设计如此(
getActiveGrips对 browse 返回[])。 - 多 MapCadLayer 共用 mode? 每个 layer 各存各的
_mode,互不影响。
相关
- 命令系统 → overview
- 快捷键 → shortcuts
- 事件 → event/bus-command-mode