脚本简介
1. 设置您的脚本环境
脚本编写提供了一种与 OghmaNano 交互的更强大方式。您无需使用图形用户界面,而是可以使用自己喜欢的编程语言与 OghmaNano 交互。这使您能够以远比单独使用图形界面更强大的方式驱动仿真。下面我给出使用 MATLAB 和 python 驱动 OghmaNano 的示例,但您也可以使用任何具有 json 读取器/写入器的语言。Pearl 和 Java 是立刻能想到的两种语言。
在开始为 OghmaNano 编写脚本之前,您需要告诉 windows OghmaNano 安装在哪里,默认情况下 OghmaNano 将安装到 C:\Program files x86 \OghmaNano,在该目录中您会看到有两个 windows 可执行文件,一个名为 oghma.exe,这是图形用户界面,另一个 .exe 名为 oghma_core.exe。您可以在不使用 oghma.exe 的情况下通过命令行运行 oghma_core.exe。您只需要进入包含 sim.oghma 文件夹的目录并调用 oghma_core.exe,这可以通过 windows 命令行、matlab、python 或任何其他脚本语言完成。但是,在 windows 上执行此操作之前,您需要将 C:\Program files x86 \OghmaNano 添加到 windows 路径中,这样 windows 才知道 OghmaNano 安装在哪里。如何在现代版本的 windows 上执行此操作的示例见链接 https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574(v=office.14)
每个新版本的 windows 似乎都会把配置选项移来移去,因此您可能需要为您的 windows 版本寻找 相关说明。
2. 关于脚本的更多提示
sim.json 数据结构显示为可浏览的 JSON 对象树。
把 GUI 看作结构化 JSON 查看器
在为 OghmaNano 编写脚本时,一个有用的思维模型是把整个 GUI 视为底层 sim.json 文件的
结构化查看器和编辑器。
每个控件、滑块、表格和对话框最终都会从这个文件中读取并写入。
没有单独的“GUI 状态”——JSON 就是状态。在 Automation 功能区中,JSON Explorer(图
??)
允许您直接以层级树的形式浏览 sim.json 文件。这通常是理解某个参数在 JSON 中“位于何处”的最快方法,也可以确认某个 GUI 操作
是否正在写入您所期望的字段。
通过复制和粘贴检查对象
另一种有用的技术是利用 GUI 中普遍可用的复制和粘贴方式。 当您复制一个对象时——例如在层编辑器中右键复制某一层, 或在 3D 视图中复制一个已选对象——OghmaNano 可以将负责生成该对象的底层 JSON 结构直接放到剪贴板中。
如果将该剪贴板内容粘贴到纯文本编辑器中(Notepad、Notepad++、VS Code 等), 您就可以检查定义该对象或表项所用的精确 JSON 块。这提供了一种直接且明确的方式来查看该对象在内部是如何表示的,而且通常也是 找出与脚本相关键值的最快途径。
许多右键菜单还会提供诸如 Copy JSON、Copy JSON path 或 Copy scripted path 的选项。 这些命令会显示对象在 JSON 层级中的精确位置, 从而使在脚本中定位和修改相应条目变得容易得多。
如果您实在卡住了:使用 diff 工具
如果您不确定某个特定 GUI 控件如何映射到 sim.json 文件,一个简单而有效的调试技术是使用文件比较(diff)工具。
- 先备份您的仿真文件,例如将
sim.json复制为sim.back。 - 在 GUI 中只修改一个参数。
-
使用 diff 工具(例如
KDiff3)
将修改后的
sim.json文件与备份进行比较。 - diff 输出将准确显示 JSON 中哪一行(或哪一块)发生了变化,从而揭示该 GUI 控件在内部是如何表示的。
这通常是将某个 UI 控件映射到特定 JSON 字段的最快方法,尤其是在大型参数树中。
使用对象 ID 在 sim.json 中定位条目
OghmaNano 中大多数结构化对象——例如层、形状、参数扫描和其他 层级实体——都会被分配一个唯一标识符(ID),通常是一个大约 16 个字符的随机十六进制 字符串。
对象 ID 通常会直接显示在 GUI 中。例如,在
图 ?? 中,
该 ID 显示在对象编辑器窗口的左下角。相同的标识符
也会出现在 sim.json 文件中的对应条目里。
当导航大型或深层嵌套的 JSON 结构时,这些 ID 极其有用。
通过在 sim.json 中搜索该 ID 字符串,您可以立即定位与特定 GUI 元素关联的
精确对象,即使周围的层级结构很复杂也一样。