在Python工具箱工具中设置值表的默认值


10

我创建了一个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年

Answers:


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)的“值”属性


美丽!我不敢相信我会错过...似乎很明显。非常感谢你!
crmackey 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.