cornerstoneTools 测量数据的提取与回显

1,312 阅读3分钟

cornerstoneTools 测量数据的提取与回显

众所周知,在 cornerstoneTools 中,所有的测量工具每次标注均会生成相应的 toolState 数据,toolState 数据由 cornerstoneTools 进行管理,那我们把全部的 toolState 保存下来,下次在预览影像时,在回填回去,就可以测量数据的永久性保存。

很幸运,cornerstoneTools 支持这样做,并且通过过滤数据与修改数据,还可实现一些其它的功能。

ToolState 相关 Api

cornerstoneTools 支持操作激活元素的 toolState:

// 添加 toolState
cornerstoneTools.addToolState(element, toolName, toolState);

// 获取 toolState
cornerstoneTools.getToolState(element, toolName);

// 移除 toolState
cornerstoneTools.removeToolState(element, toolName, toolState);

// 清空 toolState
cornerstoneTools.clearToolState(element, toolName);

ImageIdSpecificToolStateManager 状态管理器

cornerstoneTools 中所有的 toolState 存放于状态管理器 ImageIdSpecificToolStateManager 中。ImageIdSpecificToolStateManager 为一个函数,内部有处理 toolState 的方法,上述的 addToolState 等 Api 均是通过内部的方法实现的。

cornerstoneTools 支持获取和设置激活元素的状态管理器:

// 获取激活元素的状态管理器,如没有特殊设置,这里获取的是全局的状态管理器:globalImageIdSpecificToolStateManager
const toolStateManager = cornerstoneTools.getElementToolStateManager(element);

// 设置激活元素的状态管理器
const toolStateManager =
  new cornerstoneTools.newImageIdSpecificToolStateManager();

cornerstoneTools.setElementToolStateManager(element, toolStateManager);

ImageIdSpecificToolStateManager 状态管理器内部存在一个 toolState 对象,通过 imageId 为 key 存储数据。获取状态管理器后,就可以通过内部的方法进行相关的操作。

toolState 对象的数据结构如下:

{
  "imageId1": {
    "toolName1": {
      "data": [{ "dataKey": "每个标注的数据" }, { "dataKey": "每个标注的数据" }]
    },
    "toolName2": {
      "data": [{ "dataKey": "每个标注的数据" }]
    }
  },
  "imageId2": {
    "toolName1": {
      "data": [{ "dataKey": "每个标注的数据" }, { "dataKey": "每个标注的数据" }]
    },
    "toolName2": {
      "data": [{ "dataKey": "每个标注的数据" }]
    }
  }
}

在状态管理器中分为三个维度操作数据:激活元素、影像 id、全部的数据。

通过激活元素进行操作:

// 获取激活元素的状态管理器
const toolStateManager = cornerstoneTools.getElementToolStateManager(element);

// 获取激活元素某个工具的数据
const toolState = toolStateManager.get(element, toolName);

// 添加激活元素某个工具的数据
toolStateManager.add(element, toolName, toolState);

// 重新设置激活元素某个工具的数据
toolStateManager.set(element, toolName, toolState);

// 清空激活元素的数据
toolStateManager.clear(element);

通过影像 id 进行操作:

// 也可以直接拿到全局的状态管理器
const toolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager;

// 获取影像某个工具的数据
const toolState = toolStateManager.getImageIdToolState(imageId, toolName);

// 添加影像某个工具的数据
toolStateManager.addImageIdToolState(imageId, toolName, toolState);

// 重新设置影像某个工具的数据
toolStateManager.setImageIdToolState(imageId, toolName, toolState);

// 清空影像的全部数据
toolStateManager.clearImageIdToolState(imageId);

// 获取影像的全部数据
const toolState = toolStateManager.saveImageIdToolState(imageId);

// 重置影像的全部数据
toolStateManager.restoreImageIdToolState(imageId, imageIdToolState);

直接操作全部的数据:

const toolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager;

// 获取管理器中的全部数据
const toolState = toolStateManager.saveToolState();

// 重置管理器的全部数据
toolStateManager.restoreToolState(savedToolState);

// 管理器中的全部数据集合
const toolState = toolStateManager.toolState;

提取与回填数据

提取与回填数据主要是通过 cornerstoneTools 中的状态管理器的数据操作来实现,基本会用到如下方法:

// 直接获取全部的数据
const toolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager;
const toolState = toolStateManager.toolState;

// Do something...

// 数据回填
for (const imageId in toolState) {
  for (const toolName in toolState[imageId]) {
    const data = [...toolState[imageId][toolName].data];

    for (const dataIndex in data) {
      toolStateManager.addImageIdToolState(imageId, toolName, data[dataIndex]);
      cornerstoneTools.setToolPassive(toolName);
    }
  }
}

最简单的例子

老规矩,最后放上案例,更直观的看到效果。