创建 Python 加载项工具

创建加载项工具

工具与按钮非常相似。但工具需要用户先与桌面应用程序的显示画面进行交互,然后再根据交互执行某些业务逻辑。ArcMap 中的放大工具 放大 便是一个典型示例,该工具要求用户先在地图上单击或拖出一个矩形,然后才重绘显示画面,进而更详细地显示指定区域的地图内容。

本主题将指导您完成使用 Python 加载项向导在新工具条上创建工具这一过程。开始此工作流之前,请确保已创建 ArcMap 加载项项目并指定项目设置。有关详细信息,请参阅创建加载项项目。此工作流介绍的是如何为 ArcMap 创建工具,但您也可以使用此过程将工具添加到任何 ArcGIS for Desktop 应用程序。本主题详细介绍了“创建渔网”这一简单工具的创建过程。之后会更详细地介绍通过加载项向导创建的 Python 类,以探讨为工具提供功能的属性和方法。

创建加载项工具包含以下几步:

步骤:
  1. 创建工具条。

    单击加载项内容选项卡开始声明加载项自定义内容。工具可以位于工具条上,但不能位于菜单上。有关创建自己的工具条的步骤,请参阅创建加载项工具条

  2. 创建工具。

    右键单击新工具条,然后选择新建工具

    创建加载项工具

    工具具有多个属性需要用户设置。以下列出了所有这些属性及其对应的说明。这些属性存储在项目的 config.xml 文件中。

    属性

    描述

    标题(必填)

    定义工具的标题。下图显示了 ArcGIS 加载项管理器中使用的标题,有助于标识提供的不同自定义类型(加载项类型在括号中标识):

    加载项管理器中的渔网工具属性

    下图显示了用来标识工具条上工具的作为文本的标题:

    在 ArcMap 中创建渔网加载项工具

    (必填)

    表示工具的 Python 类。Python 类是写入工具业务逻辑的位置。此类非常重要,因为每次在桌面应用程序中单击工具时都会执行此类。构造类时应使用 Python 命名约定。Python 类使用单词“首字母大写”标记法。本例中,将创建一个名称为 CreateFishnet 的类。

    ID(必填)

    用于标识工具的唯一名称。您可以为给定项目创建多个工具,此 ID 便用来区分不同的工具。理想情况下,应使用更有意义的值替换默认 ID。ID 不应包含任何空格。可以使用下划线连接单词。不应使用 Python 关键字。有关保留字信息,请查阅 Python 文档。

    工具提示(可选)

    将鼠标指针悬停在桌面应用程序中的工具上方时出现的简短描述。

    消息(可选)

    对工具功能更加详细的描述。与工具提示相同,将鼠标指针悬停在工具上时,此消息会与工具提示一起显示。

    图像(可选)

    此图像应为 16 * 16 像素的图像,用于符号化工具。图像格式只能为以下格式之一:.png.gif.bmp。图像将复制到加载项项目中创建的图像文件夹中。

    工具的最后部分是帮助标题和内容。这些属性允许您提供一些信息并在用户调用上下文相关帮助时显示。这些信息为弹出主题,在用户单击其他位置之前,会一直保留在屏幕上。

    以下属性组成了该上下文相关帮助部分:

    属性

    描述

    标题(可选)

    指示帮助内容与哪方面相关

    内容(可选)

    工具的帮助内容

    输入属性后,可单击向导底部的保存。将在工作文件夹中创建所有必需的文件和文件夹。

  3. 编辑 Python 脚本并更新 Python 类,以包含创建面渔网这一功能。

    关注区域通过拖动鼠标创建矩形来定义。渔网的大小设置为 10 行 * 10 列。要将此功能添加到自定义工具,执行以下步骤:

    1. 在通过向导创建的工作文件夹下的安装文件夹中编辑 Python 脚本。

      将生成与通过向导输入的类同名的类。由于会在 config.xml 中引用这一类名称,因此不要重命名此类。有关此类的每个函数和属性的说明,请参阅工具类主题。

    2. 按如下方式更新函数。

      以下代码可提供创建 10 行 * 10 列的面渔网的功能。

      def __init__(self):
          self.enabled = True
          self.cursor = 3
          self.shape = 'Rectangle'
          
      def onRectangle(self, rectangle_geometry):
          """Occurs when the rectangle is drawn and the mouse button is released.
          The rectangle is a extent object."""
      
          extent = rectangle_geometry
          # Create a fishnet with 10 rows and 10 columns.
          if arcpy.Exists(r'in_memory\fishnet'):
              arcpy.Delete_management(r'in_memory\fishnet')
          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()
          return fishnet
      
    3. 保存脚本。
  4. 测试工具

    创建工具并添加脚本代码后,必须生成加载项文件并测试加载项,然后才能进行共享。相关步骤信息,请参阅测试加载项

  5. 部署和共享加载项。

    有关部署和共享加载项的步骤,请参阅共享加载项

相关主题

9/15/2013