This commit is contained in:
2026-05-16 15:48:04 +08:00
parent 25c193b35a
commit 98c1c46728
5 changed files with 71 additions and 21 deletions

View File

@ -83,19 +83,63 @@ export class AppDropZone {
/**
* 更新墙面分割数并重新生成放置区域
* @param divisions 分割数对象key 为墙面名称value 为分割数,例如 { "前": 4, "后": 1, "左": 1, "右": 1 }
* @param divisions 分割数数组,每个元素包含 name方向标识前/后/左/右)和 divisions分割数
* @example
* updateDivisions([
* { name: "前", divisions: 4 },
* { name: "后", divisions: 1 },
* { name: "左", divisions: 1 },
* { name: "右", divisions: 1 }
* ])
* 支持模糊匹配:墙面名称中包含"前"、"后"、"左"、"右"等关键字即可匹配
*/
updateDivisions(divisions: Record<string, number>): PlacementZoneInfo[] {
updateDivisions(divisions: Array<{ name: string; divisions: number }>): PlacementZoneInfo[] {
if (!this.dropZoneConfig) {
console.error('未设置放置区域配置数据,请先调用 setData');
return [];
}
// 将数组转换为对象映射
const divisionsMap: Record<string, number> = {};
divisions.forEach(item => {
divisionsMap[item.name] = item.divisions;
});
// 定义方向关键字映射(支持中英文)
const directionKeywords: Record<string, string[]> = {
'前': ['前', 'front', 'qian'],
'后': ['后', 'back', 'hou'],
'左': ['左', 'left', 'zuo'],
'右': ['右', 'right', 'you']
};
// 匹配墙面名称到方向
const matchDirection = (wallName: string): string | null => {
const lowerName = wallName.toLowerCase();
for (const [direction, keywords] of Object.entries(directionKeywords)) {
for (const keyword of keywords) {
if (lowerName.includes(keyword.toLowerCase()) || wallName.includes(keyword)) {
return direction;
}
}
}
return null;
};
// 更新配置中的墙面分割数
this.dropZoneConfig.walls = this.dropZoneConfig.walls.map(wall => ({
...wall,
divisions: divisions[wall.name] !== undefined ? divisions[wall.name] : wall.divisions || 1
}));
this.dropZoneConfig.walls = this.dropZoneConfig.walls.map(wall => {
const direction = matchDirection(wall.name);
const newDivisions = direction && divisionsMap[direction] !== undefined
? divisionsMap[direction]
: wall.divisions || 1;
console.log(`墙面 "${wall.name}" 匹配到方向: ${direction}, 分割数: ${newDivisions}`);
return {
...wall,
divisions: newDivisions
};
});
// 清除旧的放置区域网格(不清除模型)
this.clearZones();

View File

@ -325,11 +325,16 @@ export class KernelAdapter {
},
/**
* 更新墙面分割数并重新生成放置区域
* @param divisions 分割数对象key 为墙面名称value 为分割数
* @param divisions 分割数数组,每个元素包含 name方向标识前/后/左/右)和 divisions分割数
* @example
* kernel.dropZone.updateDivisions({ "前": 4, "后": 1, "左": 1, "右": 1 });
* kernel.dropZone.updateDivisions([
* { name: "前", divisions: 4 },
* { name: "后", divisions: 1 },
* { name: "左", divisions: 1 },
* { name: "右", divisions: 1 }
* ]);
*/
updateDivisions: (divisions: Record<string, number>): any[] => {
updateDivisions: (divisions: Array<{ name: string; divisions: number }>): any[] => {
return this.mainApp.appDropZone.updateDivisions(divisions);
},
/**