x
This commit is contained in:
@@ -501,28 +501,60 @@ class HTMLGenerator:
|
|||||||
let isSplit = false;
|
let isSplit = false;
|
||||||
let splitAnimId = null;
|
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() {{
|
function splitMold() {{
|
||||||
if (!cavityMesh && !coreMesh) return;
|
if (!cavityMesh && !coreMesh) return;
|
||||||
isSplit = !isSplit;
|
isSplit = !isSplit;
|
||||||
const btn = document.getElementById('splitBtn');
|
const btn = document.getElementById('splitBtn');
|
||||||
btn.textContent = isSplit ? '合模' : '分模拆分';
|
btn.textContent = isSplit ? '合模' : '分模拆分';
|
||||||
|
|
||||||
// 计算拆分距离:取边界框高度的 40%
|
|
||||||
const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100];
|
const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100];
|
||||||
const splitDist = bboxDims[1] * 0.4;
|
const dir = getPartingDirection();
|
||||||
|
|
||||||
// 目标位置
|
// 根据分模方向确定拆分轴和距离
|
||||||
const cavityTargetY = isSplit ? splitDist : 0;
|
let splitDist, axis;
|
||||||
const coreTargetY = isSplit ? -splitDist : 0;
|
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 partingTargetOpacity = isSplit ? 0 : 0.3;
|
||||||
|
|
||||||
// 记录起始位置
|
// 记录起始位置
|
||||||
const cavityStartY = cavityMesh ? cavityMesh.position.y : 0;
|
const cavityStart = cavityMesh ? cavityMesh.position[axis] : 0;
|
||||||
const coreStartY = coreMesh ? coreMesh.position.y : 0;
|
const coreStart = coreMesh ? coreMesh.position[axis] : 0;
|
||||||
const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3;
|
const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3;
|
||||||
|
|
||||||
|
// 目标位置:型腔正向移动,型芯负向移动
|
||||||
|
const cavityTarget = isSplit ? splitDist : 0;
|
||||||
|
const coreTarget = isSplit ? -splitDist : 0;
|
||||||
|
|
||||||
const duration = 800; // ms
|
const duration = 800; // ms
|
||||||
const startTime = performance.now();
|
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;
|
const ease = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
|
||||||
|
|
||||||
if (cavityMesh) {{
|
if (cavityMesh) {{
|
||||||
cavityMesh.position.y = cavityStartY + (cavityTargetY - cavityStartY) * ease;
|
cavityMesh.position[axis] = cavityStart + (cavityTarget - cavityStart) * ease;
|
||||||
}}
|
}}
|
||||||
if (coreMesh) {{
|
if (coreMesh) {{
|
||||||
coreMesh.position.y = coreStartY + (coreTargetY - coreStartY) * ease;
|
coreMesh.position[axis] = coreStart + (coreTarget - coreStart) * ease;
|
||||||
}}
|
}}
|
||||||
if (partingMesh) {{
|
if (partingMesh) {{
|
||||||
partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease;
|
partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease;
|
||||||
|
|||||||
Reference in New Issue
Block a user