Sto cercando di adattare una combinazione di modello e script trovata sul sito del blog ESRI intitolata "Generare un elenco di scelte multivalore".
Tuttavia, ho concluso che parte della convalida utilizzata nello script incorporato si basa sullo strumento "Frequenza" per funzionare correttamente, ma questo è disponibile solo con e Licenza avanzata (lame). Il post sul blog spiega il flusso di lavoro e dove scaricare i modelli e gli script (ma li posterò felicemente qui su richiesta). Per quanto posso dire, il nucleo della funzionalità che sto cercando, generando un elenco di scelte multivalore:
..è basato sullo script di validazione che funziona correttamente. Senza la convalida, non sono in grado di visualizzare i valori dal campo come elenco. C'è qualcosa che posso rimuovere da questo script di convalida per ottenere la funzionalità che sto cercando o c'è una soluzione? Non ho familiarità con il processo di convalida. Ecco il codice per la convalida (stavo per pubblicare un esempio di codice, ma sembra che potrebbe essere più facile da seguire):
[ Nota dell'editore: ecco il codice di validazione attuale, l'immagine non è corretta]
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
È possibile che la mia ipotesi (tramite test) che la convalida sia l'elemento chiave sia falsa e che qualcos'altro non consenta che i valori vengano esposti come elenco selezionabile? Molte grazie in anticipo. Avere questo tipo di funzionalità farà davvero iniziare l'adozione di diversi flussi di lavoro chiave che sto cercando di distribuire nella nostra azienda!
arcpy.da.SearchCursor
è molto più veloce e più adatto a questo compito rispetto al vecchioarcpy.SearchCursor
.