Встановіть значення за замовчуванням для таблиці значень в інструменті 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
Я раніше нічого подібного не робив, тому просто викидаю ідею туди, і це може бути дуже нерозумно, але чи можете ви зберігати всі поля з усіх шарів у вашому init, а потім, коли користувач вибирає шар, він використовує це структура даних для заселення полів? як я вже говорив, я ніколи раніше не працював з цим і просто намагаюся вкласти свої 2 незначні центи
dassouki

Дякую за пропозицію. Я спробував це в методі getParameterInfo () з обома додаваннями рядків до самого об’єкта vt param та створенням нової таблиці значень, додаванням рядків та встановленням vt.value до нової таблиці значень, все ще не пощастивши. Я не думаю, що я можу використовувати це в екземплярі ReorderFields, оскільки поля залежать від класу функцій введення. Можливо, я можу зробити об'єкт таблиці значень в init і спробувати встановити vt.value на self.valueTable після заповнення рядків.
crmackey

Відповіді:


7

Змініть параметри оновлення так:

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

Ваша помилка тут - спробувати змінити вже ініційований параметр замість його значень через використання неправильної властивості. Будь ласка, перегляньте властивість 'values' Параметра (arcpy).


Гарний! Не можу повірити, що я пропустив це ... Це здається таким очевидним. Дуже дякую!
crmackey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.