Python アドイン コンボ ボックスの作成

アドイン コンボ ボックスの作成

コンボ ボックスには、編集可能なフィールドとドロップダウン リストが含まれます。ユーザは、ユーザがリクエストしたときに表示されるドロップダウン リストから値を選択できます。コンボ ボックスを編集可能にすると、コンボ ボックスに編集可能なフィールドが含まれ、ユーザが値を入力できるようになります。コンボ ボックスの例として、ArcMap の [縮尺] コンボ ボックスがあります。既知の座標系を持つデータを ArcMap に追加するとき、[縮尺] コンボ ボックスが有効になり、ユーザはあらかじめ定義された縮尺のいずれかを選択できます。リストにない新しい縮尺をユーザが入力することも可能で、追加された値に基づいてマップが表示されます。

このトピックでは、Python アドイン ウィザードを使用して新しいツールバーにコンボ ボックスを作成する方法を、手順に従って説明します。このワークフローを開始する前に、ArcMap のアドイン プロジェクトを作成して、プロジェクト設定を指定していることを確認してください。詳細については、「アドイン プロジェクトの作成」をご参照ください。このワークフローでは ArcMap のコンボ ボックスを作成する方法を説明しますが、他の ArcGIS for Desktop アプリケーションでも、同じ方法でコンボ ボックスを追加できます。このトピックでは、コンテンツ ウィンドウからレイヤのリストを表示するコンボ ボックスを作成する処理を検証します。レイヤが選択されると、レイヤの全範囲を対象としてフィッシュネットを作成します。その後、アドイン ウィザードで作成された Python クラスを詳しく検証して、コンボ ボックスに機能を提供するプロパティとメソッドを確認します。

アドイン コンボ ボックスを作成する処理は、以下の手順で構成されます。

手順:
  1. ツールバーを作成します。

    必要なプロジェクト設定を入力したら、[アドインのコンテンツ] タブをクリックして、アドインのカスタマイズを宣言します。コンボ ボックスはツールバーに配置できますが、メニューには配置できません。ツールバーを作成する手順については、「アドイン ツールバーの作成」をご参照ください。

  2. コンボ ボックスを作成します。

    ツールバーのプロパティを入力したら、新しいコンボ ボックスを作成できます。新しいツール バーを右クリックし、ショートカット メニューの [新規コンボ ボックス] を選択します。

    アドイン ウィザードでのコンボ ボックス プロパティの設定

    コンボ ボックスには多くのプロパティを設定できます。これらのプロパティは、プロジェクトの config.xml ファイルに格納されます。以下のリストに、すべてのプロパティとその説明を示します。

    プロパティ

    説明

    キャプション(必須)

    コンボ ボックスのキャプションを指定します。次の図は、ArcGIS アドイン マネージャに表示されたキャプションを示しています。利用可能なカスタマイズのタイプを判断するのに役立ちます(アドインのタイプが括弧内に示されています)。

    アドイン マネージャに表示されたコンボ ボックスのプロパティ

    クラス(必須)

    Python クラスは、コンボ ボックスのビジネス ロジックを書き込む場所です。このクラスは、コンボ ボックスが編集されるごと、または選択が変更されるごとに実行されるため重要です。クラスを構築するときは、Python の命名規則を使用します。Python クラスでは、各単語の先頭を大文字にする表記法が使用されます。この例では、LayersComboBox というクラスを作成します。

    ID(必須)

    コンボ ボックスを識別するための一意の名前。1 つのプロジェクトに複数のコンボ ボックスを作成することができるため、この ID を使用して各コンボ ボックスを区別します。デフォルトの ID を、意味のある値に置き換えると理想的です。ID にスペースを含めることはできません。単語を区切る場合はアンダースコアを使用してください。Python のキーワードも使用しないでください。予約語については、Python のドキュメントをご参照ください。

    ツールチップ(オプション)

    デスクトップ アプリケーションでマウス ポインタをコンボ ボックスの上に置いたときに表示される簡単な説明。

    メッセージ(オプション)

    コンボ ボックスの動作の詳細な説明。メッセージは、マウス ポインタをコンボ ボックスの上に置いたときにツールチップの下に表示されます。

    ヒント テキスト(オプション)

    コンボ ボックスがデスクトップ アプリケーションでアクティブでないときに、コンボ ボックス上に表示されるテキスト。このテキストは、ユーザがコンボ ボックスで選択するアイテムのタイプ、またはユーザがコンボ ボックスから選択する必要があるアイテムの種類を説明するために使用できます。

    コンボ ボックスの最後のセクションは、ヘルプの見出しとコンテンツについてです。これらのプロパティでは、ユーザがポップアップ ヘルプを呼び出したときに使用される情報を設定できます。これらはポップアップ トピックとして表示され、ユーザが別の場所をクリックするまで画面上に表示されたままになります。

    ポップアップ ヘルプのセクションは以下のプロパティで構成されます。

    プロパティ

    説明

    見出し(オプション)

    ヘルプ コンテンツの要約を示します。

    コンテンツ(オプション)

    コンボ ボックスのヘルプ コンテンツ。

    プロパティの入力が完了したら、ウィザードの下部にある [保存] ボタンをクリックします。これにより、必要なすべてのファイルとフォルダが作業フォルダに作成されます。

  3. Python スクリプトを編集します。

    この段階で、アドイン コンボ ボックスの定義に必要なプロパティに対して値の追加が完了しています。このワークフローの次の手順では、Python スクリプトを編集し、ポリゴンのフィッシュネットを作成する機能を含むように Python クラスを更新します。コンボ ボックスには、アクティブなデータ フレームのレイヤのリストが設定されます。コンボ ボックスでレイヤを選択すると、選択したレイヤの範囲を使用して 10 行 x 10 列のフィッシュネットが作成されます。コンボ ボックスに機能を追加するには、以下の手順を実行します。

    1. 作業フォルダ内の Install フォルダにある、ウィザードが作成した Python スクリプトを編集します。

      ウィザードで入力した名前と同じ名前のクラスが存在します。クラス名は config.xml で参照されているため、このクラス名は変更しないでください。クラスは、「コンボ ボックス クラス」で説明した複数の関数とプロパティで構成されています。

    2. 関数を以下に示すように更新します。

      このコードにより、コンボ ボックスで選択したレイヤの範囲を使用して、ポリゴンのフィッシュネットを 10 行 x 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)
      
    3. スクリプトを保存します。
  4. コンボ ボックスをテストします。

    コンボ ボックスを作成してスクリプト コードを追加したら、アドインを共有する前に、アドイン ファイルを作成してテストすることが重要です。これらの手順については、「アドインのテスト」をご参照ください。

  5. アドインを共有します。

    コンボ ボックスをテストして正常に動作することを確認したら、アドインを配備および共有する準備は完了です。詳細については、「アドインの共有とインストール」をご参照ください。

関連トピック

9/14/2013