|
@@ -4,6 +4,7 @@ import * as cornerstoneTools from '@cornerstonejs/tools';
|
|
|
const {
|
|
|
ToolGroupManager,
|
|
|
LengthTool,
|
|
|
+ AngleTool,
|
|
|
WindowLevelTool,
|
|
|
MagnifyTool,
|
|
|
Enums: csToolsEnums,
|
|
@@ -226,4 +227,200 @@ export class MeasurementToolManager {
|
|
|
this.clearLengthMeasurements(viewportId)
|
|
|
);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 激活角度测量工具
|
|
|
+ */
|
|
|
+ static activateAngleTool(viewportId: string): boolean {
|
|
|
+ const toolGroup = this.getToolGroup(viewportId);
|
|
|
+ if (!toolGroup) return false;
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 停用其他可能冲突的工具
|
|
|
+ toolGroup.setToolPassive(WindowLevelTool.toolName, {
|
|
|
+ removeAllBindings: true,
|
|
|
+ });
|
|
|
+ toolGroup.setToolPassive(MagnifyTool.toolName, {
|
|
|
+ removeAllBindings: true,
|
|
|
+ });
|
|
|
+ toolGroup.setToolPassive(LengthTool.toolName, {
|
|
|
+ removeAllBindings: true,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 激活角度测量工具
|
|
|
+ toolGroup.setToolActive(AngleTool.toolName, {
|
|
|
+ bindings: [{ mouseButton: MouseBindings.Primary }],
|
|
|
+ });
|
|
|
+
|
|
|
+ console.log(
|
|
|
+ `[MeasurementToolManager] Angle tool activated for viewport: ${viewportId}`
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ } catch (error) {
|
|
|
+ console.error(
|
|
|
+ `[MeasurementToolManager] Error activating angle tool:`,
|
|
|
+ error
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 停用角度测量工具
|
|
|
+ */
|
|
|
+ static deactivateAngleTool(viewportId: string): boolean {
|
|
|
+ const toolGroup = this.getToolGroup(viewportId);
|
|
|
+ if (!toolGroup) return false;
|
|
|
+
|
|
|
+ try {
|
|
|
+ toolGroup.setToolPassive(AngleTool.toolName, {
|
|
|
+ removeAllBindings: true,
|
|
|
+ });
|
|
|
+ console.log(
|
|
|
+ `[MeasurementToolManager] Angle tool deactivated for viewport: ${viewportId}`
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ } catch (error) {
|
|
|
+ console.error(
|
|
|
+ `[MeasurementToolManager] Error deactivating angle tool:`,
|
|
|
+ error
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查角度测量工具是否处于激活状态
|
|
|
+ */
|
|
|
+ static isAngleToolActive(viewportId: string): boolean {
|
|
|
+ const toolGroup = this.getToolGroup(viewportId);
|
|
|
+ if (!toolGroup) return false;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const activeTool = toolGroup.getActivePrimaryMouseButtonTool();
|
|
|
+ return activeTool === AngleTool.toolName;
|
|
|
+ } catch (error) {
|
|
|
+ console.error(
|
|
|
+ `[MeasurementToolManager] Error checking angle tool state:`,
|
|
|
+ error
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 切换角度测量工具状态
|
|
|
+ */
|
|
|
+ static toggleAngleTool(viewportId: string): boolean {
|
|
|
+ const isActive = this.isAngleToolActive(viewportId);
|
|
|
+
|
|
|
+ if (isActive) {
|
|
|
+ return this.deactivateAngleTool(viewportId);
|
|
|
+ } else {
|
|
|
+ return this.activateAngleTool(viewportId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清除指定 viewport 的所有角度测量标注
|
|
|
+ */
|
|
|
+ static clearAngleMeasurements(viewportId: string): boolean {
|
|
|
+ try {
|
|
|
+ const viewport =
|
|
|
+ cornerstone.getEnabledElementByViewportId(viewportId)?.viewport;
|
|
|
+ if (!viewport) {
|
|
|
+ console.warn(
|
|
|
+ `[MeasurementToolManager] Viewport not found: ${viewportId}`
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ const annotations = cornerstoneTools.annotation.state.getAnnotations(
|
|
|
+ AngleTool.toolName,
|
|
|
+ viewport.element
|
|
|
+ );
|
|
|
+
|
|
|
+ let removedCount = 0;
|
|
|
+ annotations.forEach((annotation) => {
|
|
|
+ if (annotation.annotationUID) {
|
|
|
+ cornerstoneTools.annotation.state.removeAnnotation(
|
|
|
+ annotation.annotationUID
|
|
|
+ );
|
|
|
+ removedCount++;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ viewport.render();
|
|
|
+ console.log(
|
|
|
+ `[MeasurementToolManager] Cleared ${removedCount} angle measurements for viewport: ${viewportId}`
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ } catch (error) {
|
|
|
+ console.error(
|
|
|
+ `[MeasurementToolManager] Error clearing angle measurements:`,
|
|
|
+ error
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取指定 viewport 的所有角度测量结果
|
|
|
+ */
|
|
|
+ // eslint-disable-next-line
|
|
|
+ static getAngleMeasurements(viewportId: string): any[] {
|
|
|
+ try {
|
|
|
+ const viewport =
|
|
|
+ cornerstone.getEnabledElementByViewportId(viewportId)?.viewport;
|
|
|
+ if (!viewport) {
|
|
|
+ console.warn(
|
|
|
+ `[MeasurementToolManager] Viewport not found: ${viewportId}`
|
|
|
+ );
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ const annotations = cornerstoneTools.annotation.state.getAnnotations(
|
|
|
+ AngleTool.toolName,
|
|
|
+ viewport.element
|
|
|
+ );
|
|
|
+
|
|
|
+ return annotations.map((annotation) => ({
|
|
|
+ annotationUID: annotation.annotationUID,
|
|
|
+ angle: annotation.data?.cachedStats?.angle || 0,
|
|
|
+ unit: annotation.data?.cachedStats?.unit || 'degrees',
|
|
|
+ points: annotation.data?.handles?.points || [],
|
|
|
+ }));
|
|
|
+ } catch (error) {
|
|
|
+ console.error(
|
|
|
+ `[MeasurementToolManager] Error getting angle measurements:`,
|
|
|
+ error
|
|
|
+ );
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为多个 viewport 批量激活角度测量工具
|
|
|
+ */
|
|
|
+ static activateAngleToolForViewports(viewportIds: string[]): boolean[] {
|
|
|
+ return viewportIds.map((viewportId) => this.activateAngleTool(viewportId));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为多个 viewport 批量停用角度测量工具
|
|
|
+ */
|
|
|
+ static deactivateAngleToolForViewports(viewportIds: string[]): boolean[] {
|
|
|
+ return viewportIds.map((viewportId) =>
|
|
|
+ this.deactivateAngleTool(viewportId)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为多个 viewport 批量清除角度测量
|
|
|
+ */
|
|
|
+ static clearAngleMeasurementsForViewports(viewportIds: string[]): boolean[] {
|
|
|
+ return viewportIds.map((viewportId) =>
|
|
|
+ this.clearAngleMeasurements(viewportId)
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|