This commit is contained in:
2026-05-16 20:04:02 +08:00
parent 34d5643bf3
commit f76b19697c
5 changed files with 234 additions and 206 deletions

View File

@ -83,15 +83,21 @@ export class AppDropZone {
/**
* 更新墙面分割数并重新生成放置区域
* @param divisions 分割数数组,每个元素包含 name方向标识:前/后/左/右)和 divisions分割数
* @param divisions 分割数数组,每个元素包含 name墙面名称或方向标识)和 divisions分割数
* @example
* // 方式1精确匹配墙面名称推荐
* updateDivisions([
* { name: "前1", divisions: 1 },
* { name: "前2", divisions: 2 },
* { name: "左", divisions: 3 },
* { name: "右", divisions: 4 }
* ])
*
* // 方式2模糊匹配方向兼容旧版
* updateDivisions([
* { name: "前", divisions: 4 },
* { name: "后", divisions: 1 },
* { name: "左", divisions: 1 },
* { name: "右", divisions: 1 }
* { name: "后", divisions: 1 }
* ])
* 支持模糊匹配:墙面名称中包含"前"、"后"、"左"、"右"等关键字即可匹配
*/
updateDivisions(divisions: Array<{ name: string; divisions: number }>): PlacementZoneInfo[] {
if (!this.dropZoneConfig) {
@ -113,31 +119,42 @@ export class AppDropZone {
'右': ['右', 'right', 'you']
};
// 匹配墙面名称到方向
const matchDirection = (wallName: string): string | null => {
// 匹配墙面名称(支持精确匹配和模糊匹配)
const matchWallName = (wallName: string): number | null => {
// 1. 优先精确匹配完整墙面名称
// 例如wall.name = "80全铁3x6_前1"divisions 中有 "前1"
for (const [configName, divisionValue] of Object.entries(divisionsMap)) {
if (wallName.includes(configName)) {
return divisionValue;
}
}
// 2. 如果精确匹配失败,尝试方向模糊匹配(兼容旧版)
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;
// 检查 divisionsMap 中是否有该方向的配置
if (divisionsMap[direction] !== undefined) {
return divisionsMap[direction];
}
}
}
}
return null;
};
// 更新配置中的墙面分割数
this.dropZoneConfig.walls = this.dropZoneConfig.walls.map(wall => {
const direction = matchDirection(wall.name);
const newDivisions = direction && divisionsMap[direction] !== undefined
? divisionsMap[direction]
: wall.divisions || 1;
const newDivisions = matchWallName(wall.name);
const finalDivisions = newDivisions !== null ? newDivisions : (wall.divisions || 1);
console.log(`墙面 "${wall.name}" 匹配到方向: ${direction}, 分割数: ${newDivisions}`);
console.log(`墙面 "${wall.name}" 匹配到分割数: ${finalDivisions}`);
return {
...wall,
divisions: newDivisions
divisions: finalDivisions
};
});