フィールドを並べ替え、並べ替えられたフィールドを使用して新しいフィーチャクラスを作成する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].value
GUIから特定の値のテーブルに行を追加することも試みましたが、エラーが発生しました。ArcGIS 10.2.2を使用しています。
1
私は以前にそのようなことをしたことがないので、そこにアイデアを投げるとそれは非常に不合理になる可能性がありますが、あなたはあなたのinitのすべてのレイヤーからすべてのフィールドを保存でき、ユーザーがレイヤーを選択するとそれを使用しますフィールドに入力するデータ構造?前にも言ったように、これを使ったことはなく、わずかな2セントを入れようとしただけです
—
dassouki
提案をありがとう。行をvt paramオブジェクト自体に追加することと、新しい値テーブルを作成すること、行を追加すること、そしてvt.valueを新しい値テーブルに設定することの両方をgetParameterInfo()メソッドで試しましたが、まだ運がありません。フィールドが入力フィーチャクラスに依存しているため、ReorderFieldsのインスタンス化でこれを使用できないと思います。おそらく、initで値テーブルオブジェクトを作成し、行が入力されたら、vt.valueをself.valueTableに設定してみることができます。
—
crmackey 14