我创建了一个Python工具箱工具来对字段重新排序,并使用重新排序的字段创建新的要素类。该工具运行良好,并且我可以使用值表让用户按他们选择的顺序排列字段,也可以为每个字段填写排名值。但是,此工具的烦人之处在于,在重新排序之前,所有字段都必须一次添加到值表中。
我试图将其设置为默认情况下将所有字段引入值表,并且可以在重新排序之前删除所有不需要的字段。以前有人做过这样的事吗?我试图在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中所有层的所有字段都存储在init中,然后当用户选择一个层时,它会使用数据结构来填充字段?正如我说过的,我从来没有使用过它,只是尝试放入我微不足道的2美分
—
dassouki 2014年
谢谢你的建议。我尝试在getParameterInfo()方法中将行添加到vt param对象本身并创建一个新的值表,添加行并将vt.value设置为新值表,但仍然没有运气。我认为我不能在ReorderFields实例化中使用它,因为这些字段取决于输入要素类。也许我可以在init中创建一个值表对象,并在填充行后尝试将vt.value设置为self.valueTable。
—
crmackey 2014年