Установите значения по умолчанию для таблицы значений в инструменте Python Toolbox

10

Я создал инструмент Python Toolbox для изменения порядка полей и создания нового класса объектов с переупорядоченными полями. Инструмент работает хорошо, и я могу использовать таблицу значений, чтобы позволить пользователю расположить поля в выбранном ими порядке или они могут заполнить значение ранга для каждого поля. Однако досадная часть этого инструмента заключается в том, что все поля должны быть добавлены в таблицу значений по одному перед переупорядочением.

Я пытаюсь настроить это так, чтобы все поля в таблицу значений были включены по умолчанию, и любые ненужные поля могут быть удалены перед переупорядочением. Кто-нибудь имел успех делать что-то подобное раньше? Я пытаюсь добиться этого в методе 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для добавления строк таблицу конкретных значений из графического интерфейса, но это дало мне ошибки. Я использую ArcGIS 10.2.2.

crmackey
источник
1
Я не делал ничего подобного раньше, поэтому просто выдвинул идею, и это может быть очень неразумно, но вы можете сохранить все поля из всех слоев в вашей инициализации, а затем, когда пользователь выбирает слой, он использует это структура данных для заполнения полей? как я уже говорил, я никогда не работал с этим раньше и просто пытаюсь положить свои 2 незначительных цента
dassouki
Спасибо за предложение. Я попытался это сделать в методе getParameterInfo (), добавив строки в сам объект vt param и создав новую таблицу значений, добавив строки и установив vt.value в новую таблицу значений, но все же безуспешно. Я не думаю, что смогу использовать это в экземпляре ReorderFields, потому что поля зависят от входного класса объектов. Может быть, я могу создать объект таблицы значений в init и попробовать установить vt.value в self.valueTable после заполнения строк.
crmackey

Ответы:

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).

fatih_dur
источник
Прекрасный! Не могу поверить, что пропустил это ... Кажется, это так очевидно. Большое спасибо!
crmackey