Impostare i valori predefiniti per la tabella dei valori nello strumento Python Toolbox


10

Ho creato uno strumento Python Toolbox per riordinare i campi e creare una nuova classe di funzionalità con i campi riordinati. Lo strumento funziona bene e sono in grado di utilizzare una tabella dei valori per consentire all'utente di disporre i campi nell'ordine che scelgono o possono compilare un valore di classificazione per ciascun campo. Tuttavia, la parte fastidiosa di questo strumento è che tutti i campi devono essere aggiunti alla tabella dei valori uno alla volta prima di riordinarli.

Sto cercando di impostare questo per portare tutti i campi nella tabella dei valori per impostazione predefinita e tutti i campi indesiderati possono essere rimossi prima di riordinarli. Qualcuno ha avuto successo facendo qualcosa di simile prima? Sto cercando di raggiungere questo obiettivo con il metodo UpdateParameters. Ecco il codice che sto provando:

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

inserisci qui la descrizione dell'immagine

Voglio portare tutti i campi come mostrato nella tabella dei valori sopra per impostazione predefinita. Ho anche provato a utilizzare parameters[1].valueper aggiungere righe la tabella dei valori specifici dalla GUI, ma questo mi ha dato errori. Sto usando ArcGIS 10.2.2.


1
Non ho mai fatto nulla del genere prima, quindi basta lanciare un'idea là fuori e potrebbe essere molto irragionevole, ma puoi memorizzare tutti i campi da tutti i livelli nel tuo init e quindi quando un utente seleziona un livello, lo usa struttura dati per popolare i campi? come ho detto, non ho mai lavorato prima e sto solo cercando di inserire i miei 2 centesimi insignificanti
dassouki,

Grazie per il suggerimento Ho provato questo nel metodo getParameterInfo () sia con l'aggiunta di righe all'oggetto vt param stesso che con la creazione di una nuova tabella dei valori, l'aggiunta delle righe e l'impostazione di vt.value nella nuova tabella dei valori senza ancora fortuna. Non credo di poterlo utilizzare nell'istanza di ReorderFields perché i campi dipendono da una classe di caratteristiche di input. Forse posso creare un oggetto tabella valori nell'init e provare a impostare vt.value su self.valueTable dopo che le righe sono state popolate.
Crmackey,

Risposte:


7

Modificare updateParameters come segue:

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

Il tuo errore qui è provare a cambiare un parametro già avviato invece dei suoi valori a causa dell'utilizzo della proprietà errata. Vedere la proprietà 'valori' del parametro (arcpy).


Bellissimo! Non riesco a credere di essermi perso ... Sembra così ovvio. Grazie mille!
Crmackey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.