bug修改完
This commit is contained in:
@ -35,11 +35,6 @@ export class AppDropZone {
|
||||
// 存储原始墙面配置(用于 updateDivisions 时恢复完整墙面列表)
|
||||
private originalWalls: WallConfig[] = [];
|
||||
|
||||
// 存储所有墙面的区域数据(持久化,不会被覆盖)
|
||||
private allWallZonesData: Map<string, PlacementZoneInfo[]> = new Map();
|
||||
// 当前激活显示的墙面名称集合(用于控制显示)
|
||||
private activeWallNames: Set<string> = new Set();
|
||||
|
||||
constructor(scene: Scene) {
|
||||
this.scene = scene;
|
||||
this.placementWall = new AppPlacementWall(scene);
|
||||
@ -111,7 +106,7 @@ export class AppDropZone {
|
||||
divisionsMap[item.name] = item.divisions;
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 匹配墙面名称(精确匹配)
|
||||
const matchWallName = (wallName: string): number | null => {
|
||||
// 提取墙面名称的最后部分(最后一个下划线之后)
|
||||
@ -126,8 +121,8 @@ export class AppDropZone {
|
||||
return null;
|
||||
};
|
||||
|
||||
// 更新配置中的墙面分割数,从原始配置中恢复墙面列表
|
||||
this.dropZoneConfig.walls = this.originalWalls
|
||||
// 从原始配置中筛选出本次要更新的墙面
|
||||
const newWalls = this.originalWalls
|
||||
.map(wall => {
|
||||
const newDivisions = matchWallName(wall.name);
|
||||
|
||||
@ -136,24 +131,35 @@ export class AppDropZone {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
...wall,
|
||||
divisions: newDivisions
|
||||
};
|
||||
})
|
||||
.filter(wall => wall !== null) as typeof this.dropZoneConfig.walls; // 过滤掉未配置的墙面
|
||||
.filter(wall => wall !== null) as WallConfig[];
|
||||
|
||||
// 合并到现有配置中(保留其他墙面,更新/添加本次传入的墙面)
|
||||
// 先过滤掉 divisions 为 0 或未设置的墙面(避免初始状态污染)
|
||||
const existingWallsMap = new Map(
|
||||
this.dropZoneConfig.walls
|
||||
.filter(w => w.divisions && w.divisions > 0) // 只保留有效的墙面配置
|
||||
.map(w => [w.name, w])
|
||||
);
|
||||
newWalls.forEach(wall => {
|
||||
existingWallsMap.set(wall.name, wall);
|
||||
});
|
||||
this.dropZoneConfig.walls = Array.from(existingWallsMap.values());
|
||||
|
||||
// 更新 wallDivisionsMap(重要:用于后续的自动排列和拖拽检查)
|
||||
this.dropZoneConfig.walls.forEach(wall => {
|
||||
this.wallDivisionsMap.set(wall.name, wall.divisions);
|
||||
});
|
||||
|
||||
// 清除旧的放置区域网格(不清除模型)
|
||||
this.clearZones();
|
||||
|
||||
// 重新生成放置区域
|
||||
const zones = this.generateDropZones();
|
||||
// 只生成本次传入的墙面(不生成所有墙面)
|
||||
const zones = this.placementWall.generatePlacementAreas({
|
||||
...this.dropZoneConfig,
|
||||
walls: newWalls // 只传入本次要更新的墙面
|
||||
});
|
||||
|
||||
// 显示放置区域
|
||||
this.show();
|
||||
@ -462,8 +468,8 @@ export class AppDropZone {
|
||||
*/
|
||||
show(): void {
|
||||
// this.placementWall.show();
|
||||
// // 禁用所有已放置模型的拾取
|
||||
// this.setModelsPickable(false);
|
||||
// 禁用所有已放置模型的拾取
|
||||
this.setModelsPickable(false);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -506,6 +512,12 @@ export class AppDropZone {
|
||||
* 清除所有放置区域(只清除网格,不清除模型)
|
||||
*/
|
||||
clearZones(): void {
|
||||
// 清除映射(不删除模型,只清空记录)
|
||||
this.zoneModelMap.clear();
|
||||
this.wallDivisionsMap.clear();
|
||||
this.wallModelDivisionsMap.clear();
|
||||
|
||||
// 清除放置区域的 mesh
|
||||
this.placementWall.clearAll();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user