# 工具解析

# 模式

工具的模式(在v2中称为工具状态)决定了如何呈现工具,以及如何与之交互。四种标准模式是: 工具的模式分为四种状态:

  • Active: 激活
  • Passive:被动
  • Enabled:启用
  • Disabled:禁用
模式 描述
Active 激活状态的工具将呈现并响应用户输入,或者能够创建新的标绘和/或测量。
Passive 被动工具将呈现并被动响应用户输入。他们的数据可以被操纵,但不能被创建。
Enabled 启用的工具将呈现,但不会响应输入。“启用”工具状态本质上是“只读”状态。
Disabled (default) 工具的默认状态。禁用的工具不能与交互,也不能在启用的元素上呈现。

🚧 You can quickly test these modes out for yourself by checking out this tool's example/demo page ~TODO~

# 切换工具的状态

你要是已经 启用了一个或者多个元素 并且已经 给这些元素添加工具, 可以通过以下两种方式之一更改现有工具的模式:

  • 针对所有已启用元素 如果已将同名工具添加到多个启用的元素中,则可以使用以下方法之一更新该工具的所有实例:
// Active
cornerstoneTools.setToolActive('ToolName', options);
// Passive
cornerstoneTools.setToolPassive('ToolName', options);
// Enabled
cornerstoneTools.setToolEnabled('ToolName', options);
// Disabled
cornerstoneTools.setToolDisabled('ToolName', options);
  • 针对指定的已启用的元素 如果需要工具行为在多个启用的元素之间有所不同,可以使用以下方法之一更改特定启用元素的工具模式:
// Active
cornerstoneTools.setToolActiveForElement(
  enabledElement,
  'ToolName',
  {
    mouseButtonMask: 1,
  },
  ['Mouse']
);

// Passive
cornerstoneTools.setToolPassiveForElement(enabledElement, 'ToolName', options);
// Enabled
cornerstoneTools.setToolEnabledForElement(enabledElement, 'ToolName', options);
// Disabled
cornerstoneTools.setToolDisabledForElement(enabledElement, 'ToolName', options);

# 附加说明

  • 有些工具可能只能以四种模式中的两种存在。例如,“缩放覆盖工具”只能是“启用”或“禁用”。尝试将其设置为“active”将使工具默认为“enabled”`。
  • 不同基本类型的工具或固有的复杂工具可能会稍微偏离这些准则。
  • 第三方工具可能不符合这些准则。

# 配置项

当切换工具模式的时候,你也可以去更新它内部配置。因为工具的配置项多种多样,不过也有一些通用的配置项。比如,所有和鼠标交互相关的工具,通过 mouseButtonMask 去指定哪个鼠标键去出发它的行为。为了更好的理解配置项是怎么应用的,请看以下示例:

// 设置工具的配置项 `{ mouseButtonMask: 1 }`
cornerstoneTools.setToolActive('ToolName', { mouseButtonMask: 1 });

// 工具的配置项不会变化
cornerstoneTools.setToolActive('ToolName');
cornerstoneTools.setToolActive('ToolName', null);
cornerstoneTools.setToolActive('ToolName', undefined);
cornerstoneTools.setToolActive('ToolName', {});

// 工具的配置项新增了一项 `{ isTouchActive: false }`
cornerstoneTools.setToolActive('ToolName', { isTouchActive: false });

//  上面的 `mouseButtonMask` 配置项的值被更改为 `2`
cornerstoneTools.setToolActive('ToolName', { mouseButtonMask: 2 });

# 通用配置项

TODO: 在 [BaseTool](../tool types/index.md#base tool) 上创建一个属性,该属性是工具内部使用的所有配置选项的字符串列表?然后在这里维护一个列表,指出每个属性的用途?

配置项 鼠标 触控 标注 刷子
mouseButtonMask x
preventHandleOutsideImage x
isTouchActive x

# 交互类型

🚧 This section needs content

# 策略

工具可以有多种操作策略。[BaseTool](../tool types/index.md#base tool)是所有工具的继承源,它接受与工具策略相关的两个参数:

Argument Type Description
strategies Object 一种 Object ,由 function 组成,以 evtconfiguration 作为参数并执行操作。
defaultStrategy string 要应用的默认策略的名称。名称应与“strategies”中的属性名称相同。

在实例化该工具时,activeStrategy 设置为 defaultStrategy 。如果没有 defaultStrategy ,则使用 strategies 的第一个函数。策略机制是完全可选的。

BaseTool 具有函数 applyActiveStrategy(evt,this.configuration) 将执行activeStrategy,并返回该策略返回的任何值。

可以通过将 tool.activeStrategy 设置为新值来更改策略。可以通过调用 setDefaultStrategy 将策略重置为默认值。

使用策略机制的工具的一个简单示例是 rotate Tool (opens new window).

# 混入

mixin 是一组成员函数,可以在实例化时添加到工具中,从而赋予它额外的行为。mixin 存储在顶级的 src/Mixins 目录中。

# 向工具添加 mixin

通过将数组传递给工具构造函数的 Mixins 参数,可以将 mixin 添加到工具中。数组的每个元素必须是一个字符串,其中包含要应用的 mixin 的名称。

例如,如果一个工具只有 EnabledDisabled 才有意义,那么可以将其命名为 enabledOrDisabledBinaryTool

export default class ExampleOverlayTool extends BaseTool {
  // Pass an array of mixins to the constructor.
  constructor(
    name = "ExampleOverlay",
    mixins = ["enabledOrDisabledBinaryTool"]
  ) {
    // Pass mixins to 'super' so that BaseTool's
    // Constructor can attach it to the class.
    super({
      name,
      mixins
    });
  }
}

由于这种混入,工具的模式现在将在设置为「Active」时切换到「Enabled」,在设置为「Passive」时切换到「Disabled」

# 注册新的混入

要创建新的mixin,请在 mixins 目录中创建一个包含一些函数的新文件,并在“export”中创建一个包含这些函数的 default 对象,例如:

// mixins/helloTool.js

function helloTool() {
  console.log("Hello Tool!");
}

export default {
  helloTool
};

然后在 mixins/index.js 文件内注册这个混入,这将允许通过其构造函数的 mixins 参数将其附加到工具:

// mixins/index.js

// Other imports
import helloTool from "./helloTool.js";

export default {
  // Other registered functions...
  helloTool
};

# measurement-data

🚧 This section needs content