创建 Python 加载项应用程序扩展模块
可以通过多种方法使用应用程序扩展模块,从而为 ArcGIS Desktop 提供补充功能。
- 应用程序扩展模块通常用于对一组执行类似任务的关联函数进行分组。ArcGIS 3D Analyst 扩展模块、Business Analyst 等就是 ArcMap 中的典型扩展模块示例。
- 应用程序扩展模块通常负责监听并响应主应用程序所显示的各种事件。例如,每次添加或移除图层时,都会触发事件,并且扩展模块会通过自动保存地图文档进行响应。
- 应用程序扩展模块用于协调包含加载项内其他组件(如按钮和工具)之间的活动。例如,除非将一组特定图层添加到地图中,否则扩展模块可能不会激活工具条上的某组工具。
本主题将指导您完成应用程序扩展模块的创建过程。开始此工作流之前,请确保已创建 ArcMap 加载项项目并指定项目设置。有关详细信息,请参阅创建加载项项目。此工作流说明了如何为 ArcMap 创建扩展模块;但为任何 ArcGIS Desktop 应用程序创建菜单时采用的工作流与此并无差异。本主题详细介绍了扩展模块的创建过程,每次打开文档或创建新文档时,该扩展模块都会向 ArcMap 添加基础图层。之后会更详细地介绍通过 Python 加载项向导 创建的 Python 类,以探讨为扩展模块提供功能的属性和方法。
创建加载项应用程序扩展模块包含两个步骤:
-
创建应用程序扩展模块。
输入所需项目设置后,单击加载项内容选项卡。要开始创建,请右键单击扩展模块,然后单击“新建扩展模块”。
扩展模块具有多个属性需要用户输入。以下列出了所有这些属性及其对应的说明。这些属性存储在项目的 config.xml 文件中。
属性 描述 名称(必填)
表示应用程序扩展模块的名称。在以下屏幕截图中,该名称即为“扩展模块”对话框中用于桌面应用程序的名称。
类名称(必填)
表示扩展模块的 Python 类。Python 类是写入扩展模块业务逻辑的位置。此类非常重要,因为在桌面应用程序中使用应用程序扩展模块时会对其进行调用。构造类时应使用 Python 命名约定。Python 类使用单词首字母大写标记法。本例中,我们创建的类的名称为 AddBaseLayer。
ID(必填)
这是用于标识扩展模块的唯一名称。您可以为给定项目创建多个扩展模块,此 ID 被用来区分不同的应用程序扩展模块。理想情况下,应使用更有意义的 ID 值替换默认 ID 值。ID 不应包含任何空格。可以使用下划线连接单词。不应使用 Python 关键字。有关保留字信息,请查阅 Python 文档。加载项命名空间将作为 ID 的前缀。命名空间存储在 config.xml 文件中。
描述(可选)
描述应用程序扩展模块的用途。例如,3D Analyst 扩展模块提供地表建模和 3D 可视化工具。描述显示在“扩展模块”对话框底部。
自动加载(可选)
允许在打开桌面应用程序时自动加载应用程序扩展模块。默认情况下,此选项处于选中状态。选中此选项后,Python 脚本中已启用的属性将设置为 True。
输入属性后,可单击向导底部的保存按钮。将在工作文件夹中创建所有必需的文件和文件夹。
- 编辑 Python 脚本。
下一步是编辑 Python 脚本并更新 Python 类,以包含在每次打开或创建地图文档时添加基础图层这一功能。此功能通过监听并响应 ArcMap 的 openDocument 和 newDocument 事件来实现。要将此功能添加到自定义扩展模块,执行以下步骤:
- 在通过向导创建的工作文件夹下的安装文件夹中编辑 Python 脚本。
将生成与通过向导输入的类同名的类。由于会在 config.xml 中引用了这一类名称,因此不应重命名此类。有关扩展类中各个函数的详细信息,请参阅扩展类主题。
- 按如下方式更新 newDocument 和 openDocument 事件函数。
以下代码可提供将基础图层添加到活动数据框(若其中尚不存在基础图层)这一功能。
def newDocument(self): """ Adds a base layer if it is not already added to the active data frame of the map. """ # Provide a layer file and the layer name as it would appear in the Table of contents. base_layer = r'C:\GISData\module5\World_Street_Map.lyr' base_layer_name = 'World Street Map' mxd = arcpy.mapping.MapDocument('current') active_view = mxd.activeView df = arcpy.mapping.ListDataFrames(mxd, active_view)[0] if arcpy.mapping.ListLayers(mxd, base_layer_name) == []: arcpy.mapping.AddLayer(df, arcpy.mapping.Layer(base_layer)) arcpy.RefreshTOC() else: return def openDocument(self): """ Adds a base layer if it is not already added to the active data frame of the map. """ base_layer = r'C:\GISData\module5\World_Street_Map.lyr' base_layer_name = 'World Street Map' mxd = arcpy.mapping.MapDocument('current') active_view = mxd.activeView df = arcpy.mapping.ListDataFrames(mxd, active_view)[0] if arcpy.mapping.ListLayers(mxd, base_layer_name) == []: arcpy.mapping.AddLayer(df, arcpy.mapping.Layer(base_layer)) arcpy.RefreshTOC() else: return
- 从脚本中删除所有未执行的函数。
必须从脚本中删除所有未执行的函数。这样可以确保应用程序不会调用这些函数。
- 保存脚本。
- 在通过向导创建的工作文件夹下的安装文件夹中编辑 Python 脚本。
- 测试应用程序扩展模块。
创建应用程序扩展模块并添加了脚本代码后,必须创建加载项文件并予以测试,之后才能进行共享,这一点非常重要。相关步骤信息,请参阅测试加载项。
- 部署和共享应用程序扩展模块。
有关部署和共享加载项的步骤,请参阅共享加载项。