2026-06-23-13-38-48 新增逆向工作区单轴拉伸

This commit is contained in:
2026-06-23 13:54:15 +08:00
parent 1e044fb349
commit 5a9d09a5bf
9 changed files with 401 additions and 42 deletions

View File

@@ -33,6 +33,9 @@ interface ModelPoseValue {
translateY: number;
translateZ: number;
scale: number;
scaleX: number;
scaleY: number;
scaleZ: number;
flipX: boolean;
flipY: boolean;
flipZ: boolean;
@@ -179,6 +182,9 @@ const defaultModelPose: ModelPoseValue = {
translateY: 0,
translateZ: 0,
scale: 1,
scaleX: 1,
scaleY: 1,
scaleZ: 1,
flipX: false,
flipY: false,
flipZ: false,
@@ -188,6 +194,9 @@ const modelPoseValuePrecision: Partial<Record<keyof ModelPoseValue, number>> = {
translateY: 3,
translateZ: 3,
scale: 3,
scaleX: 3,
scaleY: 3,
scaleZ: 3,
};
interface DicomAttributes {
@@ -494,6 +503,9 @@ function normalizeModelPoseValue(value: Partial<ModelPoseValue> | undefined): Mo
translateY: read('translateY', defaultModelPose.translateY, -2, 2),
translateZ: read('translateZ', defaultModelPose.translateZ, -2, 2),
scale: read('scale', defaultModelPose.scale, 0.5, 3),
scaleX: read('scaleX', defaultModelPose.scaleX, 0.2, 8),
scaleY: read('scaleY', defaultModelPose.scaleY, 0.2, 8),
scaleZ: read('scaleZ', defaultModelPose.scaleZ, 0.2, 8),
flipX: readBoolean('flipX', defaultModelPose.flipX),
flipY: readBoolean('flipY', defaultModelPose.flipY),
flipZ: readBoolean('flipZ', defaultModelPose.flipZ),
@@ -1030,9 +1042,9 @@ function transformPointForExportPose(x: number, y: number, z: number, metrics: E
y: afterX.y,
z: -afterX.x * sinY + afterX.z * cosY,
};
px = afterY.x * cosZ - afterY.y * sinZ;
py = afterY.x * sinZ + afterY.y * cosZ;
pz = afterY.z;
px = (afterY.x * cosZ - afterY.y * sinZ) * pose.scaleX;
py = (afterY.x * sinZ + afterY.y * cosZ) * pose.scaleY;
pz = afterY.z * pose.scaleZ;
return {
x: px + pose.translateX,
@@ -2437,6 +2449,10 @@ function normalizePipelinePose(metadata: Record<string, unknown>) {
const translateY = readNumberOption(translation.y ?? translation.translateY ?? metadata.translateY);
const translateZ = readNumberOption(translation.z ?? translation.translateZ ?? metadata.translateZ);
const scale = readNumberOption(metadata.scale ?? poseSource.scale);
const axisScale = readNestedObject(metadata.axisScale ?? metadata.axisScales ?? metadata.stretchScale);
const scaleX = readNumberOption(axisScale.x ?? axisScale.scaleX ?? metadata.scaleX);
const scaleY = readNumberOption(axisScale.y ?? axisScale.scaleY ?? metadata.scaleY);
const scaleZ = readNumberOption(axisScale.z ?? axisScale.scaleZ ?? metadata.scaleZ);
if (rotationX !== undefined) pose.rotateX = rotationX;
if (rotationY !== undefined) pose.rotateY = rotationY;
@@ -2445,6 +2461,9 @@ function normalizePipelinePose(metadata: Record<string, unknown>) {
if (translateY !== undefined) pose.translateY = translateY;
if (translateZ !== undefined) pose.translateZ = translateZ;
if (scale !== undefined) pose.scale = scale;
if (scaleX !== undefined) pose.scaleX = scaleX;
if (scaleY !== undefined) pose.scaleY = scaleY;
if (scaleZ !== undefined) pose.scaleZ = scaleZ;
(['X', 'Y', 'Z'] as const).forEach((axis) => {
const lowerAxis = axis.toLowerCase();
@@ -2518,9 +2537,9 @@ function rotatedModelSizeForPose(bounds: ModelBoundsRecord, pose: ModelPoseValue
y: afterX.y,
z: -afterX.x * sinY + afterX.z * cosY,
};
px = afterY.x * cosZ - afterY.y * sinZ;
py = afterY.x * sinZ + afterY.y * cosZ;
pz = afterY.z;
px = (afterY.x * cosZ - afterY.y * sinZ) * pose.scaleX;
py = (afterY.x * sinZ + afterY.y * cosZ) * pose.scaleY;
pz = afterY.z * pose.scaleZ;
rotatedBounds.min.x = Math.min(rotatedBounds.min.x, px);
rotatedBounds.min.y = Math.min(rotatedBounds.min.y, py);
rotatedBounds.min.z = Math.min(rotatedBounds.min.z, pz);