AVIZO自动化

AVIZO自动化

AVIZO自动化

第9章《自动化、自定义和扩展》主要讲解了如何使用Avizo的自动化、自定义和扩展功能。以下是详细介绍:

9.1 模板项目

模板项目用于简化对相似数据集的重复任务处理。用户可以将原始项目保存为模板,以便在相同类型的数据上重复使用。模板项目可以通过右键菜单或“项目 > 创建对象”子菜单加载和执行。模板项目为自动化重复操作提供了便捷的途径。

9.2 Avizo启动
这一节描述了Avizo的启动选项,包括:

命令行选项:可用于配置Avizo启动时的行为,例如日志记录、禁用图形界面等。
环境变量:用户可以通过环境变量设置临时目录、启用或禁用特定功能(例如3D立体视图)。
用户定义的启动脚本:可以通过编写用户定义的启动脚本(如Avizo.init)定制Avizo的行为,包含注册文件格式、模块和编辑器等。

9.3 脚本编写

这一节介绍了如何使用脚本来控制Avizo,实现自动化和自定义任务。Avizo的脚本基于Tcl语言,用户可以通过编写Tcl脚本来操控Avizo的大部分功能,包括:

命令替换:使用括号[]执行命令并返回结果。
控制结构:支持if-else条件判断、for循环、while循环等控制结构。
用户自定义过程:使用proc定义新函数或过程,支持灵活参数列表和局部变量。
列表和字符串操作:Tcl中的所有内容都是通过列表构建的,提供了多个操作列表的命令。

9.4 使用MATLAB与Avizo集成

Avizo提供了与MATLAB的集成模块,允许用户从Avizo传递数据到MATLAB进行复杂计算,并将结果返回到Avizo中。通过这种方式,用户可以在Avizo中执行MATLAB脚本、调用用户自定义的MATLAB函数、以及使用字段结构等。

总的来说,第9章提供了Avizo的高级功能,允许用户通过模板、脚本编写和MATLAB集成来自动化和扩展工作流程 。

9.1 模板项目

这一节描述了如何使用模板项目。

9.1.1 模板项目说明

模板项目可以用于简化对一组相似数据的重复任务处理。模板项目是原始项目的副本,可以在相同类型的其他数据上重新应用。

9.1.1.1 如何保存模板项目

要创建模板项目,请从文件菜单中选择“另存项目为模板”(Save Project As Template)。这时会弹出一个输入选择对话框,列出所有可能的模板输入(当前的所有数据对象)。模板输入代表在执行模板时必须提供的数据集。您可以更改每个所选模板输入的标签。由于该标签会在模板执行期间显示出来,因此标签应当通用且有意义。默认标签是原始数据对象的名称。注意:未使用的数据对象会默认被过滤,但您可以通过选择“包含未使用的数据”(Include unused data)选项将其包含在模板项目中。

如果模板只包含一个输入,对话框会询问您是否希望将模板与该类型的数据关联。如果点击“确定”,则该模板会在右键菜单中的模板子菜单下(Templates submenu)对所有相同数据类型的对象可用。

最后,将弹出文件对话框以命名输出文件。文件名也是模板的名称,即将显示在模板菜单中的名称。内置的模板项目存储在“share/templates”文件夹中,但您可能没有足够的权限在该目录中创建新文件。

您可以将自定义模板保存在任何目录中。每次启动 Avizo 时,它们都会自动重新加载。

9.1.1.2 如何使用模板项目

内置的模板项目和已知的用户自定义模板项目会在Avizo启动时自动加载。加载模板并不意味着实例化模板项目。模板项目仅在用户请求时创建,例如通过“项目 > 创建对象…”菜单。一个例外是:如果用户通过“打开数据”对话框加载模板文件,则模板资源会被加载并执行。

如果模板与某种数据类型相关联,您可以使用该类型的数据对象的右键菜单创建实例。在这种情况下,将立即使用所选数据对象创建模板。

对于其他模板,您可以从“项目 > 创建对象…”菜单的模板子菜单中创建实例。模板也可能出现在宏按钮列表中。在这种情况下,模板执行时将出现以下对话框:

每个模板输入都会显示其模板输入名称和一个组合框,用于选择将用于该输入的数据集。每个组合框中的候选数据根据其数据类型进行过滤。您可以通过取消选中“检查输入类型”选项来禁用此过滤并显示项目视图中的所有数据。如果没有适合的数据对象,组合框将为空。您还可以随时选择“<加载文件…>”项,显示文件打开对话框并选择数据文件。

对于色彩映射的特殊处理:默认情况下,项目视图中已存在的色彩映射会按原样重新使用。例如,模板项目中的对象可能会受到范围变化的影响。您还可以选择不与现有对象共享色彩映射,方法是选择“独立色彩映射”选项。

9.2 Avizo 启动

这一节描述了一些与 Avizo 启动相关的选项,包括:

  • 命令行选项
  • 环境变量
  • Avizo 启动脚本

9.2.1 命令行选项

本节介绍 Avizo 支持的命令行选项。通常,在 Unix 系统上,Avizo 是通过位于 bin 子目录中的启动脚本启动的。这个脚本通常链接到 /usr/local/bin/Avizo 或类似位置。用户也可以定义一个指向 bin/start 的 Avizo 别名。

在 Windows 系统上,Avizo 通常通过开始菜单或桌面图标启动。不过,用户也可以直接调用 bin/arch-Win64VC10-Optimize/Avizo.exe 来启动。在这种情况下,支持与 Unix 系统相同的命令行选项。

Avizo 的语法如下:

1
Avizo [options] [files ...]

命令行中指定的数据文件将自动加载。除了数据文件外,还可以指定脚本文件。这些脚本将在程序启动时执行。

支持的选项如下:

  • help

打印命令行选项的简要说明。

  • version

打印 Avizo 的版本信息。

  • no stencils

指示 Avizo 不在其 3D 图形窗口中请求模板缓冲区。此选项可用于在某些低端 PC 图形板上利用硬件加速。

  • no overlays

指示 Avizo 不在其 3D 图形窗口中使用叠加平面。如果在远程显示上重定向 Avizo 时遇到问题,可以使用此选项。

  • no gui

启动 Avizo 而不打开任何窗口。此选项对于批处理模式下执行脚本很有用。

  • logfile filename

将控制台窗口中打印的所有消息也写入指定的日志文件。此选项尤其适用于与 -no gui 选项结合使用。

  • depth number

此选项仅在 Linux 系统上支持。它指定首选的深度缓冲区深度。Linux 系统上的默认值为 16 位。

  • style={windows | motif | cde}

此选项设置 Avizo 的 Qt 用户界面的显示样式。

  • debug

此选项仅适用于开发者版本。它会导致本地包以调试版本执行。默认情况下将使用优化代码。

  • cmd command [ - host hostname ] [ - port port]

向正在运行的 Avizo 应用程序发送 Tcl 命令。可以选择指定主机名和端口号。在 Avizo 控制台窗口中键入 app -listen 后,才能接收命令。

  • clusterdaemon

以 VR 守护程序模式启动,适用于集群从节点(Avizo XScreen 扩展)。这可能会被服务替代。有关更多信息,请参阅在线文档。

  • tclcmd command

在启动应用程序时执行 Tcl 命令。

  • edition { LiteEdition | AvizoEdition }

在特定版本下启动 Avizo。

9.2.2 环境变量

执行 Avizo 不需要特别的环境设置。在 Unix 系统上,某些环境变量(如共享库路径或 AVIZO_ROOT 目录)会由 Avizo 启动脚本自动设置。用户还可以设置其他环境变量来控制某些功能,这些变量列举如下。在 Unix 系统上,可以使用 setenv(适用于 csh 或 tcsh)或 export(适用于 sh、bash 或 ksh)来设置环境变量。在 Windows 上,可以在系统属性对话框中定义环境变量(Microsoft Windows)。

  • AVIZO_DATADIR

一个数据目录路径。此目录将用作文件对话框的默认目录。请注意,为了快速访问多个目录,您可以使用操作系统功能(例如在文件对话框中添加收藏夹位置列表),或者使用包含快捷方式或指向其他目录的链接的目录。

  • AVIZO_TEXMEM

指定以兆字节为单位的纹理内存量。如果未设置此变量,将应用一些启发式算法来确定系统上可用的纹理内存量。然而,这些启发式算法可能并不总是得出正确的值。在这种情况下,可以使用此变量来提高体积渲染模块的性能。

  • AVIZO_MULTISAMPLE

在高端图形系统上,默认使用多采样视觉。这种方式可以实现高效的场景抗锯齿。如果您希望禁用此功能,请将环境变量 AVIZO_MULTISAMPLE 设置为 0。请注意,在其他系统上,特别是在 PC 上,抗锯齿无法通过应用程序控制,而是必须直接在图形驱动程序中激活。

  • AVIZO_NO_LICENSE_MESSAGE

默认情况下,当您的 Avizo 许可证即将到期时,Avizo 会向控制台发出警告消息。这使您可以及时采取行动,防止在许可证到期时意外中断 Avizo 的使用。要禁用这些消息,请将此变量设置为 1。

  • AVIZO_NO_OVERLAYS

如果设置此变量,Avizo 将不会在其 3D 图形窗口中使用叠加平面。通过 -no overlays 命令行选项可以获得相同的效果。如果在远程显示上重定向 Avizo 时遇到问题,或者您的 X 服务器不支持叠加视觉,可以关闭叠加。

  • AVIZO_NO_SPLASH_SCREEN

如果设置此变量,Avizo 在初始化时不会显示启动画面。

  • AVIZO_LOCAL

指定包含用户定义模块的本地 Avizo 目录。此目录中的 IO 例程或模块将替代主 Avizo 目录中定义的例程或模块。此环境变量将覆盖开发向导中设置的本地 Avizo 目录(有关详细信息,请参阅 Avizo 程序员指南)。

  • AVIZO_SMALLFONT

仅适用于 Unix 系统。如果设置了此变量,即使屏幕分辨率为 1280x1024 或更高,所有在属性区中显示的端口也将使用小字体。默认情况下,小字体只会在较低分辨率的情况下使用。

  • AVIZO_XSHM

仅适用于 Unix 系统。如果您希望在 Avizo 的分割编辑器中禁止使用 X 共享内存扩展,请将此变量设置为 0。

  • AVIZO_SPACEMOUSE

如果 Avizo 发现连接了 Spacemouse(详见 http://www.3dconnexion.com ),Spacemouse 支持将自动启用。如果驱动程序已安装,则控制台窗口中会打印一条消息。通过 Spacemouse,您可以在 3D 查看器窗口中导航。支持两种模式:旋转模式和飞行模式。可以通过按下 Spacemouse 按钮 1 或 2 来切换两种模式。更多配置选项可能在 Avizo.init 文件中可用。
3Dconnexion Spacemouse 限制:

  • Mac OS X 不支持 Spacemouse。
  • Avizo 和 AvizoClue 应用程序会识别 Spacemouse。
  • 尚未完全支持六自由度运动。
  • Spacemouse 只能控制第一个查看器。
  • 在旋转模式下,无法平移相机或上下移动。
  • 在飞行模式下,无法绕物体旋转或上下移动。
  • 默认情况下,按钮 1 用于打开菜单,必须重新配置为“按钮 1”功能。

  • AVIZO STEREO ON DEFAULT

如果设置了此变量,则默认情况下 3D 查看器将以 OpenGL 原始立体模式打开。
这样,可以避免从单声道切换到立体模式时出现的屏幕闪烁。目前,该变量仅在 Unix 系统上受支持。

  • TMPDIR

此变量指定应将临时数据存储在哪个目录中。如果未设置,则此类数据将在 /tmp 下创建。此外,此变量由 Avizo 的作业队列解释。

9.2.3 用户自定义启动脚本

Avizo 可以通过提供用户自定义的启动脚本进行某些定制。默认的启动脚本名为 Avizo.init,位于 Avizo 安装目录的 share/resources/Avizo 子目录中。每次程序启动时,都会读取此脚本。此启动脚本的功能包括注册文件格式、模块和编辑器,以及加载默认的颜色映射。

如果在当前工作目录中找到名为 Avizo.init 的文件,则会读取该文件而不是默认的启动脚本。如果没有找到该文件,在 Unix 系统上会检查用户的主目录中是否存在名为 .Avizo 的启动脚本。下面是一个用户定义启动脚本的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 执行默认启动脚本
source $AVIZO_ROOT/share/resources/Avizo/Avizo.init 0

# 设置均匀的黑色背景
viewer 0 setBackgroundMode 0
viewer 0 setBackgroundColor black

# 为帮助浏览器选择非默认字体大小
help setFontSize 12

# 通过按 [F3] 键恢复摄像机设置
proc onKeyF3 { } {
viewer setCameraOrientation 1 0 0 3.14159
viewer setCameraPosition 0 0 -2.50585
viewer setCameraFocalDistance 2.50585
}

在此示例中,首先执行系统的默认启动脚本,以确保所有 Avizo 对象被正确注册。接着进行一些特定的设置,最后为功能键 [F3] 定义了一个快捷键过程。您也可以为其他功能键定义此类过程。此外,还可以定义类似 onKeyShiftF3 或 onKeyCtrlF3 的过程。这些过程在按下功能键同时按住 [SHIFT] 或 [CTRL] 键时执行。

9.3 脚本编写

本节描述如何在 Avizo 中使用脚本功能。

9.3.1 脚本编写介绍

本章专为高级 Avizo 用户而写。如果您不知道什么是脚本编写,那么很可能不需要本章中描述的功能。

除了通过图形用户界面的交互控制之外,大多数 Avizo 功能也可以通过特定的命令访问。这允许您自动化某些流程,创建用于管理日常任务或演示的脚本。Avizo 的脚本命令基于 Tcl(工具命令语言)。这意味着您可以使用 Tcl 编写带有 Avizo 特定扩展的命令脚本。

可以在 Avizo 的控制台窗口中键入命令,如第 8.1.13 节中所述。直接在控制台窗口中输入的命令将立即执行。或者,也可以将命令写入文本文件,然后作为整体执行。

本章内容如下:

9.3.2 Tcl 简介 提供了 Tcl 脚本语言的简短介绍。本节与 Avizo 相关性不大。

9.3.3 Avizo 脚本接口 解释了与脚本编写相关的 Avizo 特定命令和概念。包括全局命令参考。

9.3.5 Avizo 脚本文件 解释了编写和执行脚本文件的不同方法,包括脚本对象、资源文件和功能键绑定的 Tcl 过程的参考。

9.3.6 配置弹出菜单 描述了如何使用脚本命令配置对象的弹出菜单,并如何创建执行脚本的新条目。

9.3.7 注册拾取回调 描述了如何将脚本回调附加到对象或查看器中,并在用户拾取事件时调用它们。

9.3.8 Tcl 文件读取器 解释了如何注册用 Tcl 实现的自定义文件读取器。

9.3.2 Tcl简介

本章简要介绍Tcl脚本语言。如果你已经熟悉Tcl,你可以跳过本节。然而,请注意,输出到Avizo控制台时,应该使用echo命令,而不是puts命令。

本章并不打算涵盖Tcl语言的所有细节。要了解Tcl语言的完整文档或参考手册,请参阅John K. Ousterhout撰写的《Tcl and the Tk Toolkit》。许多其他关于Tcl的书籍也涵盖了Tk GUI工具包,但请注意,Tk在Avizo中并未使用。

你也可以在互联网上找到Tcl文档和参考手册,例如在http://www.scriptics.com ,或者通过搜索引擎查找”Tcl教程”或”Tcl文档”。

当你在Avizo控制台中键入Tcl命令时,命令会在按下回车键后立即执行。使用Avizo控制台提供的自动补全和历史功能,参见第8.1.13节(控制台窗口)。

9.3.2.1 Tcl列表、命令和注释

首先,请注意Tcl是区分大小写的:set和Set并不相同。

Tcl命令是由空格分隔的单词列表。第一个单词代表命令名称,后续的单词被视为该命令的参数。例如,尝试输入Avizo特定的命令echo,该命令将所有参数打印到Avizo控制台。尝试键入:

1
echo Hello World

这将输出字符串”Hello World”。注意,Tcl命令可以用分号(;)或换行符分隔。如果你想连续执行两个echo命令,可以这样:

1
echo Hello World ; echo Hello World2

或者这样:

1
2
echo Hello World
echo Hello World2

除了命令,你还可以在Tcl代码中插入注释。注释以 # 字符开头,并以换行符结束:

1
2
# 这是一个注释
echo Hello World

9.3.2.2 Tcl变量

Tcl中可以使用变量。变量表示某个特定的状态或值。使用Tcl代码,可以查询、定义和修改占位符的值。要定义一个变量,可以使用命令:

1
set name value

例如:

1
2
set i 1
set myVar foobar

请注意,在Tcl中,内部所有变量都是字符串类型。因为set命令要求一个作为变量值的参数,所以你必须对包含空格的值加引号:

1
set Output "Hello World"

或者:

1
set Output {Hello World}

要替换变量名为varname的值,需要在变量名前加上$符号。表达式$varname将被替换为变量的值。在上面的定义之后:

1
echo $Output

将会在控制台窗口中打印:

1
Hello World

同时,

1
echo "$i.) $Output"

将输出1.) Hello World。注意,对于使用双引号 “ 括起的字符串,会执行变量替换,但对于使用大括号{}括起的字符串,则不会进行替换。大括号内甚至允许换行符。然而,在Avizo控制台中不可能输入多行命令。

