|
|
@@ -1,3 +1,4 @@
|
|
|
+import { Point3, Point2 } from './mathUtils';
|
|
|
import {
|
|
|
utilities as csUtils,
|
|
|
Types as CoreTypes,
|
|
|
@@ -191,9 +192,9 @@ export default class TibialPlateauAngleTool extends AnnotationTool {
|
|
|
TPA: cachedStats.TPA,
|
|
|
textBoxPosition: annotation.data.handles.textBoxTPA,
|
|
|
metadata: {
|
|
|
- viewPlaneNormal: annotation?.metadata?.viewPlaneNormal || [0, 0, 1],
|
|
|
- viewUp: annotation?.metadata?.viewUp || [0, 1, 0],
|
|
|
- FrameOfReferenceUID: annotation?.metadata?.FrameOfReferenceUID || '',
|
|
|
+ viewPlaneNormal: annotation.metadata?.viewPlaneNormal || [0, 0, 1],
|
|
|
+ viewUp: annotation.metadata?.viewUp || [0, 1, 0],
|
|
|
+ FrameOfReferenceUID: annotation.metadata?.FrameOfReferenceUID || '',
|
|
|
referencedImageId: annotation.metadata?.referencedImageId || '',
|
|
|
},
|
|
|
};
|
|
|
@@ -732,7 +733,7 @@ export default class TibialPlateauAngleTool extends AnnotationTool {
|
|
|
{ color: lineColor, width: 2 }
|
|
|
);
|
|
|
|
|
|
- // 绘制胫骨内侧平台线的延长线(虚线):从最近的端点延伸到交点
|
|
|
+ // 绘制胫骨内侧平台线的延长线(虚线):从最近的端点延伸到交点,并在交点后继续延长
|
|
|
if (cachedStats && cachedStats.intersectionPoint && points.length >= 2) {
|
|
|
const point1 = points[0]; // 平台线起点
|
|
|
const point2 = points[1]; // 平台线终点
|
|
|
@@ -751,20 +752,40 @@ export default class TibialPlateauAngleTool extends AnnotationTool {
|
|
|
// 选择离交点较近的端点作为延长线起点
|
|
|
const extensionStart = dist1 < dist2 ? point1 : point2;
|
|
|
|
|
|
+ // 计算从端点到交点的方向向量
|
|
|
+ const directionVector: CoreTypes.Point3 = [
|
|
|
+ intersection[0] - extensionStart[0],
|
|
|
+ intersection[1] - extensionStart[1],
|
|
|
+ intersection[2] - extensionStart[2]
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 归一化方向向量
|
|
|
+ const normalizedDir = this._normalizeVector(directionVector);
|
|
|
+
|
|
|
+ // 在交点后继续延长的长度(像素)
|
|
|
+ const extraExtensionLength = 150;
|
|
|
+
|
|
|
+ // 计算延长线的最终终点:交点 + 延长距离
|
|
|
+ const extensionEnd = vectorAdd(
|
|
|
+ intersection,
|
|
|
+ vectorScale(normalizedDir, extraExtensionLength)
|
|
|
+ );
|
|
|
+
|
|
|
const extensionStartCanvas = viewport.worldToCanvas(extensionStart);
|
|
|
- const intersectionCanvas = viewport.worldToCanvas(intersection);
|
|
|
+ const extensionEndCanvas = viewport.worldToCanvas(extensionEnd);
|
|
|
|
|
|
+ // 绘制完整的延长线:从端点经过交点到延伸终点
|
|
|
drawLineSvg(
|
|
|
svgDrawingHelper,
|
|
|
annotationUID,
|
|
|
`${annotationUID}-plateauExtension`,
|
|
|
extensionStartCanvas,
|
|
|
- intersectionCanvas,
|
|
|
+ extensionEndCanvas,
|
|
|
{ color: 'rgb(200, 200, 200)', width: 1, lineDash: '4,4' }
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- // 绘制功能轴线的延长线(虚线):从最近的端点延伸到交点
|
|
|
+ // 绘制功能轴线的延长线(虚线):从最近的端点延伸到交点,并在交点后继续延长
|
|
|
if (cachedStats && cachedStats.intersectionPoint && points.length >= 4) {
|
|
|
const point3 = points[2]; // 功能轴线起点
|
|
|
const point4 = points[3]; // 功能轴线终点
|
|
|
@@ -783,15 +804,35 @@ export default class TibialPlateauAngleTool extends AnnotationTool {
|
|
|
// 选择离交点较近的端点作为延长线起点
|
|
|
const extensionStart = dist3 < dist4 ? point3 : point4;
|
|
|
|
|
|
+ // 计算从端点到交点的方向向量
|
|
|
+ const directionVector: CoreTypes.Point3 = [
|
|
|
+ intersection[0] - extensionStart[0],
|
|
|
+ intersection[1] - extensionStart[1],
|
|
|
+ intersection[2] - extensionStart[2]
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 归一化方向向量
|
|
|
+ const normalizedDir = this._normalizeVector(directionVector);
|
|
|
+
|
|
|
+ // 在交点后继续延长的长度(像素)
|
|
|
+ const extraExtensionLength = 150;
|
|
|
+
|
|
|
+ // 计算延长线的最终终点:交点 + 延长距离
|
|
|
+ const extensionEnd = vectorAdd(
|
|
|
+ intersection,
|
|
|
+ vectorScale(normalizedDir, extraExtensionLength)
|
|
|
+ );
|
|
|
+
|
|
|
const extensionStartCanvas = viewport.worldToCanvas(extensionStart);
|
|
|
- const intersectionCanvas = viewport.worldToCanvas(intersection);
|
|
|
+ const extensionEndCanvas = viewport.worldToCanvas(extensionEnd);
|
|
|
|
|
|
+ // 绘制完整的延长线:从端点经过交点到延伸终点
|
|
|
drawLineSvg(
|
|
|
svgDrawingHelper,
|
|
|
annotationUID,
|
|
|
`${annotationUID}-axisExtension`,
|
|
|
extensionStartCanvas,
|
|
|
- intersectionCanvas,
|
|
|
+ extensionEndCanvas,
|
|
|
{ color: 'rgb(200, 200, 200)', width: 1, lineDash: '4,4' }
|
|
|
);
|
|
|
}
|