@cornerstonejs/tools
triggerAnnotationRenderForViewportIds
现在只需要 viewportIds
,不再需要 renderingEngine
。
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIds) ---> triggerAnnotationRenderForViewportIds(viewportIds)
Details
为什么?
因为每个视口都有一个渲染引擎,因此不需要将渲染引擎作为参数传递。工具
StackScrollMouseWheelTool -> StackScrollTool
我们已经将鼠标滚轮与工具本身解耦,使其可以像其他鼠标绑定一样应用为绑定。
此更改带来了多个优势:
- 它可以与其他鼠标绑定组合使用
- 它可以与键盘绑定配对使用
- 之前 📦
- 之后 🚀🚀
cornerstoneTools.addTool(StackScrollMouseWheelTool);
toolGroup.addTool(StackScrollMouseWheelTool.toolName);
toolGroup.setToolActive(StackScrollMouseWheelTool.toolName);
cornerstoneTools.addTool(StackScrollTool);
toolGroup.addTool(StackScrollTool.toolName);
toolGroup.setToolActive(StackScrollTool.toolName, {
bindings: [
{
mouseButton: MouseBindings.Wheel,
},
],
});
BaseTool
getTargetVolumeId
方法已被移除,取而代之的是 getTargetId
,而 getTargetIdImage
已重命名为 getTargetImageData
,以更清楚地表明它是图像数据。
使用示例
- 之前 📦
- 之后 🚀
const volumeId = this.getTargetVolumeId(viewport);
const imageData = this.getTargetIdImage(targetId, renderingEngine);
const imageData = this.getTargetImageData(targetId);
新的分割模型
我们有一个新的分割模型,更加灵活且易于使用。
相同术语,不同架构
在 Cornerstone3D 版本 2 中,我们对分割模型进行了重大架构更改,同时保持了熟悉的术语。此重新设计旨在为在不同视口中处理 分割提供更灵活和直观的方法。以下是主要更改及其背后的原因:
-
视口特定,而非基于工具组:
- 以前:分割与工具组绑定,工具组通常由多个视口组成。当用户希望在同一工具组内为某些视口添加分割而不是其他视口时,这会带来复杂性。
- 现在:分割现在是视口特定的。用户可以直接向视口添加分割,而不是向工具组添加或移除表示。这为每个视口渲染的内容提供了更细致的控制。
- 为什么:我们发现将渲染绑定到工具组并不是一种有效的方法。它通常需要为特定视口创建额外的工具组以进行自定义或防止渲染。
-
简化分割表示的识别:
- 以前:需要一个唯一的
segmentationRepresentationUID
进行识别。 - 现在:分割表示通过
segmentationId
和表示type
的组合进行识别。这允许每个视口对同一分割有不同的表示。 - 为什么:这种简化使得在不同视口中管理和引用分割表示更加容易。
- 以前:需要一个唯一的
-
数据与可视化的解耦:
- 以前:分割渲染与工具组紧密耦合。
- 现在:分割现在纯粹作为数据处理,与用于交互的工具分离。
- 为什么:虽然将工具绑定到工具组是合适的,但像分割渲染这样的视口特定功能应该由各个视口负责。这种分离允许在不同视口中有更灵活的渲染和交互选项。
-
多态分割支持:
- 新架构更好地支持多态分割的概念,即单个分割可以有多个表示(例如,标签图、轮廓、表面),并且可以在它们之间高效地转 换。
- 为什么:这种灵活性允许更高效地存储、分析和实时可视化分割。
-
跨表示类型的一致 API:
- 新的 API 提供了一种统一的方式来处理不同的分割表示,使得管理涉及多个视口和表示类型的复杂场景更加容易。
- 为什么:这种一致性简化了开发,并减少了在处理不同分割类型时出错的可能性。
这些架构更改为处理分割提供了更坚实的基础,特别是在复杂的多视口场景中。新方法已被证明非常有效,并为未来的增强功能打开了可能性。虽然核心概念保持相似,但您在代码中与分割交互的方式将会显著改变。本迁移指南将引导您完成这些更改,提供前后示例,帮助您将现有代码库更新到新架构。
分割状态
Segmentation
类型已被重组,以更好地组织分割信息和表示数据。在讨论迁移指南之前,让我们先看看更改。
- 之前 📦
- 之后 🚀🚀
type Segmentation = {
segmentationId: string;
type: Enums.SegmentationRepresentations;
label: string;
activeSegmentIndex: number;
segmentsLocked: Set<number>;
cachedStats: { [key: string]: number };
segmentLabels: { [key: string]: string };
representationData: SegmentationRepresentationData;
};
type Segmentation = {
segmentationId: string;
label: string;
segments: {
[segmentIndex: number]: Segment;
};
representationData: RepresentationsData;
};
type Segment = {
segmentIndex: number;
label: string;
locked: boolean;
cachedStats: { [key: string]: unknown };
active: boolean;
};
新的分割状态模型提供了更有组织的数据结构。以前分散的信息,如 cachedStats
、segmentLabels
和 activeSegmentIndex