9.3.2.3 Tcl命令替换

在Tcl中进行数学计算时,可以使用expr命令,该命令将评估其参数并返回表达式的值。例如:

1
2
expr 5 / ( 7 + 3)
expr $i + 1

为了将像 expr 这样的命令的结果用于后续命令,必须使用 Tcl 中一个重要的机制:命令替换。命令替换由方括号 [] 表示。任何用方括号括起来的列表都会首先作为一个单独的命令执行,[…] 构造将被命令的结果替换。这类似于 Unix 命令 shell 中的反引号构造 …。例如,为了将变量 i 的值增加 1,可以使用:

1
set i [expr $i + 1]

当然,命令表达式可以任意嵌套。执行顺序总是从最内层的括号对到最外层的括号对:

1
echo [expr 5 * [expr 7 + [expr 3 + 3]]]

9.3.2.4 Tcl 控制结构

另一个重要的语言元素是 if-else 结构、for 循环和 while 循环。这些结构通常是多行结构,因此不适合在 Avizo 控制台中方便地输入。如果您想尝试下面的示例,可以使用您选择的文本编辑器将它们写入文件,如 C:\test.txt,然后通过输入以下命令执行该文件:

1
source C:\test.txt

首先介绍 if-then 机制。它用于在某个表达式求值为 “true” 时执行一些代码(意思是值不为 0):

1
2
3
4
5
6
7
8
9
set a 7
set b 8
if {$a < $b} {
echo "$a is smaller than $b"
} elseif {$a == $b} {
echo "$a equals $b"
} else {
echo "$a is greater than $b"
}

elseif 和 else 部分是可选的。可以使用多个 elseif 部分,但只能有一个 if 和一个 else 部分。

另一个重要结构是条件循环。像 if 命令一样,它基于检查条件表达式。与 if 不同的是,条件代码会多次执行,只要表达式求值为 true:

1
2
3
for {set i 1} {$i < 100} {set i [expr $i*2]} {
echo $i
}

实际上,这段代码等同于:

1
2
3
4
5
set i 1
while {$i < 100} {
echo $i
set i [expr $i * 2]
}

两个循环都会产生输出 1、2、4、8、16、32、64。
如果要对列表的所有元素执行循环,还有另一个非常方便的命令:

1
2
3
foreach x {1 2 4 8 16 32 64} {
echo $x
}

这将生成与上一个示例相同的输出。请注意,括号中的表达式是以空格分隔的单词列表。

9.3.2.5 用户自定义的Tcl过程

在Tcl中,使用 proc 命令来定义一个新的函数或过程。proc 需要两个参数:一个参数名称列表和要执行的Tcl代码。一旦定义了一个过程,它就可以像任何其他Tcl命令一样使用:

1
2
3
4
5
6
7
8
9
10
proc computeAverageA {a b} {
return [expr ($a+$b)/2.0]
}

proc computeAverageB {a b c} {
return [expr ($a+$b+$c)/3.0]
}

echo "average of 2 and 3: [computeAverageA 2 3]"
echo "average of 2,3,4: [computeAverageB 2 3 4]"

在这个例子中,参数列表定义了可以在过程体内使用的局部变量的名称(例如 $a)。return 命令用于定义过程的结果。这个结果是通过方括号 [] 进行命令替换时使用的值。

如果想定义一个具有可变数量参数的过程,必须使用特殊参数名称 args。如果参数列表中只包含这个词,新的命令将接受任意数量的参数,并且这些参数会作为一个列表传递给名为 args 的变量:

1
2
3
4
5
6
7
proc computeAverage args {
set result 0
foreach x $args {
set result [expr $result + $x]
}
return [expr $result / [llength $args]]
}

在这个例子中,llength 命令返回 args 列表中包含的元素数量。

注意,过程内定义的变量 result 具有局部作用域,这意味着它在过程体外是未知的。此外,全局变量的值在过程内也是未知的,除非使用 global 关键字声明该全局变量:

1
2
3
4
5
set x 3
proc printX {} {
global x
echo "x的值是 $x"
}

关于过程还有很多内容,例如参数传递、在过程外部上下文中执行命令等。请参阅Tcl参考书以获取这些高级主题。

9.3.2.6 列表和字符串操作

最后,在这简短的Tcl介绍结束时,我们回到列表的概念。基本上Tcl中的一切都是通过列表构造的,因此了解最重要的列表操作命令以及理解一些微妙的细节是非常重要的。

下面是一个示例,展示了如何获取一个输入的数字列表并构造一个输出列表,其中每个元素的值是输入列表中相应元素的两倍:

1
2
3
4
5
set input [list 1 2 3 4 5]
set output [list]
foreach element $input {
lappend output [expr $element * 2]
}

你可以将列表看作是用空格分隔列表元素的简单字符串。这意味着可以不用列表命令来实现与前面例子相同的结果:

1
2
3
4
5
set input "1 2 3 4 5"
set output ""
foreach element $input {
append output [expr $element * 2] " "
}

append命令类似于lappend,但它只是在现有字符串的末尾添加字符串。当你开始嵌套列表时,列表操作变得更加复杂。嵌套列表用嵌套的大括号表示,例如:

1
2
3
4
set input {1 2 {3 4 5 {6 7} 8 } 9}
foreach x $input {
echo $x
}

此命令的结果将是:

1
2
3
4
1
2
3 4 5 {6 7} 8
9

请注意,当构造列表时,Tcl会自动引用不是单个词的字符串。以下是一个示例:

1
2
3
set i [list 1 2 3]
lappend i "4 5 6"
echo $i

将输出:

1
1 2 3 {4 5 6}

你可以使用lindex命令来访问列表的单个元素。lindex接受两个参数:列表和所需元素的索引号,索引从0开始:

1
2
set i [list a b c d e]
echo [lindex $i 2]

将输出结果为 c:

9.3.3 Avizo 脚本接口

尽管 Tcl 语言本身并不是面向对象的,Avizo 的脚本接口是面向对象的。Avizo 项目视图中的每个对象都有一个与之关联的命令。此外,还有几个与 Avizo 中的全局对象(如查看器或 Avizo 主窗口)相关的全局命令。

与项目视图中的对象关联的命令(例如,“Ortho Slice”模块或“Isosurface”模块)仅在该对象存在时才存在。这些命令与项目视图中显示的对象名称相同。通常,特定对象的脚本接口包含许多不同的功能。Avizo 对象相关命令的通用语法是:

1
<object-name> <command-word> <optional-arguments> ...

例如,如果存在一个名为“Global Axes”的对象(从 Avizo 菜单中选择 View/Axis),那么你可以使用类似以下的命令:

1
2
3
"GlobalAxes" deselect
"GlobalAxes" select
"GlobalAxes" setIconPosition 100 100

注意:模块名称使用驼峰命名法。命令中可能出现这三个词:“Global Axes”、“GlobalAxes”或 GlobalAxes。

请记住使用 Avizo 控制台提供的自动补全和历史功能(参见第 8.1.13 节“控制台窗口”),以节省打字时间。

如果你已经使用过 Avizo,你可能注意到 Avizo 模块的参数和行为是通过其端口控制的。选择模块时,端口提供了用户界面来更改其值。所有端口也可以通过命令接口控制。其通用语法是:

1
<object-name> <port-name> <port-command> <optional-arguments> ...

例如,对于“Global Axes”,你可以输入:

1
2
3
"GlobalAxes" options setValue 1 1
"GlobalAxes" thickness setValue 1.5
"GlobalAxes" fire

当你输入这些命令时,你会注意到用户界面中的值会立即更改。然而,模块的计算方法在显式调用 fire 命令之前不会被调用。这允许你先为多个端口设置值,而无需在每个命令之后重新计算。然而请注意,一些模块在连接新输入对象时会自动重置其某些端口。在这种情况下,你可能需要在为每个端口设置值后调用 fire。

通常,端口名称与图形用户界面中显示的文本标签相同,除了删除了空格并且命令名称以小写字母开头。要找出特定模块的所有端口名称,请使用以下命令:

1
<object-name> allPorts

几乎所有端口都提供 setValue 和 getValue 命令。当然,参数数量和语法取决于端口。

对象相关命令类型<object-name> <port-name> setValue ...构成了典型 Avizo 脚本的 90% 以上。然而,除了端口命令外,许多 Avizo 对象还提供其他特定命令。特定模块的命令接口在用户参考指南中有详细描述。当选择模块时,单击属性区域中的“?”按钮可以快速找到相应页面。

作为快速帮助,输入对象名称而不加任何选项将显示该对象可用的所有命令。请注意,这也会显示未记录、未发布和实验性的命令。为了获取有关特定模块或端口命令的更多信息,你可以将其输入控制台窗口而不加任何参数,然后按 F1 键。这将打开帮助浏览器,显示命令的描述。

Avizo 对象是类层次结构的一部分。与 C++ 编程接口类似,脚本命令也可以由派生类从其基类继承。这意味着像轴对象这样的特定对象,除了其自己的特定命令外,还提供其基类中的所有命令。模块文档中提供了指向基类命令的链接。

9.3.3.1 预定义变量

在Avizo Tcl中存在一些预定义变量,它们具有特殊的含义。这些变量包括:

  • AVIZO ROOT: Avizo安装目录。

  • AVIZO LOCAL: 个人Avizo开发目录(仅限Avizo XPand扩展)。

  • SCRIPTFILE: 当前正在执行的Tcl脚本文件。

  • SCRIPTDIR: 当前正在执行的脚本所在的目录。

  • hideNewModules: 如果设置为1,初始创建的新模块图标将被隐藏。请谨慎设置此变量,并在严格必要时使用。为了避免意外地持续隐藏创建的模块(例如在脚本中断的情况下),应在使用后立即恢复此变量。

9.3.3.2 对象命令

Avizo模块和数据对象的基本命令接口在用户指南的参考部分的”对象”章节中进行了描述。对象命令的基本语法如下:

1
<object> <command> <arguments> ...

其中,<object> 是指对象的名称,<command> 表示要执行的命令。每个模块或数据对象可能定义自己的一组命令,除了其基类定义的命令之外。在”对象”章节中描述的命令由所有模块和数据对象提供。

全局命令将在下一节中介绍。

9.3.4 全局命令

本节列出了Avizo特定的全局Tcl命令。这些命令中的一些与Avizo中的某些全局对象相关联,如控制台窗口、主窗口或查看器窗口。其他命令如load或echo则不属于此类。以下命令分为不同的子部分:

• viewer command options (viewer)
• main window command options (theMain)
• console command options (theMsg)
• common commands for top-level windows
• progress bar command options (workArea)
• application command options (app)
• other global commands

  • 查看器命令选项(viewer)
  • 主窗口命令选项(theMain)
  • 控制台命令选项(theMsg)
  • 顶级窗口的通用命令
  • 进度条命令选项(workArea)
  • 应用程序命令选项(app)
  • 其他全局命令

9.3.4.1 视图命令选项

可以在控制台窗口中输入对视图的命令。语法为:

1
viewer [<number>] command

其中,<number> 指定要操作的视图。数值 0 表示主视图,可省略以方便操作。

命令:
1
viewer [<number>] snapshot [-offscreen [<width> <height>]] [-stereo] [-alpha] [-tiled <nx> <ny>] <filename> [filename2]

此命令截取当前场景的快照,并将其保存为指定的文件名。图像格式由文件名的扩展名自动决定。支持的格式列表包括:TIFF (.tif, .tiff)、SGI-RGB (.rgb, .sgi, .bw)、JPEG (.jpg, .jpeg)、PNM (.pgm, .ppm)、BMP (.bmp)、PNG (.png) 和 EPS (.eps)。如果没有提供视图编号,将从所有视图中截取快照,前提是从“视图”菜单中选择了2个或4个视图布局。

如果指定了 -offscreen 选项,将使用最大尺寸为 2048x2048 的屏幕外渲染。在这种情况下,即使是视图 0,也需要指定视图编号。如果没有明确指定宽度和高度,图像的尺寸将为当前视图的大小。

注意: 如果视图中有多个可见的透明对象,并且想使用屏幕外渲染,请将透明度模式设置为“Blend Delayed”,并在拍摄快照之前检查所有对象是否正确渲染。

如果使用了 -stereo 选项,将创建立体模式图像。在这种情况下,filename2 文件可用于指定保存立体图像第二个视图的文件。

如果使用了 -alpha 选项,将创建具有透明背景的快照图像。

如果使用了 -tiled nx ny 选项,将使用 nx 和 ny 指定的拼贴渲染进行渲染,在水平和垂直方向上各渲染nx和ny个拼贴。

viewer [<number>] setPosition <x> <y>
(仅限顶级模式)设置视图窗口相对于屏幕左上角的位置。如果在同一窗口中显示了多个视图,则设置顶级窗口的位置。

viewer [<number>] getPosition
返回视图窗口的位置。如果同一窗口中显示了多个视图,则返回顶级窗口的位置。

viewer [<number>] setSize <width> <height>
(仅限顶级模式)设置视图窗口的大小。宽度和高度指定的是实际的图形区域大小。窗口的大小可能会稍大一些,因为还包括视图装饰和窗口框架。

注意:当视图未按请求的大小调整时,控制台会打印警告消息。设置新大小时,可能出现以下情况导致视图未能按请求大小调整:

  • 视图在顶级窗口中,且给定的大小太小(例如:10x10)。
  • 视图不在顶级窗口中,且主窗口无法调整为更小的尺寸(例如,Mac上的统一标题和工具栏或具有最小宽度的停靠窗口阻止了主窗口调整大小)。

viewer [<number>] getSize
返回不带装饰和窗口框架的视图窗口大小。

viewer [<number>] setCamera <camera-string>
恢复所有相机设置。相机字符串应为 getCamera 命令的输出。

viewer [<number>] getCamera
此命令返回当前的相机设置,即位置、方向、焦距、类型和高度角(用于透视相机)或高度(用于正交相机)。这些值以 Avizo 命令的形式返回,可以执行这些命令以恢复相机设置。完整的命令字符串也可以传递给 setCamera 一次执行。

viewer [<number>] setCameraPosition <x> <y> <z>
定义相机在世界坐标中的位置。

viewer [<number>] getCameraPosition
返回相机在世界坐标中的位置。

viewer [<number>] setCameraOrientation <x> <y> <z> <a>
定义相机的方向。默认情况下,相机朝负z方向看,y轴向上。任何其他方向可以作为相对于默认方向的旋转来指定。旋转由一个旋转轴 x y z 以及旋转角度 a(以弧度为单位)指定。

viewer [<number>] getCameraOrientation
以与 setCameraOrientation 相同的格式返回当前相机的方向。

viewer [<number>] setCameraFocalDistance <value>
定义相机的焦距。焦距用于计算在交互查看模式下场景旋转的中心。

viewer [<number>] getCameraFocalDistance
返回当前相机的焦距。

viewer [<number>] setCameraHeightAngle <degrees>
以角度设置透视相机的高度角。减小角度会使视野变小,从而“放大”效果,类似于远摄镜头。如果不专门想改变相机的视野,通常更好的方法是将相机移得更近来放大对象。这条命令对正交相机无效。

viewer [<number>] getCameraHeightAngle
返回透视相机的高度角。

viewer [<number>] setCameraHeight <height>
设置正交相机视图体积的高度。此命令对透视相机无效。

viewer [<number>] getCameraHeight
返回正交相机的高度。

viewer [<number>] setCameraType <perspective|orthographic>
设置相机的类型,参数为透视(perspective)或正交(orthographic)。

viewer [<number>] getCameraType
返回当前相机的类型。

viewer [<number>] setTransparencyType <type>
此命令定义透明对象渲染策略。类型参数是介于0到8之间的数字,分别对应以下透明度模式:Screen Door、Add、Add Delayed、Add Sorted、Blend、Blend Delayed、Blend Sorted、Sorted Layers 和 Sorted Layers Delayed。建议使用模式8以获得最准确的结果,默认使用模式6。

