【从0上手Cornerstone3D】如何使用CornerstoneTools中的工具之同步器

同步器(Synchronizers)可以使多个视图同步响应同一个工具的操作,例如我们在MPR视图下,同步操作三个视图的缩放程度、windowLevel等等

一个同步器必须需要以下几个部分才可以执行

  • 一个监听事件(什么情况下触发同步)

  • 一个回调函数(监听事件触发时需要执行什么操作)

  • 一组源视图(原作用于哪些视图)

  • 一组目标视图(要同步于哪些视图)

使用同步器

同步器的使用方式类似于工具组,先使用 SynchronizerManager 创建一个同步器,被创建的同步器含有addSource、addTarget、add(将视图作为source视图和target视图同步添加)等函数。

特别值得注意的是:当绑定了同步器的视图被禁用时,同步器会自动在target列表和source列表中移除被禁用的视图,而无需手动操作。

内置的同步器

可以在 @cornerstonejs/tools 抛出的 synchronizers 对象中查看内置的同步器,从以下图片可看到目前内置了5种同步器(实际是4种,createStackImageSynchronizercreateImageSliceSynchronizer 功能性一致,只是兼容性处理)

  • createCameraPositionSynchronizer: 创建一个新的同步器,监听CAMERA_MODIFIED呈现事件并调用cameraSyncCallback。

  • createVOISynchronizer :创建一个新的同步器,监听VOI_MODIFIED渲染事件并调用voiSyncCallback。

  • createZoomPanSynchronizer:创建一个新的同步器,监听CAMERA_MODIFIED事件并调用zoomPanSyncCallback

  • createImageSliceSynchronizer:创建一个新的同步器,监听STACK_NEW_IMAGE渲染事件并调用ImageSliceSyncCallback。

使用内置同步器

以同步更新缩放和位移位置为例,演示一下在我们的代码中如何使用内置同步器

创建同步器

js 复制代码
import {synchronizers, SynchronizerManager} from '@cornerstonejs/tools'
synchronizers.createZoomPanSynchronizer('CAMERA_SYNCHRONIZER_ID');

绑定视图

js 复制代码
// 根据同步器ID获取到对应的同步器
const cameraSynchronizer = SynchronizerManager.getSynchronizer('CAMERA_SYNCHRONIZER_ID');

// 为同步器绑定视图,add表示将当前视图同步绑定到source列表和target列表中
cameraSynchronizer.add({
  renderingEngineId,
  viewportId,
});

自定义同步器

如果内置的同步器无法满足我们的需求,支持自定义一个同步器。如果我们想要自定义一个同步器主要需要实现以下一个核心点

js 复制代码
 import { Enums } from '@cornerstonejs/core';
import { SynchronizerManager } from '@cornerstonejs/tools';

const cameraPositionSynchronizer = SynchronizerManager.createSynchronizer(
  'synchronizerName', // 核心点1:同步器的ID
  Enums.Events.CAMERA_MODIFIED, // 核心点2:同步器监听的事件
  (
    synchronizerInstance,
    sourceViewport,
    targetViewport,
    cameraModifiedEvent
  ) => {
    // 核心点3:监听事件后触发的回调函数
  }
);

以下为内置的createCameraPositionSynchronizer同步器的实现

js 复制代码
export default function createCameraPositionSynchronizer(
  synchronizerName: string
): Synchronizer {
  const cameraPositionSynchronizer = createSynchronizer(
    synchronizerName,
    CAMERA_MODIFIED,
    cameraSyncCallback
  );

  return cameraPositionSynchronizer;
}

总结回顾

相关推荐
前端熊猫18 分钟前
transform学习
前端·学习·html
sun lover27 分钟前
electron快速上手
javascript·electron
GISer_Jing28 分钟前
React渲染流程与更新diff算法
前端·javascript·react.js
郑祎亦30 分钟前
JavaWeb开发:HTML 页面与接口对接
前端·后端·java-ee·html
Au_ust36 分钟前
css:感觉稍微高级一点的布局
前端·css
下页、再停留36 分钟前
【前端】CSS修改div滚动条样式
前端·css
一晌贪欢i36 分钟前
CSS中calc语法不生效
前端·css
前端白袍42 分钟前
Vue:后端返回二进制文件,前端如何实现浏览器自动下载?
前端·javascript·vue.js
问道飞鱼42 分钟前
【前端知识】简单讲讲什么是微前端
前端·微前端·qiankun·single-spa
Jing_jing_X1 小时前
心情追忆-首页“毒“鸡汤AI自动化
java·前端·后端·ai·产品经理·流量运营