同步器(Synchronizers)可以使多个视图同步响应同一个工具的操作,例如我们在MPR视图下,同步操作三个视图的缩放程度、windowLevel等等
一个同步器必须需要以下几个部分才可以执行
-  一个监听事件(什么情况下触发同步) 
-  一个回调函数(监听事件触发时需要执行什么操作) 
-  一组源视图(原作用于哪些视图) 
-  一组目标视图(要同步于哪些视图) 
使用同步器
同步器的使用方式类似于工具组,先使用 SynchronizerManager 创建一个同步器,被创建的同步器含有addSource、addTarget、add(将视图作为source视图和target视图同步添加)等函数。
特别值得注意的是:当绑定了同步器的视图被禁用时,同步器会自动在target列表和source列表中移除被禁用的视图,而无需手动操作。
内置的同步器
可以在 @cornerstonejs/tools 抛出的 synchronizers 对象中查看内置的同步器,从以下图片可看到目前内置了5种同步器(实际是4种,createStackImageSynchronizer 和 createImageSliceSynchronizer 功能性一致,只是兼容性处理)
 
-  createCameraPositionSynchronizer: 创建一个新的同步器,监听CAMERA_MODIFIED呈现事件并调用cameraSyncCallback。 
-  createVOISynchronizer :创建一个新的同步器,监听VOI_MODIFIED渲染事件并调用voiSyncCallback。 
-  createZoomPanSynchronizer:创建一个新的同步器,监听CAMERA_MODIFIED事件并调用zoomPanSyncCallback 
-  createImageSliceSynchronizer:创建一个新的同步器,监听STACK_NEW_IMAGE渲染事件并调用ImageSliceSyncCallback。 
使用内置同步器
以同步更新缩放和位移位置为例,演示一下在我们的代码中如何使用内置同步器
创建同步器
import {synchronizers, SynchronizerManager} from '@cornerstonejs/tools'
synchronizers.createZoomPanSynchronizer(’CAMERA_SYNCHRONIZER_ID‘);
绑定视图
// 根据同步器ID获取到对应的同步器
const cameraSynchronizer = SynchronizerManager.getSynchronizer('CAMERA_SYNCHRONIZER_ID');// 为同步器绑定视图,add表示将当前视图同步绑定到source列表和target列表中
cameraSynchronizer.add({renderingEngineId,viewportId,
});
自定义同步器
如果内置的同步器无法满足我们的需求,支持自定义一个同步器。如果我们想要自定义一个同步器主要需要实现以下一个核心点
 import { Enums } from '@cornerstonejs/core';
import { SynchronizerManager } from '@cornerstonejs/tools';const cameraPositionSynchronizer = SynchronizerManager.createSynchronizer('synchronizerName', // 核心点1:同步器的IDEnums.Events.CAMERA_MODIFIED, // 核心点2:同步器监听的事件(synchronizerInstance,sourceViewport,targetViewport,cameraModifiedEvent) => {// 核心点3:监听事件后触发的回调函数}
);
以下为内置的createCameraPositionSynchronizer同步器的实现
export default function createCameraPositionSynchronizer(synchronizerName: string
): Synchronizer {const cameraPositionSynchronizer = createSynchronizer(synchronizerName,CAMERA_MODIFIED,cameraSyncCallback);return cameraPositionSynchronizer;
}
总结回顾
