diff --git a/index.html b/index.html index de80c03..cfb2019 100644 --- a/index.html +++ b/index.html @@ -507,12 +507,13 @@ const response = await fetch(`http://localhost:3001/api/product-configs/by-sku/${currentText}`); const result = await response.json(); if (result.code === 200) { - const { divisions, enable_placement_zone } = result.data; + console.log(result.data); + sku = currentText; + const { placement_zone, enable_placement_zone } = result.data; // const {position_x, position_y, position_z} = data; - if (enable_placement_zone) { - sku = currentText; - await placementWall(divisions); - //await initPlacementZoneConfig(divisions); + if (enable_placement_zone && placement_zone != undefined) { + // await initPlacementZoneConfig(placement_zone); + await placementWall(); } } @@ -795,8 +796,8 @@ }); // 初始化放置区域配置数据(只需设置一次) - const initPlacementZoneConfig = (divisions) => { - + const initPlacementZoneConfig = (placement_zone) => { + const { alpha, border_color, color, show_border, thickness, walls } = placement_zone // 只清除旧的放置区域网格,不清除模型 kernel.dropZone.clearZones(); // 调整 baseY 来控制整体高度(正数向上,负数向下) @@ -807,64 +808,32 @@ const wallOffset = -0.07; // 修改这个值来调整墙面偏移 kernel.dropZone.setData({ - walls: [ - { - name: 'front', - startPoint: [-1.82, baseY, -1.37], - endPoint: [1.87, baseY, -1.37], - height: height, - divisions: divisions, - offset: wallOffset // 向外或向内偏移 - }, - { - name: 'back', - startPoint: [1.87, baseY, 1.4], - endPoint: [-1.82, baseY, 1.4], - height: height, - divisions: divisions, - offset: wallOffset - }, - { - name: 'left', - startPoint: [-1.82, baseY, 1.4], - endPoint: [-1.82, baseY, -1.37], - height: height, - divisions: divisions, - offset: wallOffset - }, - { - name: 'right', - startPoint: [1.82, baseY, -1.37], - endPoint: [1.82, baseY, 1.4], - height: height, - divisions: divisions, - offset: wallOffset - } - ], - color: "#21c7ff", - alpha: 0.3, - thickness: 2, - showBorder: true, - borderColor: "#ffffff" + + color: color, + alpha: +alpha, + thickness: thickness, + showBorder: !show_border, + borderColor: border_color, + walls: walls }); - kernel.dropZone.generateDropZones(divisions); + kernel.dropZone.generateDropZones(); // 显示放置区域 kernel.dropZone.show(); dropZoneVisible = true; }; - const placementWall = (divisions) => { + const placementWall = () => { // 只清除旧的放置区域网格,不清除模型 kernel.dropZone.clearZones(); - // 如果传入了 divisions,使用统一分割数;否则使用每个墙面自己的分割数 - if (divisions !== undefined) { - kernel.dropZone.generateDropZones(divisions); - } else { - kernel.dropZone.generateDropZones(); - } + kernel.dropZone.updateDivisions({ + "前": 4, + "后": 1, + "左": 1, + "右": 1 + }); // 显示放置区域 kernel.dropZone.show(); diff --git a/index.js b/index.js index 9b95025..17e3e00 100644 --- a/index.js +++ b/index.js @@ -32,8 +32,16 @@ const data = await response.json() const models = data.data // 这就是模型列表 models.forEach(model => { - console.log(model); - // kernel.dropZone.setData(model.placement_zone); + const { alpha, border_color, color, show_border, thickness, walls } = model.placement_zone + kernel.dropZone.setData({ + + color: color, + alpha: +alpha, + thickness: thickness, + showBorder: !show_border, + borderColor: border_color, + walls: walls + }); kernel.model.add({ modelId: model.id, modelUrl: model.file_url, diff --git a/src/babylonjs/AppDropZone.ts b/src/babylonjs/AppDropZone.ts index 6ce8fe7..0bcc0ca 100644 --- a/src/babylonjs/AppDropZone.ts +++ b/src/babylonjs/AppDropZone.ts @@ -54,10 +54,9 @@ export class AppDropZone { /** * 生成放置区域 - * @param divisions 可选的统一分割数量,如果不传则使用每个墙面自己的 divisions * @param config 配置参数(可选,如果不传则使用 setData 设置的数据) */ - generateDropZones(divisions?: number, config?: DropZoneConfig): PlacementZoneInfo[] { + generateDropZones(config?: DropZoneConfig): PlacementZoneInfo[] { const finalConfig = config || this.dropZoneConfig; if (!finalConfig) { @@ -65,13 +64,12 @@ export class AppDropZone { return []; } - // 为墙面设置分割数 + // 为墙面设置分割数(使用每个墙面自己的 divisions,默认为 1) const configWithDivisions: DropZoneConfig = { ...finalConfig, // 保留所有配置属性(color, alpha, thickness, showBorder, borderColor) walls: finalConfig.walls.map(wall => ({ ...wall, - // 如果传入了统一的 divisions,使用它;否则使用墙面自己的 divisions;都没有则默认为 1 - divisions: divisions !== undefined ? divisions : (wall.divisions || 1) + divisions: wall.divisions || 1 })) }; @@ -83,6 +81,34 @@ export class AppDropZone { return this.placementWall.generatePlacementAreas(configWithDivisions); } + /** + * 更新墙面分割数并重新生成放置区域 + * @param divisions 分割数对象,key 为墙面名称,value 为分割数,例如 { "前": 4, "后": 1, "左": 1, "右": 1 } + */ + updateDivisions(divisions: Record): PlacementZoneInfo[] { + if (!this.dropZoneConfig) { + console.error('未设置放置区域配置数据,请先调用 setData'); + return []; + } + + // 更新配置中的墙面分割数 + this.dropZoneConfig.walls = this.dropZoneConfig.walls.map(wall => ({ + ...wall, + divisions: divisions[wall.name] !== undefined ? divisions[wall.name] : wall.divisions || 1 + })); + + // 清除旧的放置区域网格(不清除模型) + this.clearZones(); + + // 重新生成放置区域 + const zones = this.generateDropZones(); + + // 显示放置区域 + this.show(); + + return zones; + } + /** * 卸载指定墙面的所有模型(内部方法) */ diff --git a/src/kernel/Adapter.ts b/src/kernel/Adapter.ts index 167b723..0e9d4ca 100644 --- a/src/kernel/Adapter.ts +++ b/src/kernel/Adapter.ts @@ -316,15 +316,21 @@ export class KernelAdapter { }, /** * 生成放置区域(使用已存储的配置数据) - * @param divisions 可选的统一分割数量,如果不传则使用每个墙面自己的 divisions * @example * // 使用每个墙面自己的分割数 * kernel.dropZone.generateDropZones(); - * // 或者统一设置所有墙面的分割数 - * kernel.dropZone.generateDropZones(5); */ - generateDropZones: (divisions?: number): any[] => { - return this.mainApp.appDropZone.generateDropZones(divisions); + generateDropZones: (): any[] => { + return this.mainApp.appDropZone.generateDropZones(); + }, + /** + * 更新墙面分割数并重新生成放置区域 + * @param divisions 分割数对象,key 为墙面名称,value 为分割数 + * @example + * kernel.dropZone.updateDivisions({ "前": 4, "后": 1, "左": 1, "右": 1 }); + */ + updateDivisions: (divisions: Record): any[] => { + return this.mainApp.appDropZone.updateDivisions(divisions); }, /** * 显示所有放置区域