Définir les valeurs par défaut pour la table de valeurs dans l'outil Python Toolbox

10

J'ai créé un outil Python Toolbox pour réorganiser les champs et créer une nouvelle classe d'entités avec les champs réorganisés. L'outil fonctionne bien et je suis en mesure d'utiliser une table de valeurs pour permettre à l'utilisateur d'organiser les champs dans l'ordre de leur choix ou de remplir une valeur de classement pour chaque champ. Cependant, la partie ennuyeuse de cet outil est que tous les champs doivent être ajoutés à la table de valeurs un à la fois avant de les réorganiser.

J'essaie de configurer cela pour apporter tous les champs à la table de valeurs par défaut et tous les champs indésirables peuvent être supprimés avant de les réorganiser. Quelqu'un a-t-il réussi à faire quelque chose comme ça avant? J'essaie d'y parvenir dans la méthode UpdateParameters. Voici le code que j'essaie:

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

entrez la description de l'image ici

Je veux apporter tous les champs comme indiqué dans le tableau de valeurs ci-dessus par défaut. J'ai également essayé d'utiliser le parameters[1].valuepour ajouter des lignes à la table de valeurs spécifiques de l'interface graphique, mais cela m'a donné des erreurs. J'utilise ArcGIS 10.2.2.

crmackey
la source
1
Je n'ai jamais rien fait de tel auparavant, alors lancez simplement une idée et cela pourrait être très déraisonnable, mais pouvez-vous stocker tous les champs de toutes les couches de votre init , puis lorsqu'un utilisateur sélectionne une couche, il l'utilise structure de données pour remplir les champs? comme je l'ai dit, je n'avais jamais travaillé avec ça avant et j'essayais juste de mettre mes 2 centimes insignifiants
dassouki
Merci pour la suggestion. J'ai essayé cela dans la méthode getParameterInfo () avec à la fois l'ajout de lignes à l'objet param vt lui-même et la création d'une nouvelle table de valeurs, l'ajout des lignes et la définition de la valeur vt.value dans la nouvelle table de valeurs avec toujours pas de chance. Je ne pense pas pouvoir l'utiliser dans l'instanciation de ReorderFields car les champs dépendent d'une classe d'entités en entrée. Je peux peut-être créer un objet de table de valeurs dans l'init et essayer de définir la valeur vt.value sur self.valueTable une fois que les lignes ont été remplies.
crmackey du

Réponses:

7

Modifiez les paramètres updateParameters comme suit:

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

Votre erreur ici est d'essayer de modifier un paramètre déjà lancé au lieu de ses valeurs en raison d'une mauvaise propriété. Veuillez voir la propriété 'values' du paramètre (arcpy).

fatih_dur
la source
Magnifique! Je ne peux pas croire que j'ai raté ça ... Cela semble si évident. Merci beaucoup!
crmackey