diff --git a/ScreenShot_2026-05-16_144953_084.png b/ScreenShot_2026-05-16_144953_084.png new file mode 100644 index 0000000..2161e39 Binary files /dev/null and b/ScreenShot_2026-05-16_144953_084.png differ diff --git a/ScreenShot_2026-05-16_154304_965.png b/ScreenShot_2026-05-16_154304_965.png new file mode 100644 index 0000000..6575b53 Binary files /dev/null and b/ScreenShot_2026-05-16_154304_965.png differ diff --git a/index.html b/index.html index cfb2019..0c0c205 100644 --- a/index.html +++ b/index.html @@ -509,11 +509,13 @@ if (result.code === 200) { console.log(result.data); sku = currentText; - const { placement_zone, enable_placement_zone } = result.data; + const { enable_placement_zone,wall_divisions } = result.data; // const {position_x, position_y, position_z} = data; - if (enable_placement_zone && placement_zone != undefined) { + if (enable_placement_zone && wall_divisions != undefined) { // await initPlacementZoneConfig(placement_zone); - await placementWall(); + console.log(wall_divisions); + + await placementWall(wall_divisions); } } @@ -824,17 +826,16 @@ }; - const placementWall = () => { + const placementWall = (walls) => { // 只清除旧的放置区域网格,不清除模型 kernel.dropZone.clearZones(); - - kernel.dropZone.updateDivisions({ - "前": 4, - "后": 1, - "左": 1, - "右": 1 - }); - + const divisions = walls.map(wall => ({ + name: wall.name, // 获取最后一个下划线后的部分 + divisions: wall.divisions + })) + console.log(divisions); + + kernel.dropZone.updateDivisions(divisions); // 显示放置区域 kernel.dropZone.show(); dropZoneVisible = true; diff --git a/src/babylonjs/AppDropZone.ts b/src/babylonjs/AppDropZone.ts index 0bcc0ca..862d05f 100644 --- a/src/babylonjs/AppDropZone.ts +++ b/src/babylonjs/AppDropZone.ts @@ -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): PlacementZoneInfo[] { + updateDivisions(divisions: Array<{ name: string; divisions: number }>): PlacementZoneInfo[] { if (!this.dropZoneConfig) { console.error('未设置放置区域配置数据,请先调用 setData'); return []; } + // 将数组转换为对象映射 + const divisionsMap: Record = {}; + divisions.forEach(item => { + divisionsMap[item.name] = item.divisions; + }); + + // 定义方向关键字映射(支持中英文) + const directionKeywords: Record = { + '前': ['前', '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(); diff --git a/src/kernel/Adapter.ts b/src/kernel/Adapter.ts index 0e9d4ca..b7650fa 100644 --- a/src/kernel/Adapter.ts +++ b/src/kernel/Adapter.ts @@ -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): any[] => { + updateDivisions: (divisions: Array<{ name: string; divisions: number }>): any[] => { return this.mainApp.appDropZone.updateDivisions(divisions); }, /**