From 70cbc456d7ca28645f4c1c3c301e15bbb406a678 Mon Sep 17 00:00:00 2001 From: chenjw28 <792430652@qq.com> Date: Tue, 21 Apr 2026 14:52:37 +0800 Subject: [PATCH] x --- src/utils/html_generator.py | 50 ++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/src/utils/html_generator.py b/src/utils/html_generator.py index 5d3d576..58eed89 100644 --- a/src/utils/html_generator.py +++ b/src/utils/html_generator.py @@ -501,28 +501,60 @@ class HTMLGenerator: let isSplit = false; let splitAnimId = null; + // 根据材料类型确定分模方向 + function getPartingDirection() {{ + // 优先使用后端传递的 parting_direction + if (cavityData?.metadata?.parting_direction) {{ + return cavityData.metadata.parting_direction; + }} + if (cavityData?.manufacturing_info?.parting_direction) {{ + return cavityData.manufacturing_info.parting_direction; + }} + // 泡沫材料默认 Z 轴 + if (cavityData?.metadata?.is_foam) {{ + return 'Z'; + }} + // 默认 Z 轴 + return 'Z'; + }} + function splitMold() {{ if (!cavityMesh && !coreMesh) return; isSplit = !isSplit; const btn = document.getElementById('splitBtn'); btn.textContent = isSplit ? '合模' : '分模拆分'; - // 计算拆分距离:取边界框高度的 40% const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100]; - const splitDist = bboxDims[1] * 0.4; + const dir = getPartingDirection(); - // 目标位置 - const cavityTargetY = isSplit ? splitDist : 0; - const coreTargetY = isSplit ? -splitDist : 0; + // 根据分模方向确定拆分轴和距离 + let splitDist, axis; + if (dir === 'Z') {{ + // Z轴上下开模:拆分距离取 Z 方向高度的 40% + splitDist = bboxDims[2] * 0.4; + axis = 'z'; + }} else if (dir === 'Y') {{ + // Y轴前后开模 + splitDist = bboxDims[1] * 0.4; + axis = 'y'; + }} else {{ + // X轴左右开模 + splitDist = bboxDims[0] * 0.4; + axis = 'x'; + }} // 分型面动画目标透明度 const partingTargetOpacity = isSplit ? 0 : 0.3; // 记录起始位置 - const cavityStartY = cavityMesh ? cavityMesh.position.y : 0; - const coreStartY = coreMesh ? coreMesh.position.y : 0; + const cavityStart = cavityMesh ? cavityMesh.position[axis] : 0; + const coreStart = coreMesh ? coreMesh.position[axis] : 0; const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3; + // 目标位置:型腔正向移动,型芯负向移动 + const cavityTarget = isSplit ? splitDist : 0; + const coreTarget = isSplit ? -splitDist : 0; + const duration = 800; // ms const startTime = performance.now(); @@ -535,10 +567,10 @@ class HTMLGenerator: const ease = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2; if (cavityMesh) {{ - cavityMesh.position.y = cavityStartY + (cavityTargetY - cavityStartY) * ease; + cavityMesh.position[axis] = cavityStart + (cavityTarget - cavityStart) * ease; }} if (coreMesh) {{ - coreMesh.position.y = coreStartY + (coreTargetY - coreStartY) * ease; + coreMesh.position[axis] = coreStart + (coreTarget - coreStart) * ease; }} if (partingMesh) {{ partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease;