Files
bim_engine/src/managers/section-axis-dialog-manager.ts
2026-04-20 10:38:42 +08:00

149 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 轴向剖切对话框管理器
* 负责管理轴向剖切工具对话框的显示、隐藏和剖切面板的交互
*/
import { BaseDialogManager } from '../core/base-dialog-manager';
import { ManagerRegistry } from '../core/manager-registry';
import { SectionAxisPanel } from '../components/section-axis-panel';
import type { SectionAxis } from '../components/section-axis-panel/types';
/**
* 轴向剖切对话框管理器
* 继承自 BaseDialogManager提供 X/Y/Z 轴向剖切的对话框管理功能
*/
export class SectionAxisDialogManager extends BaseDialogManager {
/** 轴向剖切面板实例 */
private panel: SectionAxisPanel | null = null;
constructor(registry: ManagerRegistry) {
super(registry);
}
/** 对话框唯一标识 */
protected get dialogId(): string {
return 'section-axis-dialog';
}
/** 对话框标题(国际化 key */
protected get dialogTitle(): string {
return 'sectionAxis.dialogTitle';
}
/** 对话框宽度 */
protected get dialogWidth(): number {
return 240;
}
/**
* 获取对话框位置
* 定位在容器右下角
*/
protected getDialogPosition(): { x: number; y: number } {
const container = this.registry.container;
if (!container) return { x: 100, y: 100 };
const containerWidth = container.clientWidth;
const containerHeight = container.clientHeight;
const paddingRight = 20;
const paddingBottom = 50;
return {
x: containerWidth - this.dialogWidth - paddingRight,
y: containerHeight - paddingBottom - 200
};
}
/**
* 创建对话框内容
* 初始化轴向剖切面板并设置回调
*/
protected createContent(): HTMLElement {
this.panel = new SectionAxisPanel({
defaultAxis: 'x',
defaultHidden: false,
defaultFill: this.engineComponent?.getFillCutFace() ?? false,
onHideToggle: (isHidden) => {
console.log('[SectionAxisDialogManager] 隐藏切换:', isHidden);
if (isHidden) {
this.engineComponent?.hideSection();
} else {
this.engineComponent?.recoverSection();
}
},
onFillToggle: (isFilled) => {
this.engineComponent?.setFillCutFace(isFilled);
},
onReverse: () => {
this.engineComponent?.reverseSection();
},
onAxisChange: (axis) => {
console.log('[SectionAxisDialogManager] 切换轴向:', axis);
this.engineComponent?.activeSection(axis);
}
});
this.panel.init();
return this.panel.element;
}
/** 对话框创建后的回调,自适应高度 */
protected onDialogCreated(): void {
this.dialog?.fitHeight(false);
// 检查 Engine 是否已初始化
if (!this.engineComponent) {
console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.');
return;
}
// 自动激活默认轴向剖切X轴
this.engineComponent.activeSection('x');
}
/** 对话框关闭时的回调,取消工具栏按钮激活状态 */
protected onDialogClose(): void {
this.registry.toolbar?.setBtnActive('section-axis', false);
}
/** 销毁前的清理,销毁面板实例 */
protected onBeforeDestroy(): void {
this.engineComponent?.deactivateSection();
if (this.panel) {
this.panel.destroy();
this.panel = null;
}
}
/**
* 获取剖切面隐藏状态
* @returns 是否隐藏
*/
public getHiddenState(): boolean {
return this.panel?.getHiddenState() ?? false;
}
/**
* 设置剖切面隐藏状态
* @param isHidden 是否隐藏
*/
public setHiddenState(isHidden: boolean): void {
this.panel?.setHiddenState(isHidden);
}
/**
* 获取当前激活的剖切轴向
* @returns 当前轴向 'x' | 'y' | 'z'
*/
public getActiveAxis(): SectionAxis {
return this.panel?.getActiveAxis() ?? 'x';
}
/**
* 设置剖切轴向
* @param axis 目标轴向
*/
public setActiveAxis(axis: SectionAxis): void {
this.panel?.setActiveAxis(axis);
}
}