feat(menu): implement right-click menu functions for model operations
- Add i18n translations for quick select menu (zh-CN, en-US) - Add 8 model operation methods to Engine layer - Add 8 proxy methods to EngineManager layer - Implement right-click menu handlers for hide/translucent/isolate/show all - Add quick select submenu (same type/level/level+type) - Replace console.log placeholders with actual API calls
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
* 3D 引擎管理器
|
||||
* 负责管理 3D 渲染引擎的初始化、模型加载和测量功能
|
||||
*/
|
||||
import { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine';
|
||||
import { Engine, type EngineOptions, type ModelLoadOptions, type EngineInfo } from '../components/engine';
|
||||
import { BaseManager } from '../core/base-manager';
|
||||
import { RightKeyManager } from './right-key-manager';
|
||||
import type { MeasureMode } from '../types/measure';
|
||||
@@ -76,7 +76,7 @@ export class EngineManager extends BaseManager {
|
||||
group: 'component',
|
||||
order: 2,
|
||||
onClick: () => {
|
||||
console.log('[Menu] 隐藏选中构件 - 暂未实现');
|
||||
this.hideSelectedModels();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
});
|
||||
@@ -88,7 +88,7 @@ export class EngineManager extends BaseManager {
|
||||
group: 'component',
|
||||
order: 3,
|
||||
onClick: () => {
|
||||
console.log('[Menu] 半透明选中构件 - 暂未实现');
|
||||
this.translucentSelectedModels();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
});
|
||||
@@ -105,7 +105,7 @@ export class EngineManager extends BaseManager {
|
||||
id: 'hideOthers',
|
||||
label: 'menu.hideOthers',
|
||||
onClick: () => {
|
||||
console.log('[Menu] 隔离 - 其他构件隐藏 - 暂未实现');
|
||||
this.isolateSelectedModels();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
},
|
||||
@@ -113,34 +113,68 @@ export class EngineManager extends BaseManager {
|
||||
id: 'transparentOthers',
|
||||
label: 'menu.transparentOthers',
|
||||
onClick: () => {
|
||||
console.log('[Menu] 隔离 - 其他构件半透明 - 暂未实现');
|
||||
this.translucentOtherModels();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// 5. 剖切盒适应
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// 6. 剖切盒适应
|
||||
items.push({
|
||||
id: 'fitSectionBox',
|
||||
label: 'menu.fitSectionBox',
|
||||
group: 'component',
|
||||
order: 5,
|
||||
order: 6,
|
||||
onClick: () => {
|
||||
console.log('[Menu] 剖切盒适应 - 暂未实现');
|
||||
this.fitSectionBoxToModel();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 6. 显示全部(始终显示)
|
||||
// 7. 显示全部(始终显示)
|
||||
items.push({
|
||||
id: 'showAll',
|
||||
label: 'menu.showAll',
|
||||
group: 'component',
|
||||
order: 6,
|
||||
order: 7,
|
||||
onClick: () => {
|
||||
console.log('[Menu] 显示全部 - 暂未实现');
|
||||
this.showAllModels();
|
||||
this.rightKey?.hide();
|
||||
}
|
||||
});
|
||||
@@ -326,6 +360,13 @@ export class EngineManager extends BaseManager {
|
||||
this.engineInstance.recoverSection();
|
||||
}
|
||||
|
||||
public fitSectionBoxToModel(): void {
|
||||
if (!this.engineInstance) {
|
||||
return;
|
||||
}
|
||||
this.engineInstance.fitSectionBoxToModel();
|
||||
}
|
||||
|
||||
/** 激活框选放大功能 */
|
||||
public activateZoomBox(): void {
|
||||
if (!this.engineInstance) {
|
||||
@@ -354,51 +395,24 @@ export class EngineManager extends BaseManager {
|
||||
this.engineInstance.deactivateFirstPersonMode();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置漫游移动速度
|
||||
* @param speed 移动速度
|
||||
*/
|
||||
public setWalkSpeed(speed: number): void {
|
||||
if (!this.engineInstance) {
|
||||
console.warn('[EngineManager] 3D Engine not initialized.');
|
||||
return;
|
||||
}
|
||||
this.engineInstance.setWalkSpeed(speed);
|
||||
this.engineInstance?.setWalkSpeed(speed);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置漫游重力开关
|
||||
* @param enabled 是否启用重力
|
||||
*/
|
||||
public setWalkGravity(enabled: boolean): void {
|
||||
if (!this.engineInstance) {
|
||||
console.warn('[EngineManager] 3D Engine not initialized.');
|
||||
return;
|
||||
}
|
||||
this.engineInstance.setWalkGravity(enabled);
|
||||
this.engineInstance?.setWalkGravity(enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置漫游碰撞检测开关
|
||||
* @param enabled 是否启用碰撞检测
|
||||
*/
|
||||
public setWalkCollision(enabled: boolean): void {
|
||||
if (!this.engineInstance) {
|
||||
console.warn('[EngineManager] 3D Engine not initialized.');
|
||||
return;
|
||||
}
|
||||
this.engineInstance.setWalkCollision(enabled);
|
||||
this.engineInstance?.setWalkCollision(enabled);
|
||||
}
|
||||
|
||||
public toggleMiniMap(): void {
|
||||
this.engineInstance?.toggleMiniMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取漫游模式是否激活
|
||||
* @returns 是否处于漫游模式
|
||||
*/
|
||||
public isFirstPersonModeActive(): boolean {
|
||||
if (!this.engineInstance) {
|
||||
return false;
|
||||
}
|
||||
return this.engineInstance.isFirstPersonModeActive();
|
||||
return this.engineInstance?.isFirstPersonModeActive() ?? false;
|
||||
}
|
||||
|
||||
// ==================== 结束:漫游功能 ====================
|
||||
@@ -443,8 +457,134 @@ export class EngineManager extends BaseManager {
|
||||
return this.engineInstance?.getMajorTreeData() ?? [];
|
||||
}
|
||||
|
||||
public getEngineInfo(): EngineInfo | null {
|
||||
return this.engineInstance?.getEngineInfo() ?? null;
|
||||
}
|
||||
// ==================== 结束:模型树 ====================
|
||||
|
||||
// ==================== 路径漫游 ====================
|
||||
|
||||
/**
|
||||
* 添加漫游点
|
||||
* 将当前相机位置添加为一个漫游点
|
||||
*/
|
||||
public pathRoamingAddPoint(): void {
|
||||
this.engineInstance?.pathRoamingAddPoint();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除指定索引的漫游点
|
||||
* @param index 要删除的漫游点索引
|
||||
*/
|
||||
public pathRoamingRemovePoint(index: number): void {
|
||||
this.engineInstance?.pathRoamingRemovePoint(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有漫游点
|
||||
*/
|
||||
public pathRoamingClearPoints(): void {
|
||||
this.engineInstance?.pathRoamingClearPoints();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有漫游点
|
||||
* @returns 漫游点数组
|
||||
*/
|
||||
public pathRoamingGetPoints(): any[] {
|
||||
return this.engineInstance?.pathRoamingGetPoints() ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳转到指定漫游点
|
||||
* @param index 目标漫游点索引
|
||||
*/
|
||||
public pathRoamingJumpToPoint(index: number): void {
|
||||
this.engineInstance?.pathRoamingJumpToPoint(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* 播放漫游
|
||||
* @param options 播放选项,包含时长、循环、回调等配置
|
||||
*/
|
||||
public pathRoamingPlay(options?: {
|
||||
duration?: number;
|
||||
loop?: boolean;
|
||||
onComplete?: () => void;
|
||||
onPointComplete?: (pointIndex: number) => void;
|
||||
}): void {
|
||||
this.engineInstance?.pathRoamingPlay(options);
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止漫游
|
||||
*/
|
||||
public pathRoamingStop(): void {
|
||||
this.engineInstance?.pathRoamingStop();
|
||||
}
|
||||
|
||||
// ==================== 结束:路径漫游 ====================
|
||||
|
||||
// ==================== 构件操作 ====================
|
||||
|
||||
/**
|
||||
* 隐藏选中构件
|
||||
*/
|
||||
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();
|
||||
}
|
||||
|
||||
// ==================== 结束:构件操作 ====================
|
||||
|
||||
/** 销毁引擎管理器 */
|
||||
public destroy(): void {
|
||||
if (this.engineInstance) {
|
||||
|
||||
Reference in New Issue
Block a user