Установите значения по умолчанию для таблицы значений в инструменте 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.


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


Прекрасный! Не могу поверить, что пропустил это ... Кажется, это так очевидно. Большое спасибо!
crmackey
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.