在后台运行自定义(模型或脚本)工具
如果在后台执行工具,您便可以继续与应用程序(例如 ArcMap)进行交互从而在工具运行期间执行其他任务。
默认情况下,模型或脚本工具在前台运行。如果希望工具在后台运行,则需要解决下方列出的问题。确保模型和脚本纠正了这些问题后,便可按以下步骤在后台运行工具:
- 在目录 窗口或 ArcToolbox 窗口中,右键单击工具,然后单击属性。在常规选项卡中,取消选中始终在前台中运行,然后单击确定。
- 在 ArcMap 菜单中,单击地理处理 > 地理处理选项。在后台处理窗格中,选中启用。
必须解决的问题包括
- 使用地图文档图层(模型和脚本工具均存在此问题)。
- 在脚本工具中使用当前地图 文档(仅脚本工具存在此问题)。
问题 1 - 使用地图文档图层
模型示例
如果要在后台执行某模型工具,仅作为模型参数参与的图层才允许进入后台进程。例如,下方模型允许用户输入感兴趣区域、起始等值线和等值线间距,以便生成一个等值线要素类。此模型包含四个参数(3 个输入参数和 1 个输出参数)。请注意,Elevation Raster 变量虽然是 ArcMap 内容列表中的图层,但却不会被设置为模型参数。使用模型的工具对话框运行模型时,用户需要为感兴趣区域参数输入 Potential Landfill Site 图层,但无需提供 Elevation Raster 图层,因此它不属于参数。
上述模型将按预期在前台运行。但如果将此模型设置为在后台运行,运行将失败,并会显示警告:“无任何进程准备好运行”,如下图所示。失败的原因是后台运行的进程无法使用不属于工具参数的图层。这种情况下,由于 Elevation Raster 模型变量不属于参数,后台进程无法找到它,因此运行会失败并会显示警告。
解决方案
可采用多种方法更改模型,以使其能够在后台运行。
- 使图层变量成为模型参数。执行此操作可将图层传递给后台进程,然后此工具便可在后台中执行。这是最简单的解决方案。
- 不使用图层而使用磁盘上的数据集。在上例中,您可双击 Extract by Mask 工具,然后将输入栅格参数(由 Elevation Raster 变量表示)更改为使用栅格数据集而非内容列表中的图层。此解决方案存在唯一的问题是,图层可执行选择操作,而磁盘上的数据集则不可用。如果是因为需要使用图层选择而要使用某图层变量,则不能使用磁盘上的数据集。这种情况下,您有两种选择(除了使变量成为模型参数以外):
除了将输入图层设置为模型参数外,由模型创建或更新的所有其他图层也都必须设置为模型参数。
脚本工具示例
将图层用作输入时,脚本工具存在与模型工具相同的问题。传递的每个图层都必须是参数形式,并且必须属于正确的地理处理数据类型。脚本工具比较灵活,用户的选择余地更大;例如,使用与内容列表中图层名称匹配的字符串数据类型,脚本工具便可对图层执行操作。尽管此方法在前台中有效,但在后台中却不起作用,因为地图图层参考与后台进程之间不存在连接。下图演示的是某参数图层以字符串形式进行传递,并且脚本的属性也进行了修改,以便将图层用作输入。
解决方案
请确保脚本工具参数使用的是正确的数据类型,如“要素图层”、“栅格图层”和“表视图”。
如果脚本工具使用的图层不属于参数,则需要
- 使图层成为参数。
- 不使用图层,改为使用磁盘上的数据集或 .lyr 文件。
问题 2 - 在脚本工具中使用当前地图 文档。
当前地图文档中运行的脚本工具必须在前台运行。arcpy.MapDocument 类是在各种脚本工具中使用当前地图文档的有效方法。例如,在您的脚本中,可能自动缩放到了刚刚选择的要素。运行以下脚本将发生错误“Object: CreateObject 无法打开地图文档”。
选择要素并使用 ArcPy 映射缩放至这些要素的脚本示例
idvalue = arcpy.GetParameterAsText(0)
SelectLayerByAttribute_management("Parcels","NEW_SELECTION","ID' = " + idvalue)
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
df.zoomToSelectedFeatures()
解决方案
使用当前地图文档的脚本工具必须始终在前台中运行。在目录 窗口中,右键单击脚本工具,然后单击属性。在常规选项卡中,选中始终在前台中运行。
在工具中运行工具
假设您的脚本工具使用上述当前地图文档,并且此工具必须始终在前台运行。如果在某模型工具中使用此脚本工具并且该模型工具需要在后台中运行,会出现什么情况?答案就是,模型会注意到其本身包含必须在前台执行的工具。如果包含任何必须在前台运行的工具,则模型工具将自动在前台中运行。