viewer [<number>] getTransparencyType
返回当前使用的透明度模式。

viewer [<number>] setSortedLayersNumPasses <value>
当透明度模式为Sorted Layers或Sorted Layers Delayed时,此命令设置渲染的通过次数。通常,4次通过(默认值)能给出良好的效果。

viewer [<number>] getSortedLayersNumPasses
返回使用的渲染通过次数。

viewer [<number>] setBackgroundColor <r> <g> <b>
设置背景颜色,颜色值可以用RGB整数值(0到255)或小数(0.0到1.0)表示,也可以直接使用文本(如”white”)。

viewer [<number>] getBackgroundColor
返回主背景颜色,以RGB三元组(0到1之间的值)表示。

viewer [<number>] setBackgroundColor2 <r> <g> <b>
设置次背景颜色,次背景颜色用于非均匀背景模式。

viewer [<number>] getBackgroundColor2
返回次背景颜色,以RGB三元组(0到1之间的值)表示。

viewer setBackgroundMode <mode>
允许指定不同的背景模式。如果 mode 设置为 0,将显示均匀的背景。mode 1 表示渐变背景。mode 2 会显示棋盘格模式,这有助于理解透明对象的形状。最后,mode 3 在背景中绘制通过 setBackgroundImage 预定义的图像。

viewer getBackgroundMode
返回当前的背景模式。

viewer setBackgroundImage <imagefile> [<imagefile2>] [-stereo]
此命令允许在查看器背景中放置任意光栅图像。图像不得大于查看器窗口,否则会被裁剪。将通过文件扩展名自动检测图像文件格式,支持的格式与 snapshot 命令相同,除了 EPS 格式外。如果指定了第二个图像文件,并且使用的是立体渲染模式,则此文件将用作右眼图像。如果指定了 -stereo 选项且只有一个图像文件,则假设该文件包含左右眼的组合视图,并将自动分离这些视图。

viewer getBackgroundImage
返回通过 setBackgroundImage 定义的最后一个背景图像文件的文件名。如果指定了一对立体图像,则返回两个文件名。如果 setBackgroundImage 使用了 -stereo 选项,则也会返回该选项。

viewer [<number>] setAutoRedraw <state>
如果 state 为 0,则自动重绘模式关闭。在这种情况下,查看器窗口中的图像不会更新,除非发送 redraw 命令。如果 state 为 1,自动重绘模式再次开启。在脚本中,临时禁用自动重绘模式可能会很有用。

viewer [<number>] isAutoRedraw
返回自动重绘模式是否开启的状态。

viewer [<number>] redraw
此命令强制当前场景重新绘制。如果自动重绘模式已禁用,则只需要进行明确的重绘。

viewer [<number>] rotate <degrees> [x|y|z|m|u|v]
绕轴旋转相机。通过第二个参数指定轴,以下选项可用:x、y、z、m、u、v。

