J'essaie d'adapter une combinaison de modèle et de script trouvée sur le site de blog d'ESRI intitulé «Génération d'une liste de choix à plusieurs valeurs».
Cependant, j'ai conclu qu'une partie de la validation utilisée dans le script intégré dépend de l'outil 'Frequency' pour fonctionner correctement, mais cela n'est disponible qu'avec une licence avancée (boiteuse). Le billet de blog explique le flux de travail et où télécharger les modèles et les scripts (mais je les publierai volontiers ici sur demande). Pour autant que je sache, le cœur de la fonctionnalité que je recherche, la génération d'une liste de choix à plusieurs valeurs:
..est basé sur le bon fonctionnement du script de validation. Sans la validation, je ne parviens pas à faire apparaître les valeurs du champ sous forme de liste. Y a-t-il quelque chose que je peux supprimer de ce script de validation pour obtenir les fonctionnalités que je recherche, ou existe-t-il une solution? Je ne connais pas le processus de validation. Voici le code pour la validation (j'allais poster en tant qu'échantillon de code, mais cela semble être plus facile à suivre):
[ Note de l'éditeur: voici le code de validation actuel, l'image n'est pas correcte]
import arcpy
class ToolValidator(object):
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
"""Refine the properties of a tool's parameters. This method is
called when the tool is opened."""
return
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parmater
has been changed."""
if self.params[1].altered: #Set condition - if the input field value changes
if self.params[1].value: #if the field parameter has a value
for field in arcpy.Describe(self.params[0].value).fields: #iterate through fields in the input dataset
if field.name.lower() == self.params[1].value.value.lower(): #find the field object with the same name as field parameter
try:
if self.params[2].values: #if this parameter has seleted values
oldValues = self.params[2].values #set old values to the selected values
except Exception:
pass
values = set() #create an empty set
fieldname = self.params[1].value.value #set the value of variable fieldname equal to the input field value
FrequencyTable = arcpy.Frequency_analysis (self.params[0].value, "in_memory\Frequency", self.params[1].value.value, "") #for large tables create a frequency table
cursor = arcpy.SearchCursor(FrequencyTable, "", "", self.params[1].value.value, "{0} A".format(self.params[1].value.value)) #open a search cursor on the frequency table
for row in cursor: #loop through each value
values.add(row.getValue(fieldname)) #add the value to the set
self.params[2].filter.list = sorted(values) #set the filter list equal to the sorted values
newValues = self.params[2].filter.list
try:
if len(oldValues): # if some values are selected
self.params[2].values = [v for v in oldValues if v in newValues] # check if seleted values in new list,
# if yes, retain the seletion.
except Exception:
pass
def updateMessages(self):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
Est-il possible que mon hypothèse (via les tests) que la validation soit l'élément clé soit fausse et que quelque chose d'autre ne permette pas que les valeurs soient exposées en tant que liste sélectionnable? Merci d'avance. Avoir ce type de fonctionnalité va vraiment lancer l'adoption de plusieurs workflows clés que j'essaie de distribuer dans notre entreprise!
la source
arcpy.da.SearchCursor
est beaucoup plus rapide et plus adapté à cette tâche que l'ancienarcpy.SearchCursor
.Réponses:
J'ai pensé que certaines personnes pourraient trouver cela précieux. ESRI a eu la gentillesse d'aider à résoudre ce problème et de trouver une alternative à la validation utilisée dans le billet de blog qui ne nécessite pas de licence avancée. Bien que je devais certainement trouver des éléments supplémentaires, je ne peux pas prendre le crédit pour le code de validation. Mais, les fins justifient les moyens et cela constitue la réponse à ma question. Voici:
L'utilisation de l'arcpy.da.SearchCursor renvoie très rapidement les valeurs du champ choisi compte tenu du nombre d'enregistrements à rechercher (au moins dans mes données). Je peux commencer un nouveau fil pour voir si quelqu'un a des idées sur la façon d'appliquer un filtre à la validation basée sur une requête. J'espère que cela aide quelqu'un, mais je suis content que nous ayons une réponse!
la source
Je l'ai fait d'une autre manière: l'utilisation de la base de données se compose de niveaux fixes, sans choisir le fichier de formes ou les champs simplement en sélectionnant des éléments du premier niveau, le script de validation génère les valeurs du deuxième niveau selon votre choix au premier niveau, elle le script:
la source
la source
{ }
bouton pour formater correctement votre code.