ENVI 5.4 即将推出:ENVITask 样式表
8296 为本文评分:
5.0
ENVI 5.4 即将推出:ENVITask 样式表
匿名 2016年9月23日,星期五
自 ENVI 5.2 早期引入 ENVITasks 以来,一直存在着我们称之为动态用户界面(Dynamic UI)的功能。一些封装了 ENVITasks 的工具箱项会使用它,但您随时可以使用 ENVIUI::SelectTaskParameters() 方法,通过它来设置任务的部分或全部参数。当您调用此方法时,它会检查任务以获取每个参数的名称(NAME)、类型(TYPE)和值(VALUE)属性,并为每个参数构建包含小部件的对话框。如果参数值(VALUE)为 !NULL,则对应的小部件将显示为空;如果参数值有效,小部件则会显示该值。我们有一套启发式规则来尝试为每种类型(TYPE)选择最佳的小部件,但对于特定参数,它可能无法选择您想要的小部件。
为了解决这个问题,我们将在即将发布的 ENVI 5.4 中引入任务样式表。这个想法借鉴自 HTML 和 CSS,它们将内容与呈现分离。在 ENVITask 的上下文中,ENVITask 模板定义了内容,而样式表定义了呈现逻辑。这些样式表目前远不如 CSS 那么复杂,例如缺少层叠机制,但对于我们的目的来说并不需要那么复杂。样式表可以是一个 JSON 文件或内存中的哈希表(Hash),它允许您隐藏对话框底部的几个小部件,并为每个参数指定使用哪个小部件。您无需指定每个参数,不在样式表中的参数将回退到使用启发式规则选择的小部件。
让我们通过帮助页面中的示例来具体说明:
e = ENVI() Task = ENVITask('NNDiffusePanSharpening') ret = e.UI.SelectTaskParameters(Task)
生成的弹出对话框如下所示:

"像素大小比率"(Pixel Size Ratio)参数必须是整数,因此我们使用了带增/减按钮的编辑小部件。但也许您想使用滚轮小部件;这时样式表就派上用场了。
我可以将"像素大小比率"参数更改为使用滚轮小部件,如下所示:
style = Hash("schema", "envitask_3.0", $ "parameters", List(Hash("name", "pixel_size_ratio", $ "type", "IDLWheel_UI"))) ret = e.UI.SelectTaskParameters(Task, STYLE_SHEET=style)
一个关键点是,"parameters" 的值必须是一个哈希表(Hash)的列表(List),即使只有一个参数。等效的 JSON 文件如下:
{ "schema": "envitask_3.0", "parameters": [ { "name": "pixel_size_ratio", "type": "IDLWheel_UI" } ] }
现在对话框看起来是这样的:

所有可能的"type"值都在"用户界面元素"(User Interface Elements)标题下有详细的文档说明。一些小部件允许您指定额外的属性来自定义其行为。例如,IDLWheel_UI 类支持指定最小(MIN)和最大(MAX)属性。如果参数本身已设置了这些属性,它们将被使用,但正如您在 NNDifusePanSharpening 任务中看到的,该参数并没有设置。不过,如果我们想要添加它们,可以在样式表中进行指定。我们通过将所有属性放入"keywords"键下的一个哈希表中来实现:
style = Hash("schema", "envitask_3.0", $ "parameters", List(Hash("name", "pixel_size_ratio", $ "type", "IDLWheel_UI", $ "keywords", Hash("min", 1, $ "max", 9)))) ret = e.UI.SelectTaskParameters(Task, STYLE_SHEET=style)
等效的 JSON 文件如下:
{ "schema": "envitask_3.0", "parameters": [ { "name": "pixel_size_ratio", "type": "IDLWheel_UI", "keywords": { "max": 9, "min": 1 } } ] }
现在对话框看起来是这样的:

在上述所有示例中,我都在调用 SelectTaskParameters() 时手动指定了 STYLE_SHEET 关键字。如果您希望每次调用此方法处理您的任务时都自动使用样式表,那么请创建一个名为 <任务名称>.style 的 JSON 文件,并将其放在与 .task 文件相同的文件夹中。