【从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;
}

总结回顾

相关推荐
学习笔记10136 分钟前
第十五章认识Ajax(六)
前端·javascript·ajax
消失的旧时光-194339 分钟前
Flutter 异步编程:Future 与 Stream 深度解析
android·前端·flutter
曹牧1 小时前
C# 中的 DateTime.Now.ToString() 方法支持多种预定义的格式字符
前端·c#
勿在浮沙筑高台1 小时前
海龟交易系统R
前端·人工智能·r语言
歪歪1001 小时前
C#如何在数据可视化工具中进行数据筛选?
开发语言·前端·信息可视化·前端框架·c#·visual studio
Captaincc2 小时前
AI 能帮你写代码,但把代码变成软件,还是得靠人
前端·后端·程序员
吃饺子不吃馅3 小时前
如何设计一个 Canvas 事件系统?
前端·canvas·图形学
theOtherSky3 小时前
element+vue3 table上下左右键切换input和select
javascript·vue.js·elementui·1024程序员节
Baklib梅梅4 小时前
无头内容管理系统:打造灵活高效的多渠道内容架构
前端·ruby on rails·前端框架·ruby
会联营的陆逊4 小时前
JavaScript 如何优雅的实现一个时间处理插件
javascript