# 右键菜单功能对接 ## TL;DR > **Quick Summary**: 对接右键菜单的构件操作功能,包括隐藏、半透明、隔离、显示全部,以及新增"快速选择"子菜单。 > > **Deliverables**: > - 国际化文件更新(types.ts, zh-CN.ts, en-US.ts) > - Engine 层新增 8 个方法 > - EngineManager 层新增 8 个代理方法 > - 右键菜单 handler 实现功能调用 > > **Estimated Effort**: Short (约 30 分钟) > **Parallel Execution**: NO - sequential > **Critical Path**: Task 1 → Task 2 → Task 3 → Task 4 --- ## Context ### Original Request 对接右键菜单的以下功能: 1. 隐藏选中构件:`engine.modelToolModule.hideModel(engine.engineStatus.highlightModels)` 2. 半透明选中构件:`engine.modelToolModule.translucentModel(engine.engineStatus.highlightModels)` 3. 隔离/隐藏其他构件:`engine.modelToolModule.isolateModel(engine.engineStatus.highlightModels)` 4. 隔离/半透明其他构件:`engine.modelToolModule.translucentOtherModel(engine.engineStatus.highlightModels)` 5. 显示所有模型:`engine.modelToolModule.showAllModels()` 新增快速选择子菜单: 6. 选择同类模型:`engine.modelToolModule.batchSelectSameTypeModel(engine.engineStatus.highlightModels)` 7. 选择同层模型:`engine.modelToolModule.batchSelectSameLevelModel(engine.engineStatus.highlightModels)` 8. 选择同层同类模型:`engine.modelToolModule.batchSelectSameLevelTypeModel(engine.engineStatus.highlightModels)` ### 底层 API 模式 ```typescript // 获取选中构件 const models = engine.engineStatus.highlightModels; // 调用 modelToolModule 方法 engine.modelToolModule.hideModel(models); engine.modelToolModule.translucentModel(models); engine.modelToolModule.isolateModel(models); engine.modelToolModule.translucentOtherModel(models); engine.modelToolModule.showAllModels(); engine.modelToolModule.batchSelectSameTypeModel(models); engine.modelToolModule.batchSelectSameLevelModel(models); engine.modelToolModule.batchSelectSameLevelTypeModel(models); ``` --- ## Work Objectives ### Core Objective 将底层引擎的构件操作 API 对接到右键菜单,实现完整的构件隐藏、半透明、隔离和快速选择功能。 ### Concrete Deliverables - `src/locales/types.ts` - 添加 4 个新字段 - `src/locales/zh-CN.ts` - 添加中文翻译 - `src/locales/en-US.ts` - 添加英文翻译 - `src/components/engine/index.ts` - 添加 8 个方法 - `src/managers/engine-manager.ts` - 添加 8 个代理方法 + 更新右键菜单 handler ### Definition of Done - [x] 右键选中构件时,所有菜单功能可正常调用 - [x] 快速选择子菜单正确显示三个选项 - [x] 构建成功:`npm run build` ### Must Have - 所有 8 个底层 API 都要对接 - 国际化支持中英文 - 保持现有代码风格 ### Must NOT Have (Guardrails) - 不要修改底层引擎 API - 不要添加额外的 UI 组件 - 不要修改菜单的显示逻辑 --- ## Verification Strategy ### Test Decision - **Infrastructure exists**: NO - **User wants tests**: Manual-only - **QA approach**: Manual verification --- ## TODOs - [x] 1. 更新国际化文件 **What to do**: 1. 在 `src/locales/types.ts` 的 `menu` 对象中添加: ```typescript quickSelect: string; selectSameType: string; selectSameLevel: string; selectSameLevelType: string; ``` 2. 在 `src/locales/zh-CN.ts` 的 `menu` 对象中添加: ```typescript quickSelect: '快速选择', selectSameType: '选择同类模型', selectSameLevel: '选择同层模型', selectSameLevelType: '选择同层同类模型' ``` 3. 在 `src/locales/en-US.ts` 的 `menu` 对象中添加: ```typescript quickSelect: 'Quick Select', selectSameType: 'Select Same Type', selectSameLevel: 'Select Same Level', selectSameLevelType: 'Select Same Level & Type' ``` **Must NOT do**: - 不要修改其他现有字段 **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [`coding-standards`] **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 2, 3, 4 - **Blocked By**: None **References**: - `src/locales/types.ts:53-64` - 现有 menu 类型定义 - `src/locales/zh-CN.ts:34-45` - 现有中文翻译 - `src/locales/en-US.ts:34-45` - 现有英文翻译 **Acceptance Criteria**: - [ ] TypeScript 无类型错误 - [ ] 三个文件都已更新 **Commit**: NO (与 Task 2-4 一起提交) --- - [x] 2. Engine 层添加构件操作方法 **What to do**: 在 `src/components/engine/index.ts` 中添加以下 8 个公共方法(在路径漫游区域之后、destroy 之前): ```typescript // ==================== 构件操作 ==================== /** * 隐藏选中构件 */ public hideSelectedModels(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot hide models: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.hideModel(models); } } /** * 半透明选中构件 */ public translucentSelectedModels(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot translucent models: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.translucentModel(models); } } /** * 隔离选中构件(隐藏其他) */ public isolateSelectedModels(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot isolate models: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.isolateModel(models); } } /** * 半透明其他构件 */ public translucentOtherModels(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot translucent other models: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.translucentOtherModel(models); } } /** * 显示所有模型 */ public showAllModels(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot show all models: engine not initialized.'); return; } this.engine.modelToolModule.showAllModels(); } /** * 批量选择同类模型 */ public batchSelectSameTypeModel(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot batch select: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.batchSelectSameTypeModel(models); } } /** * 批量选择同层模型 */ public batchSelectSameLevelModel(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot batch select: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.batchSelectSameLevelModel(models); } } /** * 批量选择同层同类模型 */ public batchSelectSameLevelTypeModel(): void { if (!this._isInitialized || !this.engine?.modelToolModule) { console.warn('[Engine] Cannot batch select: engine not initialized.'); return; } const models = this.engine.engineStatus?.highlightModels; if (models) { this.engine.modelToolModule.batchSelectSameLevelTypeModel(models); } } // ==================== 结束:构件操作 ==================== ``` **Must NOT do**: - 不要修改现有方法 - 不要修改 `fitSectionBoxToModel` 方法 **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [`coding-standards`] **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 3 - **Blocked By**: Task 1 **References**: - `src/components/engine/index.ts:496-506` - `fitSectionBoxToModel` 参考模式(使用 highlightModels) - `src/components/engine/index.ts:431-491` - 路径漫游方法区域(在此之后添加) **Acceptance Criteria**: - [ ] 8 个方法都已添加 - [ ] 方法有 JSDoc 注释 - [ ] 使用项目规范的区域注释标记 **Commit**: NO (与其他 Task 一起提交) --- - [x] 3. EngineManager 添加代理方法 **What to do**: 在 `src/managers/engine-manager.ts` 中添加 8 个代理方法(在路径漫游区域之后、destroy 之前): ```typescript // ==================== 构件操作 ==================== /** * 隐藏选中构件 */ public hideSelectedModels(): void { this.engineInstance?.hideSelectedModels(); } /** * 半透明选中构件 */ public translucentSelectedModels(): void { this.engineInstance?.translucentSelectedModels(); } /** * 隔离选中构件(隐藏其他) */ public isolateSelectedModels(): void { this.engineInstance?.isolateSelectedModels(); } /** * 半透明其他构件 */ public translucentOtherModels(): void { this.engineInstance?.translucentOtherModels(); } /** * 显示所有模型 */ public showAllModels(): void { this.engineInstance?.showAllModels(); } /** * 批量选择同类模型 */ public batchSelectSameTypeModel(): void { this.engineInstance?.batchSelectSameTypeModel(); } /** * 批量选择同层模型 */ public batchSelectSameLevelModel(): void { this.engineInstance?.batchSelectSameLevelModel(); } /** * 批量选择同层同类模型 */ public batchSelectSameLevelTypeModel(): void { this.engineInstance?.batchSelectSameLevelTypeModel(); } // ==================== 结束:构件操作 ==================== ``` **Must NOT do**: - 不要修改现有方法 **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [`coding-standards`] **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential - **Blocks**: Task 4 - **Blocked By**: Task 2 **References**: - `src/managers/engine-manager.ts:431-492` - 路径漫游代理方法区域 **Acceptance Criteria**: - [ ] 8 个代理方法都已添加 - [ ] 方法有 JSDoc 注释 **Commit**: NO (与其他 Task 一起提交) --- - [x] 4. 更新右键菜单 Handler **What to do**: 在 `src/managers/engine-manager.ts` 的 `registerHandler` 回调中: 1. **替换隐藏选中构件的 onClick**(约第 78-81 行): ```typescript onClick: () => { this.hideSelectedModels(); this.rightKey?.hide(); } ``` 2. **替换半透明选中构件的 onClick**(约第 90-93 行): ```typescript onClick: () => { this.translucentSelectedModels(); this.rightKey?.hide(); } ``` 3. **替换隔离-隐藏其他的 onClick**(约第 107-110 行): ```typescript onClick: () => { this.isolateSelectedModels(); this.rightKey?.hide(); } ``` 4. **替换隔离-半透明其他的 onClick**(约第 114-117 行): ```typescript onClick: () => { this.translucentOtherModels(); this.rightKey?.hide(); } ``` 5. **替换显示全部的 onClick**(约第 142-144 行): ```typescript onClick: () => { this.showAllModels(); this.rightKey?.hide(); } ``` 6. **在隔离选中构件菜单项之后(order: 4 之后),添加快速选择子菜单**(order: 5,将剖切盒适应改为 order: 6,显示全部改为 order: 7): ```typescript // 5. 快速选择(带子菜单) items.push({ id: 'quickSelect', label: 'menu.quickSelect', group: 'component', order: 5, children: [ { id: 'selectSameType', label: 'menu.selectSameType', onClick: () => { this.batchSelectSameTypeModel(); this.rightKey?.hide(); } }, { id: 'selectSameLevel', label: 'menu.selectSameLevel', onClick: () => { this.batchSelectSameLevelModel(); this.rightKey?.hide(); } }, { id: 'selectSameLevelType', label: 'menu.selectSameLevelType', onClick: () => { this.batchSelectSameLevelTypeModel(); this.rightKey?.hide(); } } ] }); ``` 7. **更新剖切盒适应的 order 为 6** 8. **更新显示全部的 order 为 7** **Must NOT do**: - 不要修改菜单项的 id 和 label(除了新增的) - 不要修改 group 分组逻辑 **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [`coding-standards`] **Parallelization**: - **Can Run In Parallel**: NO - **Parallel Group**: Sequential (final task) - **Blocks**: None - **Blocked By**: Task 3 **References**: - `src/managers/engine-manager.ts:53-149` - 现有右键菜单 handler - `src/managers/engine-manager.ts:96-121` - 隔离子菜单结构参考 **Acceptance Criteria**: - [ ] 所有 console.log 占位符已替换为实际方法调用 - [ ] 快速选择子菜单正确添加 - [ ] 菜单项 order 正确排序 **Commit**: YES - Message: `feat(menu): implement right-click menu functions for model operations` - Files: - `src/locales/types.ts` - `src/locales/zh-CN.ts` - `src/locales/en-US.ts` - `src/components/engine/index.ts` - `src/managers/engine-manager.ts` - Pre-commit: `npm run build` --- - [x] 5. 构建验证 **What to do**: - 运行 `npm run build` 确保构建成功 **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] **Parallelization**: - **Can Run In Parallel**: NO - **Blocks**: None - **Blocked By**: Task 4 **Acceptance Criteria**: ```bash npm run build # 预期: 构建成功,无错误 ``` **Commit**: NO --- ## Commit Strategy | After Task | Message | Files | Verification | |------------|---------|-------|--------------| | 4 | `feat(menu): implement right-click menu functions for model operations` | types.ts, zh-CN.ts, en-US.ts, engine/index.ts, engine-manager.ts | npm run build | --- ## Success Criteria ### Verification Commands ```bash npm run build # Expected: Build successful ``` ### Final Checklist - [x] 国际化文件已更新(3 个文件) - [x] Engine 层添加 8 个方法 - [x] EngineManager 层添加 8 个代理方法 - [x] 右键菜单 handler 已更新 - [x] 快速选择子菜单已添加 - [x] 构建成功