• x: the x-axis (1,0,0)
• y: the y-axis (0,1,0
• z: the z-axis (0,0,1)
• m: the most vertical axis of x, y, or z
• u: the viewer’s up direction
• v: the view direction

最后一个选项的作用与用户界面的旋转按钮相同。在大多数情况下,m 选项最合适。为了向后兼容,默认值为 u。

viewer [<number>] setDecoration <state>
此命令已废弃。

viewer [<number>] saveScene [-b] [-r] [-z] <filename>
将查看器中显示的所有几何体保存为 Open Inventor 3D 图形格式文件。请注意:由于许多 Avizo 模块使用了自定义的 Open Inventor 节点,场景通常无法在外部程序(如 ivview)中正确显示。可用的选项如下:

-b: 以二进制格式保存 Open Inventor 文件。
-r: 保存查看器中显示的几何体以及其他属性。
-z: 将 Open Inventor 文件保存为压缩格式(使用 zip 压缩)。

viewer [<number>] viewAll
重置相机,使整个场景可见。此方法会自动在查看器中显示第一个对象时调用。

viewer [<number>] show
打开指定的查看器,并确保查看器窗口位于屏幕上的所有其他窗口之上。

viewer [<number>] hide
关闭指定的查看器。

viewer [<number>] isVisible
此命令显示指定的查看器是否可见。

viewer [<number>] fogRange <min> <max>
设置雾效的衰减范围,该范围可通过视图菜单引入查看器场景。默认范围为 [0, 1]。范围内的值对应于场景点距相机的距离,其中离相机最近的点的值为 0,最远的点的值为 1。限制衰减范围意味着衰减将在指定最小值达到时开始,并在指定最大值达到时达到最大。由于雾效的最大衰减与不可见性相同,因此所有超过最大值的点将显示为背景。

viewer [<number>] setVideoFormat pal|ntsc
设置视图窗口的尺寸为 PAL 601 或 NTSC 601 分辨率,即 720x576 像素或 720x486 像素。当前装饰设置将被考虑在内。

viewer [<number>] setVideoFrame <state>
如果 state 为 1,则在查看器的覆盖平面中显示一个帧。这一帧显示了视频播放器上安全显示图像的区域。设置为 0 则关闭此帧。注意:在覆盖平面中显示的对象不会通过 snapshot 命令保存到文件中。

viewer [<number>] getViewerSpinAnimation
如果查看器旋转动画已启用,返回 1,否则返回 0。

viewer [<number>] setViewerSpinAnimation <state>
如果 state 为 1,启用查看器旋转动画。否则,传递 0 作为状态将关闭查看器旋转动画。注意:查看器旋转动画的状态会保存为首选项,因此重启 Avizo 后仍保持不变。

viewer [<number>] setViewing <state>
开启或关闭查看器的查看状态。如果 state 为 1,查看器进入查看模式;如果为 0,关闭查看模式。

设置查看器的查看状态。如果 state 为 0,查看器切换到交互模式;如果为 1,则切换到查看模式。

viewer [<number>] getViewing
返回当前查看状态:0 表示交互模式,1 表示查看模式。

viewer [<number>] linkViewers [<ID>...]
此命令用于将多个查看器链接在一起。它的操作与相应的 GUI 操作一致。

viewer [<number>] unlinkViewers [<ID>...] [all]
此命令用于取消已链接的查看器。

9.3.4.2 主窗口命令选项

命令 theMain 允许你访问并控制 Avizo 的主窗口。除了下列列出的特定命令选项外,所有在 9.3.4.4 节(顶层窗口的通用命令)中列出的子命令也可以使用。

命令:

theMain snapshot filename
创建并保存主窗口的快照图像。图像文件的格式由文件名扩展名决定。任何 Avizo 支持的标准图像文件格式都可以使用,例如 .jpg、.tif、.png 或 .bmp。

theMain setViewerTogglesOnIcons {0|1}
启用或禁用 Avizo 项目视图中对象图标上的橙色查看器切换。

theMain ignoreShow [0|1]
启用或禁用特殊用途的 “no show” 标志。如果设置了该标志,后续的 mainWindow show 命令将被忽略。这对于在 Avizo XScreen 扩展环境中运行标准 Avizo 脚本非常有用。如果不带参数调用该命令,则仅返回标志的当前值。

theMain showConsole [0|1]
启用或禁用 Avizo 中控制台窗口的显示。

9.3.4.3 控制台命令选项

命令 theMsg 允许您访问和控制 Avizo 控制台窗口。除了下列的特定命令选项外,9.3.4.4 节(顶层窗口的通用命令)中列出的所有子命令也可以使用。

命令:

theMsg error <message> [<btn0-text>] [<btn1-text>] [<btn2-text>]
弹出一个带有指定消息的错误对话框。该对话框可以配置多达三个不同的按钮。命令会阻塞,直到用户按下按钮。返回按下按钮的 ID。

theMsg warning <message> [<btn0-text>] [<btn1-text>] [<btn2-text>]
弹出一个带有指定消息的警告对话框。对话框可以配置多达三个不同的按钮。命令会阻塞,直到用户按下按钮。返回按下按钮的 ID。

theMsg question <message> [<btn0-text>] [<btn1-text>] [<btn2-text>]
弹出一个带有指定消息的问题对话框。该对话框可以配置多达三个不同的按钮。命令会阻塞,直到用户按下按钮。返回按下按钮的 ID。

theMsg overwrite <filename>
弹出一个对话框,询问用户是否可以覆盖指定的文件。如果用户点击“确定”,则返回 1,否则返回 0。

9.3.4.4 顶层窗口的通用命令

这些命令适用于所有打开独立顶层窗口的 Avizo 对象,特别是 Avizo 主窗口(theMain)、控制台窗口(theMsg)和查看器窗口(viewer 0)。例如,您可以使用相应的全局命令和 setPosition 或 getPosition 来设置或获取这些窗口的位置。

命令:
  • getFrameGeometry
    返回窗口的位置和大小,包括窗口框架。共返回四个数字。前两个数字表示窗口框架左上角相对于桌面左上角的位置,后两个数字表示窗口的大小(像素)。

  • getGeometry
    返回窗口的位置和大小,不包括窗口框架。共返回四个数字。前两个数字表示窗口左上角相对于桌面左上角的位置,后两个数字表示窗口的大小(像素)。

  • getPosition
    返回窗口左上角的位置,包括窗口框架。此结果与 getFrameGeometry 返回的前两个数字相同。

  • getRelativeGeometry
    返回窗口的位置和大小,包括窗口框架,以相对坐标表示。桌面的大小为 (1,1)。窗口的位置和大小以 0 到 1 之间的小数表示。

  • getSize
    返回窗口的大小,不包括窗口框架。此结果与 getGeometry 返回的后两个数字相同。

  • hide
    隐藏窗口。

  • setCaption <text>
    设置显示在窗口框架中的窗口标题。

  • setFrameGeometry <x y width height>
    设置窗口的位置和大小,包括窗口框架。需要指定四个数字,即 x 和 y 位置、窗口宽度和高度。

  • setGeometry <x y width height>
    设置窗口的位置和大小,不包括窗口框架。需要指定四个数字,即 x 和 y 位置、窗口宽度和高度。

  • setPosition <x y>
    设置窗口的左上角位置,包括窗口框架。需要指定两个数字,即 x 和 y 坐标。

  • setRelativeGeometry <x y width height>
    以相对桌面大小的比例设置窗口的位置和大小,包括窗口框架。输入值应该在 0 到 1 之间。

  • setSize <width height>
    设置窗口的大小,不包括窗口框架。需要指定两个数字,即窗口的宽度和高度。

  • show
    显示窗口。

  • showMinimized
    使窗口在图标状态下可见。

  • showMaximized
    使窗口在最大化状态下可见

9.3.4.5 进度条命令选项

workArea 命令允许你访问位于Avizo主窗口底部的进度条。你可以打印信息或检查是否按下了停止按钮。

命令
  • workArea setProgressInfo <text>
    设置要显示在进度条中的信息文本。该文本可用于描述某些计算期间的状态。

  • workArea setProgressValue <value>
    设置进度条的值。该参数必须是0到1之间的浮点数。例如,值0.8表示当前任务已经完成了80%。

  • workArea startWorking [<message>]
    激活停止按钮。调用此命令后,Avizo的停止按钮变为活动状态。在脚本中,可以通过调用workArea wasInterrupted来检查是否按下了停止按钮。当停止按钮处于活动状态时,除非在脚本中调用workArea stopWorking,否则无法与其他任何小部件进行交互。因此,不应直接在控制台窗口中输入此命令,而应仅在脚本文件或Tcl过程(procedure)中使用它。

  • workArea stopWorking
    停用停止按钮。当通过workArea startWorking启动的计算任务完成或用户按下停止按钮时,调用此命令。该命令还会恢复调用startWorking之前显示的进度信息文本。

  • workArea wasInterrupted
    检查用户是否按下了停止按钮。此命令应仅在workArea startWorking和workArea stopWorking之间使用。如果有多个嵌套计算任务且用户按下了停止按钮,那么在到达第一级之前,后续所有对wasInterrupted的调用都将返回true。

9.3.4.6 应用程序命令选项

app 命令提供了与Avizo本身相关的几个选项,而不是特定于某个对象或组件。

命令
  • app version
    返回当前的Avizo版本。

  • app uname
    返回简化的操作系统名称。

  • app arch
    返回Avizo的架构字符串,例如arch-Win32VC8-Optimize、arch-LinuxAMD64-Optimize。

  • app hostid
    返回创建Avizo许可证密钥所需的主机ID。

  • app listen [port]
    打开一个套接字,Tcl命令可以通过该套接字发送。可以选择性地指定TCP/IP端口。
    警告: 这可能会创建安全漏洞。除非在防火墙后且您明确知道自己在做什么,否则请勿使用此功能。

  • app close
    关闭Avizo Tcl端口。

  • app port
    返回Avizo Tcl端口号。如果套接字未打开,则返回-1。

  • app send <command> [<host> [<port>]]
    将Tcl命令发送到监听的Avizo实例。如果未指定主机或端口,则Avizo实例会将命令发送给自己。

  • app opengl
    检索有关所用 OpenGL 驱动程序的信息,包括版本号和支持的扩展。如果报告渲染问题,这些信息可以发送到热线。

  • app cluster
    返回当前节点状态,如果某个集群模式处于活动状态,则该状态可以是“主”或“从”,否则,则简单地为“单个”。

  • app memTotal [-k | -m | -g]
    返回系统的物理内存(以字节为单位)。可选开关 -k、-m、-g 分别将输出转换为千字节、兆字节或千兆字节。

  • app memAvail [-k | -m | -g]
    返回系统的可用内存(以字节为单位)。可选开关 -k、-m、-g 分别将输出转换为千字节、兆字节或千兆字节。请注意,根据操作系统的不同,输出可能与其他工具报告的输出不同。

9.3.4.7 其他全局命令

命令
  • addTimeout msec procedure [arg]
    安排在 msec 毫秒后调用 Tcl 过程。如果指定了 arg,它将作为参数传递给该过程。指定的过程只会被调用一次。如果需要,您可以在超时过程中再次安排它。例如:addTimeout 10000 echo {10 seconds are over.}

  • all [-selected | -visible | -hidden] [type]
    返回当前在项目视图中的所有 Avizo 对象的列表。如果指定了 type,则只返回具有该 C++ 类类型(或派生对象)的对象。搜索可以分别限于已选择的、可见的或隐藏的对象。例如:all -hidden HxColormap.

  • aminfo [-a outfile|-b outfile] Avizo-File
    如果只使用文件名作为参数,此命令将打开必须是 Avizo 数据格式的文件并打印头信息。如果使用 -a 或 -b 选项,则指定为参数的输出文件 outfile 将分别以 ASCII (-a) 或二进制 (-b) 格式写入。因此,aminfo 可用于将二进制 Avizo 数据转换为 ASCII,反之亦然。

  • clear
    清除控制台窗口。

  • create class name [instance name]
    创建 Avizo 对象(如模块或数据对象)的实例。返回实例名称。请注意,数据对象通常不是通过这种方式创建的,而是通过从文件加载它们。例如:create HxOrthoSlice MySlice.

  • dso options
    控制动态库(“动态共享对象”)的加载。提供以下选项:

addPath path ...: 添加路径到加载动态库时搜索的目录列表中。
verbose {0|1}: 开启或关闭与动态库相关的调试信息。
open <package>: 尝试加载指定的动态库。只需指定包名,例如 hxfield。此名称将自动转换为平台相关的名称,例如 Linux 上的 libhxfield.so 或 Windows 上的 hxfield.dll。
unloadPackage <package>: 卸载(如果可能)指定的动态库。
execute <package> <function>: 执行在指定动态库中定义的函数。

  • echo args
    将其参数打印到 Avizo 控制台。请使用此命令,而不是原生的 Tcl 命令 puts,后者会打印到标准输出。

  • help arguments
    不带参数时,打开 Avizo 帮助浏览器。

  • httpd [port]
    启动内置的HTTP服务器。HTTP服务器将交付任何请求的文档。如果请求的文档以“.hx”结尾,Avizo将不会交付它,而是将其作为Tcl脚本执行。这可以用于从网页浏览器控制Avizo。警告:该命令可能会产生安全漏洞,除非你在防火墙后且清楚自己在做什么,否则不要使用此功能。

  • limit {datasize | stacksize | coredumpsize} size
    更改进程限制。仅适用于Unix平台。使用“unlimited”作为无限制的大小。大小必须以字节为单位指定。或者,你可以使用1000k表示1000千字节或1m表示1兆字节。

  • load [fileformat] options files
    从一个或多个文件中加载数据。可以选择指定文件格式以覆盖Avizo的自动文件格式识别。文件格式使用与在Avizo文件对话框中的文件格式组合框中显示的标签相同。使用全局命令fileFormats可以获得Avizo支持的所有文件格式列表。可以使用FTP或HTTP协议读取远程文件。

其他选项包括:

  • browse:显示打开数据窗口。
  • avizoscript:打开Avizo脚本文件。
  • avizo:Avizo的本地通用文件格式。用于加载许多不同的数据对象,如在规则或四面体网格上定义的字段、分割结果、颜色映射或顶点集(如地标)。
  • dataOnly:阻止导入器创建显示模块,适用于hx文件。

继续翻译如下:

  • load [fileformat] options files

从一个或多个文件中加载数据。可以选择指定文件格式以覆盖Avizo的自动文件格式识别。文件格式使用与在Avizo文件对话框中的文件格式组合框中显示的标签相同。使用全局命令fileFormats可以获得Avizo支持的所有文件格式列表。可以使用FTP或HTTP协议读取远程文件。

其他选项包括:

  • browse:显示打开数据窗口。
  • avizoscript:打开Avizo脚本文件。
  • avizo:Avizo的本地通用文件格式。用于加载许多不同的数据对象,如在规则或四面体网格上定义的字段、分割结果、颜色映射或顶点集(如地标)。
  • dataOnly:阻止导入器创建显示模块,适用于hx文件。

Options for raw data:
load -raw FileName Endianess IndexOrder
DataType nDataVar dimX dimY dimZ
xMin xMax yMin yMax zMin zMax

Options for DICOM data:

  • nodialog: option prevent the Dicom dialog box from being shown.

  • mem
    Prints out some memory statistics.

  • quit
    Immediately quits Avizo.

  • remove fobjectname | -all | -selectedg
    Removes objects from Project View.
    • objectname: the specified Avizo object.
    • -all: all objects.
    • -selected: selected objects.

从项目视图中删除对象。
• objectname:指定的 Avizo 对象。
• -all:所有对象。
• -selected:选定对象。

  • removeTimeout procedure [arg]
    Unschedules a Tcl procedure previously scheduled with addTimeout.
    取消先前使用 addTimeout 安排的 Tcl 过程。

  • rename objectname newname
    Changes instance name of an object. Identical to objectname setLabel newname, except that it
    returns 1 if successful, and nothing if unsuccessful.
    更改对象的实例名称。与 objectname setLabel newname 相同,不同之处在于如果成功则返回 1,如果不成功则不返回任何内容。

  • sleep sec
    Waits for sec seconds. Avizo will not process events in that time.
    等待 sec 秒。Avizo 将不会在这段时间内处理事件。

  • source filename
    Loads and executes Tcl commands from the specified file. If the script file contains the extension
    .hx, the load command may be used as well.
    从指定文件加载并执行 Tcl 命令。如果脚本文件包含扩展名 .hx,也可以使用加载命令。

  • system command
    Executes an external program. Do not use this unless you know what you are doing.
    执行外部程序。除非您知道自己在做什么,否则不要使用此功能。

  • saveProject
    Saves current project. If the project is not previously saved, then the project will be saved in the
    Avizo root dir as Untitled.hx.
    保存当前项目。如果之前未保存该项目,则该项目将作为 Untitled.hx 保存在 Avizo 根目录中。

  • saveProjectAs [-forceAutoSave | -packAndGo] arg
    A copy of the current project will be saved as arg in Avizo root dir.(e.g., saveProjectAs
    myProject). When using a path, a full path needs to be specified and a .hx extension needs to be
    added on the project name (e.g., saveProjectAs c:/work/myProject.hx). Optionally, a
    forceAutoSave parameter can be specified to force auto saving of modified data without displaying
    a warning dialog. If parameter packAndGo is specified, in the same folder where the project file
    is saved, a new folder will be created and it will contain all data necessary for loading the saved
    project. Note: If a file exists it will not be overwritten.
    当前项目的副本将作为 arg 保存在 Avizo 根目录中。(例如,saveProjectAs
    myProject)。使用路径时,需要指定完整路径,并在项目名称上添加 .hx 扩展名(例如,saveProjectAs c:/work/myProject.hx)。或者,可以指定 forceAutoSave 参数以强制自动保存修改后的数据而不显示警告对话框。如果指定了参数 packAndGo,则在保存项目文件的同一文件夹中,将创建一个新文件夹,其中包含加载已保存项目所需的所有数据。注意:如果文件存在,则不会覆盖它。

  • theObjectPool setSelectionOrder ffirst objectg fsecond objectg...
    This command reorders the selection so that it matches the given object order. Selected objects not contained inside this list will be moved at the end of the selection (their relative order will not be
    changed though).
    此命令将重新排列所选内容,使其与给定的对象顺序相匹配。不包含在此列表中的所选对象将移动到所选内容的末尾(但它们的相对顺序不会改变)。

  • thePreferences [save | load] filename
    This command saves or loads preferences to/from the file specified as filename.
    此命令将首选项保存到指定为文件名的文件中,或从指定为文件名的文件中加载首选项。

  • theProperties [show | hide]
    This command shows or hides the Properties panel in Avizo.
    此命令显示或隐藏 Avizo 中的属性面板。

  • theProjectView [show | hide]
    This command shows or hides the Project View panel in Avizo.
    此命令显示或隐藏 Avizo 中的项目视图面板。

  • fileFormats
    Shows all file formats which can be used in Avizo.
    显示可在 Avizo 中使用的所有文件格式。

9.3.5 Avizo 脚本文件

值得注意的是,一个 Avizo 项目本质上就是一个 Tcl 脚本,它能够重新生成当前的 Avizo 状态。因此,通常可以通过交互式地创建一个 Avizo 项目,将其保存为“保存项目”,并使用它作为脚本编写的起点。

在 Avizo 中执行 Tcl 命令的最简单方式是在 Avizo 控制台窗口中输入命令。然而,对于像循环或过程这样的多行结构,使用这种方式并不实用。在这种情况下,建议将 Tcl 代码写入文件,并通过 source 文件名 命令执行该文件。你还可以在一个文件中使用 source 命令以包含另一个文件的内容。

另一种方法是使用 load 文件名 命令或通过文件菜单中的“打开项目…”选项并使用文件浏览器加载文件。不过,要让 Avizo 识别该文件格式,文件名必须以 .hx 结尾,或者文件内容必须以以下标题行开头:

1
# Avizo Script

在 Avizo 启动时,有一些 Tcl 文件会被自动加载。启动时,程序会查找当前目录或主目录中的 .Avizo 文件(详见 9.2.3 节,启动脚本)。如果没有找到这样的用户自定义启动脚本,默认的初始化脚本 Avizo.init 将从 $AVIZO_LOCAL/share/resources/Avizo 或 $AVIZO_ROOT/share/resources/Avizo 目录加载。该脚本随后会读取所有 .rc 文件,这些文件用于注册模块和数据类型。因此,用户可以通过简单地向该目录添加新的 .rc 文件或修改 Avizo.init 文件来自定义 Avizo 的启动行为。

另一种执行 Tcl 代码的方式是定义与功能键相关联的过程。如果存在名为 onKeyF2、onKeyF3、…、onKeyShiftF2、…、onKeyCtrlF2、… 等的预定义过程,当相应的键在 Avizo 主窗口、控制台窗口或查看器窗口中按下时,这些过程将被自动调用。要定义这些过程,可以将其写入一个文件并使用 source 加载,或者将其写入 Avizo.init 或某个 .rc 文件中。例如:

1
2
3
4
proc onKeyF2 { } {
echo "Key F2 was hit"
viewer 0 viewAll
}

注意:
某些功能键已保留给 Avizo 特定的操作。例如,[F1] 永远用于帮助,[F2] 在项目视图或树视图中用于对象重命名。

最后,Tcl 脚本也可以在 GUI 中表示并与用户界面结合使用。在 Avizo 中,这被称为脚本模块。

9.3.6 配置弹出菜单

在 Avizo 中,所有可以附加到数据对象的模块都会列在对象的弹出菜单中,该菜单通过右键单击对象图标激活。对于某些应用来说,在创建新模块后使用 Tcl 命令自定义这些模块是有意义的。有时还需要在对象的弹出菜单中添加新条目,以执行特定的脚本。本节将介绍如何通过修改 Avizo 资源文件或创建新文件来实现这些目标。

Avizo 的资源文件位于目录 $AVIZO_ROOT/share/resources 中,其中 $AVIZO_ROOT 表示 Avizo 的安装目录。资源文件实际上是普通的脚本文件,只是使用 .rc 作为后缀。当 Avizo 启动时,资源目录中的所有资源文件都会被读取。在资源文件中,可以使用特殊的 Tcl 命令注册模块、编辑器和 IO 例程。注册一个模块意味着指定它在弹出菜单中的名称,它可以附加的对象类型,模块所在的共享库或 DLL 的名称,等等。例如,Multi-Thresholding 模块通过以下命令在文件 hxlattice.rc 中注册:

1
2
3
4
5
6
7
module -name "Multi-Thresholding" \
-check { ![$PRIMARY hasInterface HxLabelLattice3] &&
([$PRIMARY primType]<3 || [$PRIMARY primType]==7 || [$PRIMARY primType]==8) } \
-primary "HxUniformScalarField3 HxStackedScalarField3" \
-category "{Image Segmentation}" \
-class "HxLabelVoxel" \
-dso "libhxlattice.so"

该命令的不同选项具有以下含义:

  • 选项 -name 指定模块的名称或标签,它将显示在弹出菜单中。
  • 选项 -primary 表示该模块可以附加到类型为 HxUniformScalarField3 或 HxStackedScalarField3 的数据对象上。这意味着 Multi-Thresholding 只会包含在这些对象的弹出菜单中。
  • 选项 -check 指定一个附加的 Tcl 表达式,该表达式在菜单弹出之前会被执行。如果表达式失败,模块将从菜单中删除。对于 Multi-Thresholding 模块,它会检查输入对象是否提供了 HxLabelLattice3 接口,即输入是否是一个标签场。尽管标签图像可以被视为 3D 图像,但对其进行阈值分割是没有意义的。因此,Multi-Thresholding 仅对原始 3D 图像提供,而不适用于标签场。还会检查输入的原始数据类型(有符号/无符号整数、浮点、短整型等)。这里,Multi-Thresholding 模块不支持浮点或双精度标签图像输入。
  • 选项 -category 表示 Multi-Thresholding 应该出现在主弹出菜单的 “Image Segmentation” 子菜单中。如果模块不应出现在子菜单中,而是直接在弹出菜单中显示,则应使用类别 Main。
  • 选项 -class 指定模块的内部类名称。对象的内部类名称可以使用命令 getTypeId 检索。正是这个类名称必须用于上述的 -primary 选项,而不是通过 -name 定义的对象标签。
  • 最后,选项 -package 指定定义该模块的包(共享库或 DLL)。

除了这些标准选项,还可以使用额外的 -proc 选项指定在创建模块后执行的额外 Tcl 命令。例如,假设你在一个医疗项目中,需要识别头部 CT 图像中的立体定位标记。此时,可以在弹出菜单中添加一个 Multi-Thresholding 模块的自定义版本,并预定义适当的材质名称和阈值。可以通过在 $AVIZO_ROOT/share/resources 目录中添加一个新资源文件,或者直接在 hxlattice.rc 文件中添加以下命令来实现:

1
2
3
4
5
6
7
8
9
10
module -name "Stereotaxy" \
-primary "HxUniformScalarField3 HxStackedScalarField3" \
-check { ![$PRIMARY hasInterface HxLabelLattice3] } \
-category "{Image Segmentation}" \
-class "HxLabelVoxel" \
-package "hxlattice" \
-proc { $this regions setValue "Exterior Bone Markers"; \
$this fire; \
$this boundary01 setValue 150; \
$this boundary12 setvalue 300 }

上述 Tcl 代码中的变量 $this 指的是新创建的模块,即 Multi-Thresholding 模块。注意,这些命令是在模块连接到弹出菜单的源对象之前执行的。某些模块在连接到新的输入对象时会进行一些特殊的初始化,这些初始化可能会覆盖使用自定义 -proc 选项通过 Tcl 命令设置的值。在这种情况下,可以通过以下命令显式连接模块到输入对象:

1
2
$this data connect $PRIMARY;
$this fire;

其中 Tcl 变量 $PRIMARY 指的是输入对象。同样,该变量也用于上述 -check 选项中定义的 Tcl 表达式。

除了基于现有模块创建自定义弹出菜单条目外,还可以定义完全新的条目,这些条目只执行 Tcl 命令。例如,我们可以在每个 Avizo 对象的弹出菜单中添加一个新的子菜单“编辑”,并在此处放入通常包含在 Avizo 主窗口的“编辑”菜单中的“隐藏”、“删除”和“复制”命令。这可以通过以下方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
module -name "Remove" \
-primary "HxObject" \
-proc { remove $PRIMARY } \
-category "Edit"
module -name "Hide" \
-primary "HxObject" \
-proc { $PRIMARY hideIcon } \
-category "Edit"
module -name "Duplicate" \
-primary "HxData" \
-proc { $PRIMARY duplicate } \
-category "Edit

当然,也可以使用 -proc 命令执行普通的 Avizo 脚本,甚至 Avizo 脚本对象。

9.3.7 注册点击回调函数

点击回调函数是附加到模块或查看器上的 Tcl 过程。当点击事件发生在目标上时,会调用该回调函数。可以通过在模块或查看器上使用 Tcl 命令 setPickCallback 来注册此类回调:

1
2
<module> setPickCallback <proc> [<EventType>]
viewer <n> setPickCallback <proc> [<EventType>]

每个模块或查看器只能附加一个回调。为了分离回调,只需调用注册命令而不带参数:

1
2
<module> setPickCallback
viewer <n> setPickCallback

可选的 <EventType> 参数用于指定触发回调的事件类型。其他事件将被忽略。该参数可以取以下值:

  • MouseButtonPress, MouseButtonRelease(任意鼠标按钮)
  • VRButtonPress, VRButtonRelease(任意3D按钮)
  • MouseButton1Press, MouseButton1Release 等(特定的鼠标按钮)
  • VRButton0Press, VRButton0Release 等(特定的3D按钮)

默认值为 MouseButton1Press。

实际的回调过程 <proc> 预期接收一个参数,该参数被解释为一个关联数组,并编码所有点击信息。定义的元素如下:

  • object:被点击几何体所属的 Avizo 对象的名称
  • x:被点击点的 x 坐标
  • y:被点击点的 y 坐标
  • z:被点击点的 z 坐标
  • idx:被点击元素的索引
  • stateBefore:事件发生之前的修饰符状态
  • stateAfter:事件发生之后的修饰符状态

回调过程应返回 0,如果未处理点击事件,这样其他回调过程可以被调用。以下是一个示例:

1
2
3
4
5
proc pickCallback arg {
array set a $arg
echo "$a(object) : picked element $a(idx)"
return 1
}

请注意,任何模块都可以向该参数数组添加特定信息。所有元素可以通过以下方式显示:

1
2
3
4
proc pickCallback arg {
echo "arg = { $arg }"
return 1
}

因此,一些 Avizo 模块会追加额外的数据:

  • Vertex View:idx 是被点击的点索引
  • Point Cloud View:idx 是被点击的点索引
  • Line Set View:idx 是被点击的线索引,pt0 和 pt1 是被点击段的两个点
  • Surface View:idx 是被点击的三角形索引
  • Hexa/Tetra Grid View:idx 是被点击的三角形索引,tetra0 和 tetra1 是相邻的四面体
  • Grid Boundary:idx 是被点击的三角形索引,originalIdx 是网格中的索引,tetra0 和 tetra1 是相邻的四面体

9.3.8 文件读取器在Tcl中

本节介绍如何注册一个由Tcl实现的自定义文件读取器。

首先,需要在全局作用域中声明Tcl读取器函数。该函数必须接受一个文件列表作为输入参数,并返回成功读取的文件数量。

1
2
3
4
5
proc myReaderInTcl {args} {
echo "myReaderInTcl $args"
# 其他相关处理
return 1
}

接着,必须使用以下模板将Tcl读取器函数注册到目标文件格式声明中:

1
dataFile -name "MyFormat" ... -package hxcore -load hxReadByTcl -loadArgs "-cmd myReaderInTcl"

使用 -loadArgs 来指定自定义的Tcl读取器函数。参数 -package hxcore -load hxReadByTcl 需按原样填写,不做修改。这些参数用于设置内部包装器,该包装器将调用Tcl解释器。

可以在Tcl脚本中声明自定义读取器,或将其包含在一个资源文件中,在应用程序启动时加载。

9.4 使用 MATLAB 与 Avizo

本节介绍如何在 Avizo 中使用 MATLAB 脚本。

9.4.1 使用 MATLAB 脚本

在本教程中,您将学习如何通过使用 MATLAB 计算模块(The MathWorks, Inc.)将复杂的计算集成到 Avizo 中。

为了使用 MATLAB 计算模块,MATLAB 必须正确安装在您的计算机上。此外,为了使该模块能够与 MATLAB 计算引擎建立连接,您可能需要注册 MATLAB 引擎(在 Windows 上),并根据您的系统设置环境变量以包含 MATLAB 库或程序在搜索路径中。请参阅 MATLAB 计算模块的文档以了解安装细节和限制。

本教程,作为在线文档提供,涵盖了以下主题,通过各种示例进行讲解:

  • 加载和执行 MATLAB 脚本。
  • 在 Avizo 和 MATLAB 之间传递各种数据类型,并将数据导出回 Avizo。
  • 使用字段结构。
  • 使用时间滑块控制脚本变量。
  • 从脚本中调用用户自定义的 MATLAB 函数。
  • 你可以通过这些步骤来学习如何将 MATLAB 的复杂计算功能与 Avizo 集成,从而执行更加精确和复杂的数据处理任务。

Python Scripting

Amira-Avizo Software and PerGeos Software Python Integration

Amira-Avizo Software | Introduction to Python scripting

Thermo Fisher Python API documentation

11.6 Python 脚本编写

本节描述了如何在Avizo中使用Python脚本。

11.6.1 Python 文档

本章按如下方式组织:

11.6.1.1 Python 简介
11.6.1.2 内嵌 Python 的使用
11.6.1.3 常见的全局命令
11.6.1.4 模块管理
11.6.1.5 脚本对象
11.6.1.6 Python 环境和包管理器
11.6.1.7 Python 包列表
Avizo Python API 文档可以在此处查看。

安装文件’\share\doc\python\html\index.html’

11.6.1.1 Python 简介

什么是Python

Python是一种高级的、面向对象的、解释型语言,首次实现于1989年。
(https://www.python.org/dev/peps/pep-0020/)

• Beautiful is better than ugly
• Explicit is better than implicit
• Simple is better than complex
• Complex is better than complicated
• Readability counts

  • 美比丑好
  • 明确比隐含好
  • 简单比复杂好
  • 复杂比难懂好
  • 可读性很重要
  • 包含的内容

Avizo 使用 Python 3.5.2。关于如何使用Python 3.X的详细信息可以在以下链接找到:
https://docs.python.org/3.5/tutorial/index.html 。许多包都已包含在Python的安装中(参见此处的Python包列表)。Numpy 和 Scipy 是此安装中包含的两个最流行的Python包。

Numpy 是用于处理多维数组的扩展,它允许元素操作、比较、逻辑操作、统计等。Numpy数组在C中实现,计算速度更快。更多信息请参见:http://www.numpy.org/

Scipy 是一个提供科学计算工具的扩展,例如插值、积分、图像处理、线性代数、信号处理和统计。更多信息请参见:http://www.scipy.org/

从 Python 2 迁移到 Python 3

Python 2 和 Python 3 之间存在一些兼容性问题。关于迁移到Python 3的官方文档可以在这里找到:
https://docs.python.org/3.5/howto/pyporting.html

11.6.1.1.1 使用 Python

本节并不旨在涵盖Python语言的所有应用和细节。要了解更多关于Python、Scipy和Numpy的信息,请参阅前一节中的链接。要了解Python如何与Avizo交互,请继续阅读第11.6.1.2节《内嵌Python的使用》。

Python控制台

可以通过 Windows > Consoles 访问控制台。控制台面板具有带有多个不同工具的标签界面。控制台充当Python解释器,因此任何编写的命令在按Enter键后将立即执行。执行后将显示赋值或返回值。

从左到右图标:

  • 删除此内容:删除此解释器中显示的所有内容
  • 删除 Pythonic 对象:这会从 Avizo 的工作区中删除控制台内创建的所有 Python 对象
  • 重定向所有输出:这会将所有解释器的所有输出推送到主控制台
  • 重定向此输出:这会将所有当前控制台的输出推送到主控制台

控制台充当 Python 解释器,因此按下 Enter 后将立即执行任何书面命令。执行后将显示赋值或返回值。

常用快捷键和命令
  • TAB
    在控制台没有编写任何内容时,按下TAB键会自动补全以下命令 hx_project.get(module),该命令将为对象创建一个Python句柄。当控制台中有文本时,TAB键将尝试从可用方法、属性和模块列表中自动补全当前字符串。选中的项目会被补全。

  • UP or DOWN
    这些按钮可以循环浏览您最近的历史记录。UP按钮可以检索上一个命令,而DOWN按钮可以检索后续命令。

11.6.1.1.2 关于Python的注意事项
软件包

Python是一种面向对象的语言,这意味着代码通常会被分解为类,在实例化时变量和方法可以被对象继承。

这种方式可以避免重复编写经常使用的功能。关于Python面向对象编程(OOP)的更多信息,可以在以下链接中找到:Python类和对象教程

软件包是类、方法和变量的集合,可以被导入到Python的命名空间中。例如,如果用户想要计算sin(π/2),首先需要将Numpy软件包导入命名空间:

1
>>>import numpy

Numpy软件包包含一个sin(x)方法,可以用于计算sin(π/2):

1
2
>>>numpy.sin(3.1415/2)
0.99999999892691405

Numpy已经包含了一个全局变量π,可以通过以下方式访问:

1
2
3
4
>>>numpy.pi
3.141592653589793
>>>numpy.sin(numpy.pi/2)
1.0

导入软件包时,可以将其赋值给变量以简化代码:

1
2
3
>>>import numpy as np
>>>np.sin(np.pi/2)
1.0
语法

Python支持多种不同的对象类型:

类型 描述 示例
Number Integers, floats, complex, booleans 1, 1.05, 3j+2, 3>2 is True
String List Sequence of characters Container to group items that can be changed “String of charaters” [1, 5, “Dragon”, 948.5]
Tuple Container to group items that cannot be changed (948.5, “Dragon”, 5, 1)
Dictionary Associated arrays with unique keys {‘a’:99, ’b’:’red’, ’c’:’balloons’}
Array Vectorized numeric array optimized for C numpy.ones ((10,5))

有些类型通过特定的字符标识。例如,单引号或双引号用于创建字符串:

1
2
>>>a = '这是一个字符串。'
>>>b = "这也是一个字符串。"

列表通过方括号进行赋值:

1
>>>c = [1, 5, "Dragon", 948.5]

对象之间可以使用标准语法进行操作:

1
2
3
4
5
6
+  加法        ==  相等
- 减法 != 不相等
* 乘法 > 大于
/ 除法 < 小于
** 指数运算 <= 小于或等于
% 取余数 >= 大于或等于

某些关键词是保留用于全局变量或执行特定功能的。应尽量避免将这些关键词作为变量使用:

1
and, as, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, with, yield

关于Python语法和对象类型的更深入的讨论可以在官方教程中找到:Python官方教程

11.6.1.2 嵌入式Python的使用

11.6.1.2.1 概述

与TCL类似,Python已通过Pythonic API在Avizo中实现。Avizo的特定命令允许你访问模块中包含的信息和功能。通过Python与Avizo进行交互有两种主要方式。第一种方式是通过Python控制台,它与TCL控制台分离,这是一个解释器。控制台的基本功能,如Tab自动补全,已经在第11.6.1.1节“Python简介”中描述。

第二种方式是通过脚本模块在Avizo中使用Python。Python脚本模块允许你继承预定义的PyScriptObject类的属性,然后覆盖这些属性,以创建与Avizo集成的扩展。脚本模块的行为类似于Avizo中的常规模块,并可以通过资源文件伴随出现在对象弹出菜单中。资源文件仍然必须用TCL编写。PyScriptObject类中包含以下四种方法,供你方便使用:

  • __init__():构造函数方法,可以包含在项目视图中创建脚本对象时运行的代码。
  • update():可以调用update方法来更新脚本对象在属性面板中的GUI。
  • compute():通常包含主要代码的compute方法应在需要进行计算时调用。
  • __del__():这个析构函数方法可以包含帮助在删除模块时清理命名空间的代码。
11.6.1.2.2 示例:与模块交互

以下是如何通过控制台与项目视图中的模块交互的一个示例,通过创建一个正交切片并更改其属性:

1、确保在工作区显示Python控制台。

2、打开 $AVIZO_ROOT/data/tutorials/chocolate-bar.am

  • 如果启用了自动视图,将会自动创建一个正交切片。删除它。

3、要创建正交切片,请在HxProject类中访问create()方法。create()方法要求我们传递我们要创建的对象的类型ID作为字符串参数。

  • 如果你不确定对象的类型ID,可以在GUI中创建对象,然后使用TCL控制台中的< module > getTypeId命令来了解其类型。
1
>>> hx_project.create('HxOrthoSlice')

4、现在我们需要将正交切片连接到 chocolate-bar.am,但首先我们会使用 get() 方法将正交切片分配给变量,以便以后更容易访问。我们也会对 chocolate-bar.am 执行相同操作:

1
2
>>>ortho = hx_project.get('Ortho Slice')
>>>input_data = hx_project.get('chocolate-bar.am')

5、为了将正交切片连接到 chocolate-bar.am,我们需要查看如何访问正交切片的 Data 端口。通过在控制台中打印 portnames 命令的结果,展示可供交互的端口列表:

1
2
>>>ortho.portnames
['data', 'origin', 'normal', 'frameSettings', ...]

6、从 portnames 命令可以看到 data 端口可能对应于正交切片属性中显示的”Data数据”连接。使用 ports 层级中的 connect() 方法将 chocolate-bar.am 连接到这个端口,然后使用 fire() 方法应用更改:

1
2
>>>ortho.ports.data.connect(input_data)
>>>ortho.fire()

7、我们还可以通过设置 sliceNumber 端口的值来更改切片位置:

1
2
>>>ortho.ports.sliceNumber.value = 100
>>>ortho.fire()

8、尝试正交切片中的其他端口,查看是否可以更改切片方向和色彩图。要访问这些端口的帮助,可以将 access 命令传递给 help() 方法:

1
>>>help(ortho.ports.sliceOrientation)

9、通过将它们传递给 help() 方法,进一步了解可供操作的方法和类:

1
>>>help(ortho.fire)
11.6.1.2.3 示例:开发脚本

在本示例中,我们将编写一个简单的脚本来计算数据集边界框的总体积。该脚本可以直接在Avizo的Python控制台中输入,也可以在文本编辑器中输入命令,然后将其复制到Python控制台执行。

1、加载 $AVIZO_ROOT/data/tutorials/chocolate-bar.am

2、将 chocolate-bar.am 分配给一个变量,以便在后续代码中快速引用。

1
>>>data = hx_project.get('chocolate-bar.am')

3、创建一个边界框并将其附加到 chocolate-bar.am 上。

  • 你可以在创建时直接将边界框分配给一个变量,而不是在单独的命令中创建它后再使用 get() 方法获取。
1
2
3
>>>bbox = hx_project.create('HxBoundingBox')
>>>bbox.ports.data.connect(data)
>>>bbox.fire()

4、检索边界框在 X、Y 和 Z 方向的范围,以计算其体积。已经存在一个可以使用的边界框命令,该命令以元组的形式存储这些信息,定义为 ((xmin, ymin, zmin), (xmax, ymax, zmax))

1
2
3
4
5
6
7
>>>type(data.bounding_box)
<class 'tuple'>
>>>data.bounding_box
((0.0, 0.0, 0.0),
(0.02807999961078167,
0.020880000665783882,
0.035280000418424606))

5、Python还可以很容易地从这个两列表元组中提取两个变量。

1
>>>min_bounds, max_bounds = data.bounding_box

6、使用方括号 [ ] 访问最小和最大边界列表中的每个索引,并将这些信息插入公式中,以计算框的体积。

1
2
3
4
>>>x_extent = max_bounds[0] - min_bounds[0]
>>>y_extent = max_bounds[1] - min_bounds[1]
>>>z_extent = max_bounds[2] - min_bounds[2]
>>>volume = x_extent * y_extent * z_extent

7、最后,以精确的格式将信息打印到控制台。

1
>>>print('The volume of %s is %.g.' % (data.name, volume))
11.6.1.2.4 示例:创建一个函数

在本例中,我们将边界框体积计算器封装到一个函数中,该函数接受输入数据作为参数,并将答案返回到控制台。关于函数和Python语法的一些注意事项:

  • 如果你在Avizo控制台中直接执行,请按SHIFT+ENTER键以输入一个换行符,而不执行代码。
  • Python要求在函数体内保持一致的缩进。最佳实践是将代码体缩进四个空格(而不是Tab键)。
  • Avizo中的Python控制台不会为用户自动缩进行,用户必须自行控制缩进。

1、加载 $AVIZO_ROOT/data/tutorials/chocolate-bar.am
2、使用def关键字定义一个名为bbVol的函数,该函数接受单个输入数据集作为参数。

1
2
>>> def bbVol(data_arg):  # 记住这里要按SHIFT+ENTER键!
...

3、解释器中会显示省略号,表示它正在等待更多代码输入。在此时手动输入四个空格,然后像之前一样,将最小和最大边界框列表赋给变量。

1
... min_bounds, max_bounds = data_arg.bounding_box

4、按下SHIFT+ENTER键以创建新行,再次输入四个空格,然后继续执行体积计算器的其余部分。

1
2
3
4
... x_extent = max_bounds[0] - min_bounds[0]
... y_extent = max_bounds[1] - min_bounds[1]
... z_extent = max_bounds[2] - min_bounds[2]
... volume = x_extent * y_extent * z_extent

5、最后,添加一个return语句将volume变量返回到控制台。这允许你将计算结果设置为一个变量。

1
... return volume

6、通过按ENTER键执行函数定义,然后使用chocolate-bar.am测试代码。测试将计算结果分配给变量的能力。

1
2
3
4
>>> bbVol(hx_project.get('chocolate-bar.am'))
The volume of chocolate-bar.am is2e-05。
2e-05
>>> chocolatebar_volume = bbVol(hx_project.get('chocolate-bar.am'))

11.6.1.3 常用全局命令

在 Avizo 的 Python 环境中,有两个主要的函数可以帮助用户探索 Python 的结构。
dir() 函数允许用户查看给定对象可用的属性和方法的列表。

1
2
3
>>>ortho = hx_project.get('Ortho Slice')
>>>dir(ortho)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__pyx_vtable__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_cpp_classname', '_cpp_package', '_tcl_interp', 'all_interfaces', 'can_be_renamed', 'clip_geometry', 'compute', 'create_doc_file', 'create_port_snaps', 'downstream_connections', 'duplicate', 'execute', 'fire', 'get_all_interface_names', 'icon_color', 'icon_position', 'icon_visible', 'is_geometry_clipped', 'is_same_object', 'name', 'need_saving', 'portnames', 'ports', 'removable', 'selected', 'unclip_geometry', 'update', 'viewer_mask']

这些信息也可以在你开始输入命令时通过下拉列表显示。

help() 函数提供了有关属性和方法的详细信息及其使用的示例。
help() 的输出还包含有关相关父类的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>>>help(ortho)
Help on HxPlanarModBase object:

class HxPlanarModBase(HxModule)
| This is the first class of HxBase hierarchy which represents items that can be added to the project view.
|
| Method resolution order:
| HxPlanarModBase
| HxModule
| HxObject
| HxBase
| McInterface
| builtins.object
|
| Methods defined here:
...
...
...
| all_interfaces
| Attribute that contains all admissible interfaces as sub-members.
|
| Examples
| --------
|
| Retrieve an ‘HxBase‘ interface on an orthoslice:
|
| >>> ortho = hx_project.create(’HxOrthoSlice’)
| >>> base = ortho.all_interfaces.HxBase

下方列出了一些更具体的全局命令:

  • print() 是 Python 的原生命令,用于在 Avizo 中的 Python 控制台输出结果。
1
2
3
4
>>>x = 3
>>>y = 2
>>>print('The sum of %i + %i is %i.' % (x,y,x+y))
The sum of 3 + 2 is 5.
  • import 是 Python 的原生命令,用于通过加载额外的包来扩展 Python 的功能。
1
2
3
4
5
>>>x = 3
>>>y = 2
>>>import numpy
>>>numpy.add(x,y)
5

一些用于与项目视图交互的有用全局函数包含在 hx_project 方法中。

方法 描述
hx_project.create() 创建某个 Avizo 类的实例并将其添加到项目视图中
hx_project.remove() 从项目视图中删除对象
hx_project.add() 将对象添加到项目视图中
hx_project.load() 当指定了文件名时加载定义格式的数据

hx_paths 方法还提供了包含目录路径的变量。

变量 描述
hx_paths.install.dir 安装目录,也称为 <$AVIZO_ROOT>
hx_paths.tutorials.dir 教程数据目录
hx_paths.python_modules.dir 包含额外包的 Python 模块目录
hx_paths.python_script_objects.dir 包含用户创建的自定义 Python 脚本的 Python 脚本对象目录
hx_paths.executable_dir 包含 Avizo.exe 的目录
1
2
3
4
5
6
7
8
9
10
>>>hx_paths.install_dir
'C:/Program Files/<INSTALL DIR>'
>>>hx_paths.tutorials_dir
'C:/Program Files/<INSTALL DIR>/data/tutorials'
>>>hx_paths.python_modules_dir
'C:/Program Files/<INSTALL DIR>/share/python_modules'
>>>hx_paths.python_script_objects_dir
'C:/Program Files/<INSTALL DIR>/share/python_script_objects'
>>>hx_paths.executable_dir
'C:\\Program Files\\<INSTALL DIR>\\bin\\arch-Win64VC12-Optimize\\Avizo.exe'

11.6.1.4 模块管理

一个包含许多代码片段的完整参考手册,解释了如何配置所有端口和模块,可以从Python参考帮助菜单项中访问。

11.6.1.4.1 模块属性
什么是属性

属性是类中包含的数据字段。有些属性可能是只读的。

常见属性列表

这里的变量 “a” 指的是你的对象的 Python 句柄。

a.name:
这是一个字符串属性,指的是你的 Avizo 对象的名称。可以分配一个字符串来更改对象的显示名称。

a.portnames:
这是一个只读列表,包含属于 Avizo 对象的所有端口名称。

a.viewer_mask:
这是一个整数属性,触发视图中的可见性。有16个配置,可以从 [0, 15] 中设置。如果使用了该范围之外的数字,该数字将在执行模16操作后评估。

a.bounding_box:
这存储了一对元组,描述对象的空间维度。可以以 ((xmin, ymin, zmin), (xmax, ymax, zmax)) 的格式分配新的维度。

a.downstream_connections[x]:
这存储了一个只读序列,显示引用它的所有对象。每个连接都分配了一个整数索引 “x”。要从指针中找到对象的名称,可以使用命令 a.downstream_connections[x].get_owner().name

a.range:
这存储了一个只读的元组,显示数据的强度范围,格式为 (min, max)。

a.transform:
这存储了一个显示 4x4 转换矩阵的元组。可以分配一个新的转换矩阵。

11.6.1.4.2 模块方法
什么是方法

方法是类中包含的函数。许多方法不需要参数。

常见方法列表

这里的变量 “a” 指的是你的对象的 Python 句柄。

a.compute():
如果 a.ports.doIt.was_hit = True,则此方法执行对象的计算。这模拟了在条件允许时单击应用按钮。

a.update():
此方法更新对象 GUI 的属性窗口。

a.fire():
此方法调用 a.update() 和 a.compute()。

a.execute():
此方法结合了上述所有方法,模拟了单击应用按钮并刷新 GUI。

a.get_array():
此方法访问对象的 NumPy 数组。访问该数组将阻止对象删除。

a.set_array(...):
此方法将 NumPy 数组分配给对象。数组的所有权不会传递,因此未来对数组的更改不会传播,除非重新分配。

11.6.1.5 脚本对象

11.6.1.5.1 什么是 Python 脚本对象

Python 脚本对象是一个计算模块,其行为在继承自 PyScriptObject 的 Python 类中进行硬编码。Python 脚本对象对于创建自定义工具非常有用,其功能可通过与 Avizo 计算模块相同的方式访问。

脚本结构

当你将 Python 脚本对象定义为类时,以下类方法非常有用,但并不要求必须这样定义。任何脚本都会像在控制台中输入的那样运行。变量 self 指代其类的标识。

def init(self):
此方法在对象创建时调用。在此处定义脚本结构并设置 GUI 是非常有用的。

def del(self):
此方法在对象重新启动或删除时调用。这是清理连接的好地方。

def update(self):
当 GUI 需要刷新时调用此方法。

def compute(self):
当单击“应用”时调用此方法。

注意:Python 脚本对象的执行是在单独的 Python 解释器上完成的,并且有自己的 Python 控制台。但是,请注意,在某些特殊情况下,例如来自 PyQt 插槽的消息打印,流式传输可能会重定向到主 Python 解释器。

创建端口

用户通过端口与对象进行交互。端口可以通过简单的分配进行初始化,它们属于 HxPort 类。以下是一些有用的端口:

HxConnection
此端口类允许用户连接模块。模块的类型也可以限制。

HxPortFilename
此端口类允许用户加载或保存文件。端口的功能由 mode 属性定义。文件名可以以文本形式输入或通过文件浏览器访问。

HxPortIntSlider
此端口类包含一个可以通过滑动比例访问的整数值范围。此端口用于定义“Ortho Slice”模块的切片编号。

HxPortDoIt
此端口类控制自动刷新框,并处理应用按钮。

HxPortInfo
此端口类用于为用户提供说明、备注或警告。文本可以在模块属性中找到。

Bounding Box 脚本示例

在本例中,我们将 Bounding Box 体积计算器(在“嵌入式 Python 使用”一章中描述)封装成一个脚本模块,可以通过对象弹出菜单加载到 Avizo GUI 中。

1、打开文本编辑器并创建一个新文件,结构如下。将对象命名为 BoundingBoxVolume

  • 你也可以从 $AVIZO_ROOT/share/python_script_objects/PythonScriptObjectTemplate.pyscro 模板开始。
1
2
3
4
5
6
7
class BoundingBoxVolume(PyScriptObject):
def __init__(self):
# 这里是初始化代码
def update(self):
# 这里是更新代码
def compute(self):
# 这里是计算代码

2、脚本对象需要能够连接到数据对象,以便知道需要计算体积的 Bounding Box。默认情况下,Python 脚本对象从 PyScriptObject 类继承数据连接。确保它在__init__() 方法中可见。

1
2
def __init__(self):
self.data.visible = True

3、在此示例中,使用 pass 关键字跳过 update() 方法中的 GUI 更新,因为没有需要更新的端口。

1
2
def update(self):
pass

4、在 compute() 方法中,我们希望在没有数据对象连接到脚本模块时停止体积计算。添加一个 if 语句检查数据连接是否为空。如果数据连接为空,使用 return 语句退出 compute() 方法。

  • Python 使用 None 关键字来简化此操作(即:if <expression> is None
1
2
3
4
def compute(self):
# 检查是否连接了输入数据
if self.input.source() is None:
return

5、最后,如果逻辑检查失败,因为已连接数据对象,请使用 bbVol 脚本计算体积。使用 source() 方法获取已连接数据对象的名称。

1
2
3
4
5
6
7
8
9
10
11
12
def compute(self):
# 检查是否连接了输入数据
if self.input.source() is None:
return

data = self.input.source()
min_bounds, max_bounds = data.bounding_box
x_extent = max_bounds[0] - min_bounds[0]
y_extent = max_bounds[1] - min_bounds[1]
z_extent = max_bounds[2] - min_bounds[2]
volume = x_extent * y_extent * z_extent
print('The volume of %s is %.g.' % (data.name, volume))

6、完成模块后,在 TCL 中创建一个资源文件,以便在对象弹出菜单中将此模块显示为所有数据对象的选项。

  • 有关创建资源文件的更多信息,请参考配置弹出菜单部分。
  • 资源文件可在 $AVIZO_ROOT/share/resources/PythonBoundingBoxVolume.rc 中找到。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module -name "Bounding Box Volume" \
-primary "HxUniformScalarField3" \
-package "py_core" \
-category "{Measure And Analyze}" \
-proc {
set this [[create HxPythonScriptObject] \
setLabel "Bounding Box Volume"]
"$this" startStop hideMaskIncrease
"$this" filename hideMaskIncrease
"$this" filename setValue \
<PRODUCT_PATH>/share/python_script_objects/PythonBoundingBoxVolume.pyscro
"$this" startStop hit 0
"$this" fire
if { [exists $PRIMARY] } {
$this data connect $PRIMARY
$this fire
}
}
11.6.1.5.2 资源文件

资源文件是一个在 Avizo 启动过程中读取和执行的 TCL 脚本。你可以配置一个资源文件,使你的 Python 脚本对象出现在下拉菜单中或作为宏按钮。资源文件位于 $AVIZO_ROOT/share/resources 目录中。

结构化下拉菜单资源文件

脚本以 TCL 命令 <module> 开始,后跟一个简单案例的以下标志。在下例中,$PRIMARY 是指你最初右键单击的对象。

-name
这是菜单中模块的名称。

-package
这定义了对象的包。

-primary
这限制了脚本出现时所需的数据类型。

-category
这定义了脚本在菜单中出现的文件夹。

-proc
这是资源文件的主体部分,指定 .pyscro 文件的加载位置以及如何将脚本连接到你最初右键单击的对象。

结构化宏资源文件

脚本以 TCL 命令 <macroButton> 开始,后跟一个简单案例的以下标志。

-add
这为按钮创建了一个名称。

-color
这控制按钮的颜色。

-proc
这是资源文件的主体部分,指定 .pyscro 文件的加载位置或过程的运行。

11.6.1.6 Python 环境和包管理器

背景

本节解释了如何在 Windows 的命令提示符或 Linux/Mac 的终端中列出、安装或更新 Avizo 的新 Python 包。包管理器允许用户创建多个自包含的 Python 环境,每个环境都有自己的 Python 可执行文件(例如 Windows 上的 python.exe)和一组包。每个自包含环境都可以在 Avizo 中使用。

描述

EDM(Enthought Deployment Manager)包管理器可用于安装、删除或升级在两个存储库中提供的 Python 包:

• official ThermoScientific/3dSoftware
• enthought/free

此工具应用于查找可用的 Python 包并安装新包。它允许查看、更新和删除已安装的包。此外,它还允许恢复到以前的状态,并恢复到 Avizo 的原始 Python 环境。

如何安装和配置 EDM

注意:EDM 安装程序可能需要重新启动你的计算机。

EDM 安装程序可以从 Enthought 网站获取:https://www.enthought.com/product/enthought-deployment-manager/

安装程序会将 EDM(例如,Windows 上的 edm.bat)提取到默认文件夹中(例如,Windows 上的 C:\Enthought\edm)。

要创建一个名为 hxEnv 的新 Python 环境,在 Windows 的命令提示符(转到 EDM 安装目录)和 Linux/Mac 的终端中执行以下命令行(使用与正确架构对应的 .json 文件):

1
edm envs import -f $AVIZO_ROOT/python/bundles/3dSoftware_win64.json hxEnv

如果此命令失败(例如,出现以下错误消息:“The packages repository ‘ThermoScientific/3dSoftware’ does not exist or is not available under your subscription. Check your repositories settings”),则配置文件 $HOME/.edm.yaml 可能不完整或缺失。打开 $HOME 文件夹($HOME 环境变量包含用户主目录的绝对路径)并搜索 .edm.yaml 文件。如果它存在,请删除并重新启动 Avizo,它应会重新创建此文件。如果文件仍然缺失,请联系支持人员。

新创建的 Python 环境存储在 $HOME\.edm\envs\hxEnv 中。

要在 Avizo 中使用名为 hxEnv 的新 Python 环境,你需要将环境变量 HX_FORCE_PYTHON_PATH 设置为 $HOME/.edm/envs/hxEnv

可以通过以下命令获取可用环境的列表:

1
edm environments list
如何搜索和安装包

首先,按如下方式搜索所需的包:

1
edm search <package_name> -e hxEnv

如果该包可用,按如下方式安装:

1
edm install <package_name> -e hxEnv
如何列出当前安装的包

要列出 Avizo 中当前安装的所有包,请输入:

1
edm list -e hxEnv
如何重新初始化 Avizo 包

要将 Python 包重新初始化到其原始状态,请使用 .json 文件创建一个新环境,或取消设置 HX_FORCE_PYTHON_PATH 环境变量。取消设置该变量将使 Avizo 使用其嵌入版本。

如果 Python 分发版因在 Avizo 中安装了不受支持的包而变得无法使用,这可能非常有用。

要显示所有可用选项,请使用以下命令:

1
edm help

11.6.1.7 Python 包列表

以下是 Thermo Scientific Python 中已经包含的包列表:

alabaster 0.7.10-1
appdirs 1.4.3-1
babel 2.4.0-2
backports.abc 0.5-1
backports abc remove 0.4-2
certifi 2017.7.27.1-1
chardet 3.0.4-1
colorama 0.3.7-1
configobj 5.0.6-2
cycler 0.10.0-1
cython 0.25.2-1
decorator 4.1.2-1
distribute remove 1.0.0-4
docutils 0.13.1-1
h5py 2.7.0-2
idna 2.5-1
imagesize 0.7.1-1
intel runtime 15.0.6.285-2
jdcal 1.2-1
jinja2 2.9.6-1
lxml 3.7.3-2
markupsafe 0.23-2
matplotlib 2.0.0-5
mkl 2017.0.3-1
networkx 1.11-7
nose 1.3.7-3
numexpr 2.6.2-3
numpy 1.13.3-3
numpydoc 0.6.0-4
opencv 3.2.0-3
openpyxl 2.4.1-2
packaging 16.8-2
pandas 0.20.3-3
patsy 0.4.1-4
pillow 4.0.0-1
pip 10.0.1-1
py 1.4.34-1
pydicom 0.9.9-1
pygments 2.2.0-1
pyparsing 2.2.0-1
pyqt5 5.8.2-3
pytables 3.3.0-5
pytest 3.1.2-1
python dateutil 2.6.0-1
pytz 2017.3-1
pywavelets 0.5.2-2
requests 2.18.4-1
scikit learn 0.19.1-2
scikits.image 0.13.0-5
scipy 1.0.0-2
seaborn 0.8.1-2
setuptools 38.2.5-1
singledispatch 3.4.0.3-1
sip 4.19.2-2
six 1.10.0-1
snowballstemmer 1.2.1-1
sphinx 1.5.5-5
sphinx rtd theme 0.2.4-1
ssl match hostname 3.5.0.1-1
statsmodels 0.8.0-4
tornado 4.4.2-3
urllib3 1.22-1
xlwt 1.2.0-1

11.6.2 Python 教程

11.6.2.1 Python 教程 - 在 Avizo 中使用 Python 生态系统中的工具

将 Python 集成到 Avizo 中的一个优点是,可以使用 Python 工具扩展 Avizo 的功能。这种扩展允许编写封装 Python 函数的脚本对象,以使它们在 Avizo 的图形用户界面中作为模块可用。这些 Python 工具随后可以通过标准的 Avizo 端口进行控制。

本教程演示如何将 Scipy 中的快速傅里叶变换 (FFT) 作为 Avizo 中使用的 FFT 的替代方案进行集成。您可以按照逐步说明操作,或者查看 $AVIZO_ROOT/share/python_script_objects 目录中的相关文件(ScipyFFT.pyscro 和 ScipyFFT.rc)。

$AVIZO_ROOT/share/python_script_objects 目录中复制 PythonScriptObjectTemplate.pyscro 文件到您选择的位置,并将其重命名为 ScipyFFT.pyscro

1、用文本编辑器打开该文件,并通过更改第一行给新模块命名:

1
class ScipyFFT(PyScriptObject):

2、在初始化函数中,将使用默认数据输入端口进行模块的数据连接,并定义允许的连接类型:

1
self.data.valid_types = ['HxUniformScalarField3']

3、最终的初始化函数定义如下:

1
2
3
4
def __init__(self):
self.data.valid_types = ['HxUniformScalarField3']
# 创建一个“应用”按钮。
self.do_it = HxPortDoIt(self, 'apply', 'Apply')

4、保持 update 函数不变:

1
2
def update(self):
pass

5、FFT 的计算将在 compute 函数中完成。检查是否点击了Apply按钮以及是否选择了输入数据集后,从 Python 中导入几个包。在本例中,我们需要从 scipy 导入 fftpack、从 numpy 导入一些数学函数,以及 time 包来测量执行时间:

1
2
3
from scipy import fftpack
import numpy
import time

6、计算的第一步是创建一个变量来存储 FFT 计算的结果作为 3D 均匀标量场。

1
result = hx_project.create('HxUniformScalarField3')

7、要测量执行时间,首先需要在计算开始时获取时间戳:

1
start_time = time.time()

8、为输入数据创建一个 Python 变量:

1
input = self.data.source()

9、要计算输入数据的 FFT 绝对值,执行以下三条命令:

1
2
3
4
5
6
7
8
# 计算离散傅里叶变换
F1 = fftpack.fftn(input.get_array())

# 将零频率分量移至频谱中心
F2 = fftpack.fftshift(F1)

# 获取所有系数的幅值
F3 = numpy.abs(F2)

10、计算完成后,将结果数组分配给您之前创建的 result 变量:

1
result.set_array(F3)

11、输出 FFT 的总执行时间:

1
print("--- %s seconds ---" % (time.time() - start_time))

12、整个 compute 函数应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def compute(self):
# 检查是否已触碰模块的应用按钮
if not self.do_it.was_hit:
return

# 检查输入数据是否连接到有效对象
if self.data.source() is None:
return

# 导入用于执行 FFT 的 scipy 包
from scipy import fftpack
import numpy
import time

# 创建输出字段
result = hx_project.create('HxUniformScalarField3')

start_time = time.time()

# 检索输入数据
input = self.data.source()

# 计算离散傅里叶变换
F1 = fftpack.fftn(input.get_array())

# 将零频率分量移至频谱中心
F2 = fftpack.fftshift(F1)

# 获取所有系数的幅值
F3 = numpy.abs(F2)

# 将结果 numpy 数组赋值给输出标量场
result.set_array(F3)

# 在控制台显示计算时间
print("--- %s seconds ---" % (time.time() - start_time))

13、为了让此模块在 Avizo 的图形用户界面中可用,您还需要编写一个资源文件。用文本编辑器创建一个新文件,并将其保存为 ScipyFFT.rc。资源文件通常以注释行开头:

1
2
3
#############################################################
# .rc for pyscro Scipy FFT
#############################################################

14、为模块命名:

1
module -name "Scipy FFT" \

15、指定希望将其附加到的数据类型:

1
-primary "HxUniformScalarField3" \

16、将其声明为 Python 脚本对象:

1
-package "py_core" \

17、下一行定义了它将出现在 Avizo 对象弹出菜单中的位置:

1
-category "{Python Scripts}" \

18、运行几个 TCL 命令以在 Avizo 的图形用户界面中初始化模块。第一个命令将创建脚本对象并为模块设置标签:

1
2
-proc {
set this [[create HxPythonScriptObject] setLabel "Python FFT"]

19、设置文件名以找到该模块的 Python 脚本位置,其中 <PRODUCT_PATH>$AVIZO_ROOT:

1
2
3
4
"$this" startStop hideMaskIncrease
"$this" filename hideMaskIncrease
"$this" filename setValue \
<PRODUCT_PATH>/share/python_script_objects/ScipyFFT.pyscro

20、脚本将运行以使更改生效:

1
2
"$this" startStop hit 0
"$this" fire

21、将数据集连接到您右键单击以创建模块的默认输入数据端口:

1
2
3
4
5
if { [exists $PRIMARY] } {
$this data connect $PRIMARY
$this fire
}
}

22、完整的资源文件应如下所示,其中 <PRODUCT_PATH>$AVIZO_ROOT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#############################################################
# .rc for pyscro Scipy FFT
#############################################################
module -name "Scipy FFT" \
-primary "HxUniformScalarField3" \
-package "py_core" \
-category "{Python Scripts}" \
-proc {
set this [[create HxPythonScriptObject] setLabel "Python FFT"]
"$this" startStop hideMaskIncrease
"$this" filename hideMaskIncrease
"$this" filename setValue \
<PRODUCT_PATH>/share/python_script_objects/ScipyFFT.pyscro
"$this" startStop hit 0
"$this" fire
if { [exists $PRIMARY] } {
$this data connect $PRIMARY
$this fire
}
}

23、要使此 Python 脚本对象在 Avizo 中可用,需要将这两个文件(覆盖现有文件)复制到 $AVIZO_ROOT/share/python_script_objects/,并在修改资源文件后重新启动 Avizo。 如果要重复使用内嵌的 Python FFT 示例,请编辑 $AVIZO_ROOT/share/python_script_objects/ScipyFFT.rc 文件,并将 -category 值从 “None” 改为 “{Python Scripts}”。

24、要测试此模块,请执行以下操作:

(1)启动 Avizo。

(2)加载 $AVIZO_ROOT/data/tutorials/chocolate-bar.am

(3)右键单击数据对象,并从对象弹出菜单中选择 Python Scripts/Scipy FFT。

(4)单击Apply,并且具有结果 FFT 的新数据对象将在项目视图中显示。

11.7 使用 MATLAB 与 Avizo

本节描述了如何在 Avizo 中使用 MATLAB 脚本。

11.7.1 使用 MATLAB 脚本

在本教程中,您将学习如何通过 Calculus MATLAB 模块在 Avizo 中使用 MATLAB(The MathWorks, Inc.)进行复杂计算。

为了使用 Calculus MATLAB 模块,必须在您的计算机上正确安装 MATLAB。此外,为了允许此模块与 MATLAB 计算引擎建立连接,您可能需要注册 MATLAB 引擎(在 Windows 上),并根据您的系统设置环境变量以包括 MATLAB 库或程序的搜索路径。请参阅 Calculus MATLAB 模块的文档以了解安装详情和限制。

本教程在在线文档中提供,通过各种示例涵盖以下主题:

  • 加载和执行 MATLAB 脚本。
  • 将各种数据类型从 Avizo 传递给 MATLAB 并导出它们。
  • 使用字段结构。
  • 使用时间滑块控制脚本变量。
  • 从脚本调用用户自定义的 MATLAB 函数。

Thermo Fisher Python API documentation

Object handling classes

hx.core.HxObjectFactory

这是一个类,用于在Python中实例化所有模块并加载所有数据。该类的所有实例是可互换的,已经实例化的一个实例被命名为 hx_object_factory

create(classname)

此函数用于创建一个模块。

参数:
  • classname : str
    字符串,表示要实例化的类名。
返回:
  • HxBase
    返回最接近派生自 HxBase 的实例。
示例:
1
>>> my_var = hx_object_factory.create('HxOrthoSlice')

get(obj_name)

此函数尝试通过名称找到一个模块或数据。

参数:
  • obj_name : str
    表示要查找的模块或数据的名称属性(它对应于 HxBase.name 属性)。
返回:
  • HxBase
    返回与名称匹配的 HxBase 派生实例。
Raises:
  • KeyError
    如果找不到名为 obj_name 的模块,则引发此异常。
示例:
1
>>> my_var = hx_object_factory.get('Ortho Slice')

load(filename)

此函数用于加载数据。

参数:
  • filename : str
    表示要加载的文件。
返回:
  • HxBase 或 list[HxBase]
    如果文件名对应的模块为一个,返回 HxData 的派生实例;如果文件名对应多个模块,返回一个 HxBase 的列表。
Raises:
  • KeyError
  • RuntimeError
示例:

此示例说明如何加载文件。

1
>>> my_var = hx_object_factory.load(hx_paths.tutorials_dir + '/chocolate-bar.am')

hx.core.HxProject

这是一个类,用于通过添加或删除对象与项目视图(也称为对象池)进行交互。该类的所有实例是可互换的,实例之一被称为 hx_project

add(obj)

obj 添加到项目视图中。

参数:
  • obj : HxObject
    必须添加到项目视图的对象。
示例:
1
2
>>> ortho = hx_object_factory.create('HxOrthoSlice')  
>>> hx_project.add(ortho)'

create(classname)

创建一个 classname 类型的对象并将其添加到项目视图中。

参数:
  • classname : str
    表示要实例化的类的字符串。
返回:
  • HxBase
    返回最接近派生自 HxBase 的实例。
Notes

The following code:

1
>>> some_obj = hx_project.create('HxOrthoSlice')

is equivalent to:

1
2
>>> some_obj = hx_object_factory.create('HxOrthoSlice')
>>> hx_project.add(some_obj)
示例:

创建正交切片并将其添加到项目视图:

1
>>> some_obj = hx_project.create('HxOrthoSlice')'

get(obj_name)

根据名称从项目视图中检索对象。

参数:
  • obj_name : str
    要检索的对象名称。
Raises:
  • KeyError
    如果在项目视图中找不到名为 obj_name 的对象,则引发此异常。
示例:

我们创建一个 Ortho Slice,给它命名,将它添加到项目视图并通过其名称进行查询:

1
2
3
4
>>> ortho = hx_object_factory.create('HxOrthoSlice')  
ortho.name = "MyNewName"
hx_project.add(ortho)
ortho2 = hx_project.get("MyNewName")'

请注意,在这种情况下,ortho 和 ortho2 代表应用程序中的同一个对象:

1
2
>>> print(ortho.is_same_object(ortho2))
True

load(filename)

加载指定文件并将其添加到项目视图中。

参数:
  • filename : str
    表示要加载的文件。
返回:
  • HxBase
    返回最接近派生自 HxData 的实例。
Notes

The following code:

1
>>> some_obj = hx_project.load(hx_paths.tutorials_dir + '/chocolate-bar.am')

is equivalent to:

1
2
>>> some_obj = hx_object_factory.load(hx_paths.tutorials_dir + '/chocolate-bar.am')
>>> hx_project.add(some_obj)
示例:
1
>>> some_obj = hx_project.load(hx_paths.tutorials_dir + '/chocolate-bar.am')'

remove(obj)

从项目视图中移除 obj

参数:
  • obj : HxObject
    要从项目视图中删除的对象。
Raises:
  • KeyError
    如果 obj 不在项目视图中,则引发此异常。
示例:

我们使用object_factory创建一个正交切片,将其添加到项目视图,然后将其从项目视图中删除:

1
2
3
>>> ortho = hx_object_factory.create('HxOrthoSlice')  
>>> hx_project.add(ortho)
>>> hx_project.remove(ortho)'

remove_all()

从项目视图中移除所有对象(仅移除可移除的对象)。

示例:

从项目视图中删除所有对象。(只有可移动的对象才会被删除。)

1
>>> hx_project.remove_all()'

Path management

hx.core.HxPaths

这是一个类,用于检索与产品路径相关的信息。该类的一个实例称为 hx_paths

appdata_dir

与产品的 appdata 目录绑定的只读属性。

executable_dir

与产品的可执行目录绑定的只读属性。

home_dir

与产品的主目录绑定的只读属性。

install_data_dir

与产品的数据目录绑定的只读属性。

install_dir

与产品的安装目录绑定的只读属性。

python_modules_dir

与产品的 Python 模块目录绑定的只读属性。

python_script_objects_dir

与产品的 Python 脚本对象目录绑定的只读属性。

python_share_dir

与产品的 share 目录绑定的只读属性。

tutorials_dir

与产品的教程目录绑定的只读属性。

Messaging utilities

hx.core.HxMessage

此界面用于弹出模式对话框。(例如错误、警告、信息、文件覆盖、问题)。

这些简单对话框(消息框)已实现“不再显示此消息”功能。使用此功能,用户可以禁用显示某些消息。此外,用户还可以通过“首选项”面板恢复已禁用的消息框。在消息框中使用此功能时,将创建消息框的唯一密钥,并将该密钥与用户单击的按钮索引一起保存到设置中。默认情况下,所有消息框均禁用此功能,如果我们想启用此功能,则必须传递其他参数。

该类的一个实例称为 hx_message

confirmations(message, button0_text, button1_text)

确认对话框,使用方法与 question() 相同。

参数:
  • message : str
    要在消息框中显示的消息。
  • button0_text : str
    按钮0的标签。
  • button1_text : str
    按钮1的标签。
  • do_not_show_again_key : str, optional
    如果此参数不为空,将添加“不要再显示此消息”的复选框,用户勾选后可防止再次显示该消息。该字符串值将作为识别消息的键。
返回:
  • int
    返回值指示用户按下了哪个按钮。
示例:

显示一个简单的确认消息框:

1
2
3
>>> 'ret = hx_message.confirmations("Computation may be very long. Do you want to continue ?", "Yes", "No")  
>>> if ret == 0:
>>> print("Execute your computation code.")'

error(message, button0_text=””, button1_text=””, button2_text=””, default_button_index=-1, escape_button_index=-1)

弹出一个模态对话框,显示用户定义的错误消息。

参数:
  • message : str
    要在消息框中显示的消息。
  • button0_text : str, optional
    按钮0的标签。如果为空,则显示“关闭”。
  • button1_text : str, optional
    按钮1的标签。
  • button2_text : str, optional
    按钮2的标签。
  • default_button_index : int, optional
    默认按钮的索引(0-2)。
  • escape_button_index : int, optional
    逃生按钮的索引。
返回:
  • int
    返回值指示用户按下了哪个按钮。
示例:

显示一个简单的消息框错误:

1
>>> hx_message.error("Could not locate specified file.")

info(message, do_not_show_again_key=””)

与错误、警告和问题对话框不同,信息对话框始终只有一个按钮,标有“关闭”。

参数:
  • message : str
    要在消息框中显示的消息。
  • do_not_show_again_key : str, optional
    如果此参数不为空,将添加“不要再显示此消息”的复选框。
返回:
  • int
    返回0。
示例:

显示一个简单的信息消息框:

1
>>> hx_message.info("Computation was a success!")

overwrite(filename)

将会弹出一个模式对话框,提示指定的文件已经存在。用户可以选择覆盖或取消。如果选择覆盖,该方法将返回 True。否则,该方法将返回 False。不会检查指定的文件是否确实已经存在。

参数:
  • filename : str
    已存在的文件名。
返回:
  • bool
    如果用户选择覆盖返回 True,否则返回 False

question(message, button0_text, button1_text, button2_text=””, default_button_index=-1, escape_button_index=-1, do_not_show_again_key=””)

问题对话框,使用方法与 error() 相同。

参数:
  • message : str
    要在消息框中显示的问题。
  • button0_text : str
    按钮0的标签。
  • button1_text : str
    按钮1的标签。
  • button2_text : str, optional
    按钮2的标签。
  • default_button_index : int, optional
    默认按钮的索引(0-2)。
  • escape_button_index : int, optional
    逃生按钮的索引。
  • do_not_show_again_key : str, optional
    如果此参数不为空,将添加“不要再显示此消息”的复选框。
返回:
  • int
    返回值指示用户按下了哪个按钮。
示例:

显示一个简单的消息框问题:

1
2
3
>>> ret = hx_message.question("Specified file seems corrupted. Do you want to load the data anyway ?", "Yes", "No")  
>>> if ret == 0:
>>> print("Abort image loading...")

warning(message, button0_text=””, button1_text=””, button2_text=””, default_button_index=-1, escape_button_index=-1, do_not_show_again_key=””)

警告对话框,使用方法与 error() 相同。

参数:
  • message : str
    要在消息框中显示的警告消息。
  • button0_text : str, optional
    按钮0的标签。
  • button1_text : str, optional
    按钮1的标签。
  • button2_text : str, optional
    按钮2的标签。
  • default_button_index : int, optional
    默认按钮的索引(0-2)。
  • escape_button_index : int, optional
    逃生按钮的索引。
  • do_not_show_again_key : str, optional
    如果此参数不为空,将添加“不要再显示此消息”的复选框。
返回:
  • int
    返回值指示用户按下了哪个按钮。
示例:

显示一个简单的消息框警告:

1
>>> hx_message.warning("Imported file does not have the expected size.")

Hierarchy of objects

hx.core.McInterface

McInterface 是所有接口的基类,包括 HxBase 层次结构。此类是抽象基类。

属性

all_interfaces

包含所有允许的接口作为子成员的属性。

示例

检索正交切片 (HxOrthoSlice) 的 HxBase 接口:

1
2
>>> ortho = hx_project.create('HxOrthoSlice')
>>> base = ortho.all_interfaces.HxBase

方法

get_all_interface_names()

返回支持的所有接口名称的列表。

返回:
  • list of strings
    返回对象支持的所有接口名称的列表。
示例

打印正交切片支持的所有接口:

1
2
3
>>> ortho = hx_project.create('HxOrthoSlice')
>>> print(ortho.get_all_interface_names())
['HxPlanarModBase', 'HxModule', 'HxObject', 'HxBase']

hx.core.HxBase

文档太长,暂不翻译

python+avizo代码测试

代码创建方法

在python控制台中调用 Segmentation Editor 很难实现,对于pyhon接口,只可以在project中实现的算法,可以采用API去调用。

对于某个具体的方法,可以鼠标放在方法栏上,然后悬停后显示方法名。

例如Image Curvature方法,在API中对应的接口就是curvature2d/curvature3d

对于curvature方法不熟悉,可以在控制台直接输出。

  • curvature3d
1
hx_object_factory.create('curvature3d')
1
2
3
4
5
6
7
8
9
10
Python handle of type: 'HxCompModule'
Kernel item name : 'Image Curvature 3D'
Kernel item type : 'HxQuant2GenericModule'
All ports :
'interpretation': 'HxPortRadioBox'
'outputLocation': 'HxPortMultiMenu'
'doIt': 'HxPortDoIt'
'inputImage': 'HxConnection'
'inputImageMask': 'HxConnection'
'standardDeviation': 'HxPortFloatTextN'
  • curvature2d
1
hx_object_factory.create('curvature2d')
1
2
3
4
5
6
7
8
9
10
Python handle of type: 'HxCompModule'
Kernel item name : 'Image Curvature 2'
Kernel item type : 'HxQuant2GenericModule'
All ports :
'interpretation': 'HxPortRadioBox'
'outputLocation': 'HxPortMultiMenu'
'doIt': 'HxPortDoIt'
'inputImage': 'HxConnection'
'inputImageMask': 'HxConnection'
'standardDeviation': 'HxPortFloatTextN'
  • 图形化界面可以看到,使用以下创建方式
1
hx_project.create('curvature3d')

helloworld

在Avizo的Main Python Console调用并执行脚本

1
exec(open('F://PYCharmWorkSpace//DigitalCoreFeatureExtraction//avizo//avizo_helloworld.py').read())

读取文件并进行切片显示

1
2
3
4
5
6
7
dataLoaded = hx_project.load('E:/digitalrock/eleven_sandstones_dataset/1_Berea/Berea_2d25um_binary_1-0_test.tif')

ortho_slice = hx_project.create('HxOrthoSlice')

ortho_slice.ports.data.connect(dataLoaded)

ortho_slice.fire()
1
exec(open('F://PYCharmWorkSpace//DigitalCoreFeatureExtraction//avizo//avizo_read_test.py').read())

阈值分割

avizo中Image Segmentation方法

  • 2D-Histogram Segmentation

使用2D直方图分割脚本模块,您可以以半自动的方式对由两个或多个阶段组成的CT或MR灰度图像数据进行分割。

考虑多相材料,如教程数据 chocolate-bar.am,即气缸盖样品的 CT 扫描。有许多离散相,但直方图显示不同相的峰值重叠。在这种情况下,基于强度对图像进行阈值处理将失败,因为任何阈值都会导致某些像素被错误分配。
这里使用的方法称为 2D 直方图分割,依赖于梯度幅度与图像强度直方图。
此分割过程包括两个主要步骤:将一些体素初步分类为两个或多个相,然后是扩展步骤,在该步骤中扩展该分类,以便所有体素都被标记。
分类:对于此例程,体素的初始分类是基于这些体素的强度及其梯度幅度执行的。此例程的输入是 3D 体积的强度图。从该输入计算梯度幅度。计算梯度幅度后,将向用户显示显示梯度幅度与图像强度的 2D 散点图。用户将使用此图来确定初始分类(这在使用直方图初始化分类中进行了描述)。
扩展:扩展由标记种子分水岭变换计算(参见分水岭算法原理)。分水岭变换需要两个输入,一组种子标记和一个景观函数。种子标记将由分类确定(参见解释直方图),梯度幅度将用于景观函数。
2D 直方图分割的 6 个步骤:
步骤 1 - 计算梯度幅度以开始 - 请参阅计算梯度幅度中的详细信息:
选择精确计算梯度幅度或更快近似梯度幅度。
点击下一步:计算梯度幅度以继续。
步骤 2 - 绘制直方图,请参阅解释直方图中的详细信息:
点击下一步:绘制直方图以继续。
步骤 3 - 绘制窗口 - 请参阅使用直方图初始化分类中的详细信息:
如果您使用鼠标拖动绘图窗口,并且希望将其重置为原始大小和位置,则只需拖动属性面板上的伽马校正滑块即可。
使用伽马校正在 2D 直方图上可视化峰值。使用绘图窗口顶部的绘图工具直接在绘图上绘制窗口。通常,您需要选择梯度幅度非常低的区域(峰值靠近 x 轴)。
点击下一步:计算种子以继续下一步。
步骤 4 - 查看种子标签:
使用权重因子更新视图以显示灰度数据、种子标签图像或两个数据集的加权融合。
使用隐藏/显示直方图按钮切换直方图的显示,以便更轻松地在查看器中查看结果。使用切片编号调整正在显示的切片索引平面。如果您对从所选窗口计算出的种子不满意,请点击“删除最后一个窗口”以逐个删除窗口(按添加时的相反顺序)。然后您可以绘制新窗口。绘制新窗口后,请点击“重新计算种子”。您可以反复进行,直到对种子满意为止。
点击“下一步:应用分水岭”继续(请参阅“使用分水岭扩展”中的详细信息)
步骤 5 - 确认分水岭结果:
如果结果不令人满意,请绘制新区域,然后点击“上一步:重新计算种子”重新应用分水岭。
点击“下一步”继续执行最后一步,这是可选的。
步骤 6 - [可选] 删除通道:
如果分配的标签之一对应于空白空间,您可以选择从标签图像中删除该标签。
完成后,您应该删除此模块。

  • Watershed Segmentation

此模块通过对高梯度幅值应用分水岭来对不同相进行精确分割。
指定要分割的相数后,单击“跳过”按钮并按照说明进行操作。
要执行的操作包括:
指定相数。如果仅指定一个相,则将从指定相的侵蚀负片内部计算假标签。因此,分水岭计算期间指定相的扩散受到侵蚀的限制。
计算 3D 梯度幅值。内部使用 Avizo gradient_canny3d。或者,可以通过将梯度幅值标量场连接到 portGradient 来设置梯度幅值。
阈值梯度蒙版。使用滑块对梯度蒙版进行阈值设置,即定义无法设置标记的区域。
为相指定每个标记。可以使用最小和最大阈值滑块设置每个标记,也可以通过 portPhase 将相标记指定为二进制图像来设置每个标记。
应用分水岭计算。Avizo 分水岭算法根据先前设置的标记执行,以梯度幅度作为高度图像。
可视化最终阶段。颜色清洗模块连接到切片,同时提供阶段分割和原始数据可视化。

  • Adaptive Thresholding

该模块通过应用相对于滑动窗口的平均强度自动适应的阈值来执行二值化。
对于每个像素,根据其局部平均强度计算局部阈值。然后使用可以乘法或加法的模型应用此阈值。
保留的像素是那些根据比较标准“大于或等于”或“小于或等于”阈值的像素。

  • Auto Thresholding

自动阈值高是模块自动阈值的配置之一。有关其他配置,请参阅端口类型。
此模块计算灰度图像上的自动阈值,即将图像分成 2 个像素类。有四种分类方法:熵、因式分解、矩和 IsoData。计算出的阈值显示在表格面板中。

  • Feature Adaptive Thresholding

二值化将灰度图像转换为二进制图像。当灰度图像中的相关信息对应于特定的灰度间隔时,使用此方法。在二进制图像中,感兴趣的像素设置为 1,其他所有像素(背景)设置为 0。
此模块计算灰度图像的阈值,给定与原始图像的预分割相对应的标签图像。用户不是为阈值提供两个固定值,而是选择两个代表性度量(例如,直方图的第 10 和第 90 个百分位数)。每个标签的最小和最大阈值都是动态计算的,并对它们进行单独的阈值处理。

  • Hysteresis Thresholding

二值化将灰度图像转换为二进制图像。当灰度图像中的相关信息对应于特定的灰度间隔时,使用此方法。在二进制图像中,感兴趣的像素设置为 1,其他所有像素(背景)设置为 0。
滞后阈值使用滞后环来提供更连接的阈值结果。

  • Interactive Thresholding

此工具允许以交互方式选择阈值。当前选择显示为所连接正交视图的每个视图上的叠加层。
按“应用”按钮创建二进制图像。将创建一个新字段,该字段对于阈值间隔内的每个值均为 1,对于所有其他字段值均为 0。

  • Interactive Top-Hat

Top-Hat 分割从给定图像中提取小元素和细节。它检测对应于谷值或窄峰的暗区或白区。

有两种类型的 Top-Hat 变换:

黑色 Top-Hat:它被定义为使用给定大小的内核闭合的立方体与输入图像之间的差异。内核越小,Top-Hat 图像中的元素越小。阈值允许选择 Top-Hat 结果中较暗的元素,即所选谷值的深度。参见图 1。

白色 Top-Hat:它被定义为输入图像与其开口立方体之间的差异(使用给定大小的内核)。阈值允许选择 Top-Hat 结果中较亮的元素。

  • Local Thresholding

该模块提供算法,将图像堆栈二分分割为前景和背景对象。模块的输出是标签图像。如果需要在缓慢变化的背景之前分割多个小对象,则该算法效果最佳。
一些阈值算法需要大量主内存才能运行(Niblack、Oberlaender、Mardia-Hainsworth)。浮点分辨率缓冲区将根据输入图像大小进行分配。

  • Threshold by Criterion

按标准阈值对图像进行阈值处理。如果计算结果为真,则输出像素将设置为 1,否则设置为 0。

是否需要阈值分割

相同的数据体,计算曲率的过程相同
上面执行材料划分
下面不执行材料划分
数据执行结果相同
因为孔隙为1,骨架为0。

曲率计算及分析

Image Curvature

从本地加载一张tif图片,然后调用curvature方法

1
2
3
4
5
6
7
8
9
10
data = hx_project.load('E:/digitalrock/eleven_sandstones_dataset/1_Berea/Berea_2d25um_binary_1-0_test.tif')

curvature3d = hx_project.create('curvature3d')

curvature3d.ports.inputImage.connect(data)

curvature3d.ports.doIt.was_hit = True
curvature3d.compute()

print(curvature3d.results[0].name)

fire() → 如果这是一个计算模块并且其端口 doIt 已被触碰或者自动刷新已被激活,则此方法将触发对对象上的 update() 的调用,并最终触发 compute() 的调用。
execute() → 此方法将模拟点击此对象的属性区域下的绿色应用按钮,并对此对象执行fire()
compute() → 执行计算。

现在我们通过触发端口doIt来调用计算:curvature3d.ports.doIt.was_hit = True

执行

1
exec(open('F://PYCharmWorkSpace//DigitalCoreFeatureExtraction//avizo//avizo_test.py').read())

Image Statistics

1
hx_project.create('statistics')
1
2
3
4
5
6
7
8
9
10
11
Python handle of type: 'HxCompModule'
Kernel item name : 'Image Statistics'
Kernel item type : 'HxQuant2GenericModule'
All ports :
'Type': 'HxPortModuleSwitch'
'interpretation': 'HxPortRadioBox'
'outputLocation': 'HxPortMultiMenu'
'doIt': 'HxPortDoIt'
'inputImage': 'HxConnection'
'rangeMode': 'HxPortMultiMenu'
'inputRange': 'HxPortIntTextN'

Image Curvature + Image Statistics

  • 接收到处理结果
1
2
3
4
5
result1 = curvature3d.results[0]
result2 = curvature3d.results[1]

print(result1.portnames)
print(result2.portnames)
1
2
['master', 'histogramInfo', 'sharedColormap', 'preview']
['master', 'histogramInfo', 'sharedColormap', 'preview']
  • 处理结果运行分析

对两个曲率进行统计

1
2
3
4
5
6
7
8
9
10
11
imagestatic1 = hx_project.create('statistics')
imagestatic2 = hx_project.create('statistics')

imagestatic1.ports.inputImage.connect(result1)
imagestatic2.ports.inputImage.connect(result2)

imagestatic1.ports.doIt.was_hit = True
imagestatic2.ports.doIt.was_hit = True

imagestatic1.compute()
imagestatic2.compute()
  • 接收到统计结果
1
2
3
4
5
6
7
staticresult1 = imagestatic1.results[0]
staticresult12 = imagestatic2.results[0]

print(staticresult1.portnames)
print(staticresult12.portnames)

staticresult1.method
1
2
['master', 'table', 'DataClass']
['master', 'table', 'DataClass']

读取表格

参看API中hx.core.HxSpreadSheetInterface

1
2
3
4
5
6
ssi = staticresult1.all_interfaces.HxSpreadSheetInterface
print(ssi.tables[0].columns[1].name) # NbPixels
print(ssi.tables[0].columns[5].name) # Mean

print(ssi.tables[0].items[0,5])
print(ssi.tables[0].row[0].items[1])

阈值分割计算曲率案例

2D

1、加载图像
2、计算曲率
3、曲率结果处理

  • 2D图片加载弹窗问题

暂时无法解决,获取不到对话框,只可以认为用鼠标连点器点击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from skimage.io import imread_collection

hx_project.remove_all()


imgfloder_src = ['E:/digitalrock/eleven_sandstones_dataset/1_Berea/Berea_2d25um_binary_tif_1-0_test/']

img_suffix = '*.tif'

pixel_size = 2.25e-6


for i in imgfloder_src:
imgfloder_seq = imread_collection(i + img_suffix)
#print(imgfloder_seq)

for j in imgfloder_seq.files:
img_name = j.split('\\')[-1]
filepath = i + img_name
#print(filepath)
data = hx_project.load(filepath)
curvaturemodel = hx_project.create('curvature2d')
curvaturemodel.ports.inputImage.connect(data)
curvaturemodel.ports.doIt.was_hit = True
curvaturemodel.compute()

gasscurvature = curvaturemodel.results[0]

gasscurvaturestatistics = hx_project.create('statistics')
gasscurvaturestatistics.ports.inputImage.connect(gasscurvature)
gasscurvaturestatistics.ports.doIt.was_hit = True
gasscurvaturestatistics.execute()
gasscurvaturestatisticsresult = gasscurvaturestatistics.results[0]
ssi1 = gasscurvaturestatisticsresult.all_interfaces.HxSpreadSheetInterface
print(img_name + " " + "{:.4e}".format((ssi1.tables[0].items[0, 5]) / pixel_size)) # m-1
hx_project.remove_all()

3D-单个

1、加载图像
2、计算曲率
3、曲率结果处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 加载数据
data = hx_project.load('E:/digitalrock/eleven_sandstones_dataset/1_Berea/Berea_2d25um_binary_1-0_test.tif')


# 创建3维曲率计算模块
curvaturemodel = hx_project.create('curvature3d')
# 设置曲率计算模块输入
curvaturemodel.ports.inputImage.connect(data)
# 设置曲率计算方法打开doIt
curvaturemodel.ports.doIt.was_hit = True
# 执行计算
curvaturemodel.compute()


# 高斯曲率计算结果
gasscurvature = curvaturemodel.results[0]
# 平均曲率计算结果
avgcurvature = curvaturemodel.results[1]


# 创建高斯曲率统计模块
gasscurvaturestatistics = hx_project.create('statistics')
# 设置高斯曲率计算模块输入
gasscurvaturestatistics.ports.inputImage.connect(gasscurvature)
# 设置高斯曲率统计模块打开doIt
gasscurvaturestatistics.ports.doIt.was_hit = True
# 执行高斯曲率统计计算
gasscurvaturestatistics.execute()
# 高斯曲率统计结果
gasscurvaturestatisticsresult = gasscurvaturestatistics.results[0]
# 查看高斯曲率整体均值
ssi1 = gasscurvaturestatisticsresult.all_interfaces.HxSpreadSheetInterface
print(ssi1.tables[0].items[0, 5])

# 创建平均曲率统计模块
avgcurvaturestatistics = hx_project.create('statistics')
# 设置平均曲率计算模块输入
avgcurvaturestatistics.ports.inputImage.connect(avgcurvature)
# 设置平均曲率统计模块打开doIt
avgcurvaturestatistics.ports.doIt.was_hit = True
# 执行平均曲率统计计算
avgcurvaturestatistics.execute()
# 平均曲率统计结果
avgcurvaturestatisticsresult = avgcurvaturestatistics.results[0]
# 查看平均曲率整体均值
ssi2 = avgcurvaturestatisticsresult.all_interfaces.HxSpreadSheetInterface
print(ssi2.tables[0].items[0,5])

# exec(open('F://PYCharmWorkSpace//DigitalCoreFeatureExtraction//curvature//curvature_avizo_3d_test1.py').read())

执行:

1
exec(open('F://PYCharmWorkSpace//DigitalCoreFeatureExtraction//curvature//curvature_avizo_3d_test1.py').read())

结果:

1
2
0.04535578936338425
-0.028369586914777756
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2024/10/22/AVIZO自动化/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里