创建加载项组合框
组合框包含可编辑字段和下拉列表。用户可从根据其请求而显示的下拉列表中选择值。如果要使组合框可供编辑,则组合框应包含可编辑的字段,供用户在其中输入值。ArcMap 中的比例组合框是一个典型的组合框示例。将坐标系已知的数据添加到 ArcMap 时,启用比例组合框可提供一组预定义比例供您选择。它还允许用户输入选项列表中未提供的所需比例,地图将根据添加的值显示。
本主题将指导您完成使用 Python 加载项向导 在新工具条上创建组合框的过程。开始此工作流之前,请确保已创建 ArcMap 加载项项目并指定项目设置。有关详细信息,请参阅创建加载项项目。此工作流介绍的是如何为 ArcMap 创建组合框,但您也可以使用此过程将组合框添加到任何 ArcGIS for Desktop 应用程序。本主题可检查通过内容列表来创建具有图层列表的组合框的过程。通过选择图层将会创建覆盖图层全图范围的渔网。之后会更详细地检查通过加载项向导创建的 Python 类,以探讨为组合框提供功能的属性和方法。
创建加载项组合框包含以下几步:
- 创建工具条。
输入所需项目设置后,单击加载项内容选项卡开始声明加载项自定义内容。组合框可位于工具条上,但无法出现在菜单上。有关创建工具条的步骤,请参阅创建加载项工具条。
- 创建组合框。
输入工具条属性后,即可创建新组合框。右键单击新工具条,然后从快捷菜单中选择新建组合框。
组合框具有多个属性需要用户设置。这些属性存储在项目的 config.xml 文件中。以下列出了所有这些属性及其对应的说明。
属性 描述 标题(必填)
定义组合框标题。下图显示了 ArcGIS 加载项管理器中使用的标题,有助于标识不同类型的可用自定义内容(加载项类型在括号中标识):
类(必填)
Python 类是写入组合框业务逻辑的位置。该类很重要,因为每当编辑组合框或更改选择时都会执行该类。构造类时应使用 Python 命名约定。Python 类使用单词首字母大写标记法。本例中,将创建一个名为“LayersComboBox”的类。
ID(必填)
用于标识组合框的唯一名称。您可以为给定项目创建多个组合框;此 ID 用来区分不同的组合框。理想情况下,应使用更有意义的值替换默认 ID。ID 不应包含任何空格。可以使用下划线连接单词。不应使用 Python 关键字。有关保留字信息,请查阅 Python 文档。
工具提示(可选)
将鼠标指针悬停在桌面应用程序中的组合框上方时出现的简短描述。
消息(可选)
组合框功能的详细描述。将鼠标指针悬停在组合框上方时,此消息会显示在工具提示下方。
提示文本(可选)
在桌面应用程序中处于非活动状态的组合框上显示的文本。该文本可用于指示用户从组合框中选择的项目类型或提示用户需要从组合框中选择的项目种类。
组合框的最后部分是帮助标题和内容。这些属性允许您提供一些信息并在用户调用上下文相关帮助时加以使用。这些信息为弹出主题,在用户单击其他位置之前,会一直保留在屏幕上。
以下属性组成了该上下文相关帮助部分:
属性 描述 标题(可选)
指示帮助内容与哪方面相关
内容(可选)
组合框的帮助内容
输入属性后,可单击向导底部的保存按钮。将在工作文件夹中创建所有必需的文件和文件夹。
- 编辑 Python 脚本。
此时已为定义加载项组合框所需的属性添加了值。此工作流的下一步是编辑 Python 脚本并更新 Python 类,以包含“创建面的渔网”这一功能。组合框将以活动数据框中的图层列表填充。从组合框中选择图层时,使用大小设置为 10 行乘 10 列的图层范围创建渔网。要将此功能添加到组合框,需执行以下步骤:
- 在通过向导创建的工作文件夹下的安装文件夹中编辑 Python 脚本。
将生成与通过向导输入的类同名的类。由于会在 config.xml 中引用这一类名称,因此不应重命名此类。该类由组合框类主题中描述的多个函数和属性组成。
- 按如下方式更新函数。
以下代码提供了使用从组合框中选择的图层范围来创建大小为 10 行乘 10 列的面渔网的功能。
# Business logic to implement the ComboBox def __init__(self): self.editable = True self.enabled = True def onSelChange(self, selection): # When a new layer is selected, create a new fishnet using the extent of layer. layer = arcpy.mapping.ListLayers(self.mxd, selection)[0] desc = arcpy.Describe(layer.dataSource) extent = desc.Extent fishnet = arcpy.CreateFishnet_management(r'in_memory\fishnet', '%f %f' %(extent.XMin, extent.YMin), '%f %f' %(extent.XMin, extent.YMax), 0, 0, 10, 10, '%f %f' %(extent.XMax, extent.YMax), 'NO_LABELS', '%f %f %f %f' %(extent.XMin, extent.YMin, extent.XMax, extent.YMax), 'POLYGON') arcpy.RefreshActiveView() def onFocus(self, focused): # When the combo box has focus, update the combo box with the list of layer names. if focused: self.mxd = arcpy.mapping.MapDocument('current') layers = arcpy.mapping.ListLayers(self.mxd) self.items = [] for layer in layers: self.items.append(layer.name)
- 保存脚本。
- 在通过向导创建的工作文件夹下的安装文件夹中编辑 Python 脚本。
- 测试组合框。
创建组合框并添加脚本代码后,必须生成加载项文件并测试加载项,然后才能进行共享。有关步骤信息,请参阅测试加载项。
- 共享加载项。
测试并确认组合框能按预期工作后,即可部署和共享加载项。有关详细信息,请参阅共享加载项。