136 lines
3.7 KiB
TypeScript
136 lines
3.7 KiB
TypeScript
|
|
import { BimComponent } from '../core/component';
|
|||
|
|
import { BimEngine } from '../bim-engine';
|
|||
|
|
import { BimDialog } from '../components/dialog';
|
|||
|
|
import { SectionAxisPanel } from '../components/section-axis-panel';
|
|||
|
|
import type { SectionAxis } from '../components/section-axis-panel/types';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 轴向剖切弹窗管理器
|
|||
|
|
*/
|
|||
|
|
export class SectionAxisDialogManager extends BimComponent {
|
|||
|
|
private dialogId = 'section-axis-dialog';
|
|||
|
|
private dialog: BimDialog | null = null;
|
|||
|
|
private panel: SectionAxisPanel | null = null;
|
|||
|
|
|
|||
|
|
constructor(engine: BimEngine) {
|
|||
|
|
super(engine);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public init(): void {
|
|||
|
|
// 可以在这里监听事件
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 显示弹窗
|
|||
|
|
*/
|
|||
|
|
public show(): void {
|
|||
|
|
if (!this.engine.dialog || !this.engine.container) {
|
|||
|
|
console.warn('Dialog manager or container is not initialized');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 如果已打开,先销毁
|
|||
|
|
this.destroy();
|
|||
|
|
|
|||
|
|
// 创建面板
|
|||
|
|
this.panel = new SectionAxisPanel({
|
|||
|
|
defaultAxis: 'x',
|
|||
|
|
defaultHidden: false,
|
|||
|
|
onHideToggle: (isHidden) => {
|
|||
|
|
console.log('[SectionAxisDialogManager] 隐藏切换:', isHidden);
|
|||
|
|
// TODO: 实现隐藏/显示剖切面的逻辑
|
|||
|
|
},
|
|||
|
|
onReverse: () => {
|
|||
|
|
console.log('[SectionAxisDialogManager] 反向剖切');
|
|||
|
|
// TODO: 实现反向剖切的逻辑
|
|||
|
|
},
|
|||
|
|
onAxisChange: (axis) => {
|
|||
|
|
console.log('[SectionAxisDialogManager] 切换轴向:', axis);
|
|||
|
|
// TODO: 实现轴向切换的逻辑
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.panel.init();
|
|||
|
|
|
|||
|
|
// 创建弹窗
|
|||
|
|
const dialogWidth = 240;
|
|||
|
|
const paddingRight = 20;
|
|||
|
|
const paddingBottom = 50;
|
|||
|
|
const container = this.engine.container;
|
|||
|
|
const containerWidth = container.clientWidth;
|
|||
|
|
const containerHeight = container.clientHeight;
|
|||
|
|
const x = containerWidth - dialogWidth - paddingRight;
|
|||
|
|
const y = containerHeight - paddingBottom - 200; // 临时y值,会被fitHeight调整
|
|||
|
|
|
|||
|
|
this.dialog = this.engine.dialog.create({
|
|||
|
|
id: this.dialogId,
|
|||
|
|
title: 'sectionAxis.dialogTitle',
|
|||
|
|
width: dialogWidth,
|
|||
|
|
height: 'auto', // 自动高度
|
|||
|
|
position: { x, y },
|
|||
|
|
draggable: true,
|
|||
|
|
resizable: false,
|
|||
|
|
content: this.panel.element,
|
|||
|
|
onClose: () => {
|
|||
|
|
this.engine.toolbar?.setBtnActive('section-axis', false);
|
|||
|
|
this.hide();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.dialog.init();
|
|||
|
|
|
|||
|
|
// 自适应高度
|
|||
|
|
this.dialog.fitHeight(false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 隐藏弹窗
|
|||
|
|
*/
|
|||
|
|
public hide(): void {
|
|||
|
|
this.destroy();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取隐藏状态
|
|||
|
|
*/
|
|||
|
|
public getHiddenState(): boolean {
|
|||
|
|
return this.panel?.getHiddenState() ?? false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置隐藏状态
|
|||
|
|
*/
|
|||
|
|
public setHiddenState(isHidden: boolean): void {
|
|||
|
|
this.panel?.setHiddenState(isHidden);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取当前激活的轴向
|
|||
|
|
*/
|
|||
|
|
public getActiveAxis(): SectionAxis {
|
|||
|
|
return this.panel?.getActiveAxis() ?? 'x';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置激活的轴向
|
|||
|
|
*/
|
|||
|
|
public setActiveAxis(axis: SectionAxis): void {
|
|||
|
|
this.panel?.setActiveAxis(axis);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 销毁弹窗和面板
|
|||
|
|
*/
|
|||
|
|
public destroy(): void {
|
|||
|
|
// 关闭弹窗
|
|||
|
|
if (this.dialog) {
|
|||
|
|
this.dialog.destroy();
|
|||
|
|
this.dialog = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 销毁面板
|
|||
|
|
if (this.panel) {
|
|||
|
|
this.panel.destroy();
|
|||
|
|
this.panel = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|