ArcPy Toolbox


ArcPyのpytを試す。
テキストファイルの拡張子をpytにするだけでArcGISからはツールボックス認識になるのでツール定義をコードで記述するだけ。
tbxでパラメータ定義GUIでするとかもっさいよねって話からの進化か。

まあ使い易そうだが、あまりDesktop素で使う事がないので、仕事で使う事があるのかは謎。
しかし調べたがpytあまり見かけないのは流行ってないのか?。
もっとこれで色々拡張ツールが提供されていても良さそうだが。

pyt
pyt-dialog

下記をテキストに貼って拡張子をpytに変えれば動くはず (データドリブン設定したMXDを設定)
かわいらしく初心者な感じのコード。

import os.path
import arcpy

# Python ツールボックスのツール動作のカスタマイズ
# http://resources.arcgis.com/ja/help/main/10.1/index.html#//00150000002m000000
class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MyToolbox"
        self.alias = ""

        # ツールのリスト設定 ( クラス設定 )
        self.tools = [DataPagesTool]

# データドリブン画像化
class DataPagesTool(object):
    def __init__(self):
        self.label = "データドリブン出力"
        self.description = "データドリブン出力"
        self.canRunInBackground = False

    def getParameterInfo(self):
        # Python ツールボックスでのパラメータの定義
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000028000000
        # getParameterの型一覧
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000035000000
        # パラメータリファレンス
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//018z00000063000000

        # ドキュメント
        param0 = arcpy.Parameter(
        displayName="マップドキュメント",
        name="in_mxd",
        datatype="DEMapDocument",
        parameterType="Required",
        direction="Input")
        # 画像タイプ
        param1 = arcpy.Parameter(
        displayName="画像タイプ",
        name="in_imgType",
        datatype="GPString",
        parameterType="Required",
        direction="Input")

        param1.filter.type = "ValueList"
        param1.filter.list = ["JPEG", "PNG"]
        param1.value = "JPEG"

        # 出力フォルダ
        param2 = arcpy.Parameter(
        displayName="出力先フォルダ",
        name="in_OutDir",
        datatype="DEFolder",
        parameterType="Required",
        direction="Input")

        return [param0, param1, param2]

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        return True

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        return

    def updateMessages(self, parameters):
        """Modify the messages created by internal validation for each tool
        parameter.  This method is called after internal validation."""
        return

    def execute(self, parameters, messages):
        # Python ツールボックスでのメッセージの書き込み
        # http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000036000000

        mxd = parameters[0].valueAsText
        imgType = parameters[1].valueAsText
        outDir = parameters[2].valueAsText

        messages.addMessage("出力MXD:{0}".format(mxd))
        messages.addMessage("画像:{0}".format(imgType))

        mxd = arcpy.mapping.MapDocument(mxd);
        dataPages = None
        try:
            dataPages = mxd.dataDrivenPages
        except Exception as e:
            messages.addWarningMessage( e.message )

        if dataPages is None:
            messages.addErrorMessage("データドリブンページ未設定 -中断-")
            return

        messages.addMessage("フィールド:{0}".format(dataPages.pageNameField.name))
        # DataDrivenPages (arcpy.mapping)
        # http://resources.arcgis.com/en/help/main/10.2/index.html#//00s300000030000000
        # ページにてループ
        for pageInx in range(1, dataPages.pageCount + 1):
            dataPages.currentPageID = pageInx

            pageName = u"なし"
            try:
                # ページ名称 + ページ番号
                pageName = dataPages.pageRow.getValue( dataPages.pageNameField.name )
            except Exception as e:
                messages.addWarningMessage( e.message )

            messages.addMessage(pageName)
            """if not (type(pageName) is str):
                pageNeme = str(pageName)"""

            pageName = pageName + u"_" + str(pageInx)

            #path = outDir + u"\\" + pageName
            path = outDir + u"\\" + pageName
            if imgType == "JPEG":
                arcpy.mapping.ExportToJPEG(mxd, path + u".jpg")
            else: # imgType == "PNG" とその他
                arcpy.mapping.ExportToPNG(mxd, path + u".png")

        return
カテゴリー: 開発 タグ: , パーマリンク