Python Toolboxツールで値テーブルのデフォルト値を設定する


10

フィールドを並べ替え、並べ替えられたフィールドを使用して新しいフィーチャクラスを作成するPython Toolboxツールを作成しました。ツールは適切に機能し、値テーブルを使用して、ユーザーが選択した順序でフィールドを配置したり、各フィールドのランク値を入力したりできます。ただし、このツールの厄介な点は、すべてのフィールドを並べ替える前に、一度に1つずつ値テーブルに追加する必要があることです。

私はこれを設定して、デフォルトですべてのフィールドを値テーブルに取り込むようにしています。不要なフィールドは、並べ替える前に削除できます。誰かが以前にこのようなことをすることに成功したことがありますか?UpdateParametersメソッドでこれを実現しようとしています。これが私が試しているコードです:

import arcpy
import os

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "Reorder Fields"
        self.alias = "Reorder Fields"

        # List of tool classes associated with this toolbox
        self.tools = [ReorderFields]


class ReorderFields(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "Reorder Fields"
        self.description = ""
        self.canRunInBackground = False

    def getParameterInfo(self):
        """Define parameter definitions"""
        fc = arcpy.Parameter(displayName='Features',
            name='features',
            datatype='Feature Layer',
            parameterType='Required',
            direction='Input')

        vt = arcpy.Parameter(
            displayName='Fields',
            name='Fields',
            datatype='Value Table',
            parameterType='Required',
            direction='Input')

        output = arcpy.Parameter(
            displayName='Output Features',
            name='output_features',
            datatype='Feature Class',
            parameterType='Required',
            direction='Output')

        vt.columns = [['Field', 'Fields'], ['Long', 'Ranks']]
        vt.parameterDependencies = [fc.name]    
        params = [fc, vt, output]
        return params

    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."""
        if parameters[0].value:
            if not parameters[1].altered:
                fields = [f for f in arcpy.Describe(str(parameters[0].value)).fields
                          if f.type not in ('OID', 'Geometry')]
                vtab = arcpy.ValueTable(2)
                for field in fields:
                    vtab.addRow("{0} {1}".format(field.name, ''))
                parameters[1].value = vtab
        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):
        """The source code of the tool."""
        fc = parameters[0].valueAsText
        vt = parameters[1].valueAsText
        output = parameters[2].valueAsText

ここに画像の説明を入力してください

上記の値の表に示すように、デフォルトですべてのフィールドを使用したいと思います。parameters[1].valueGUIから特定の値のテーブルに行を追加することも試みましたが、エラーが発生しました。ArcGIS 10.2.2を使用しています。


1
私は以前にそのようなことをしたことがないので、そこにアイデアを投げるとそれは非常に不合理になる可能性がありますが、あなたはあなたのinitのすべてのレイヤーからすべてのフィールドを保存でき、ユーザーがレイヤーを選択するとそれを使用しますフィールドに入力するデータ構造?前にも言ったように、これを使ったことはなく、わずかな2セントを入れようとしただけです
dassouki

提案をありがとう。行をvt paramオブジェクト自体に追加することと、新しい値テーブルを作成すること、行を追加すること、そしてvt.valueを新しい値テーブルに設定することの両方をgetParameterInfo()メソッドで試しましたが、まだ運がありません。フィールドが入力フィーチャクラスに依存しているため、ReorderFieldsのインスタンス化でこれを使用できないと思います。おそらく、initで値テーブルオブジェクトを作成し、行が入力されたら、vt.valueをself.valueTableに設定してみることができます。
crmackey 14

回答:


7

次のようにupdateParametersを変更します。

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."""
    if parameters[0].value:
        if not parameters[1].altered:
            fields = [f for f in arcpy.Describe(str(parameters[0].value)).fields
                      if f.type not in ('OID', 'Geometry')]
            vtab = []
            for field in fields:
                vtab.append([field.name,None])
            parameters[1].values = vtab
    return

ここでの間違いは、間違ったプロパティを使用したために、値の代わりに既に開始されたパラメーターを変更しようとすることです。パラメータ(arcpy)の「values」プロパティを参照してください。


綺麗な!それを逃したなんて信じられない...それはとても明白なようです。どうもありがとうございました!
crmackey 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.