Estoy tratando de adaptar una combinación de modelo y script que se encuentra en el sitio del blog de ESRI titulado 'Generando una lista de opciones de valores múltiples'.
Sin embargo, he concluido que parte de la validación utilizada en el script incrustado depende de la herramienta 'Frecuencia' para funcionar correctamente, pero esto solo está disponible con una licencia avanzada (lame). La publicación del blog explica el flujo de trabajo y dónde descargar los modelos y los scripts (pero los publicaré aquí a pedido). Por lo que puedo decir, el núcleo de la funcionalidad que busco es generar una lista de opciones de valores múltiples:
... se basa en que el script de validación funcione correctamente. Sin la validación, no puedo obtener los valores del campo para que aparezcan como una lista. ¿Hay algo que pueda eliminar de este script de validación para obtener la funcionalidad que busco, o hay una solución? No estoy familiarizado con el proceso de validación. Aquí está el código para la validación (iba a publicar como una Muestra de Código, pero parece que podría ser más fácil de seguir):
[ Nota del editor: aquí está el código de validación real, la imagen no es correcta]
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
¿Es posible que mi suposición (a través de las pruebas) de que la validación es la pieza clave sea falsa y que algo más no permita que los valores se expongan como una lista seleccionable? Muchas gracias de antemano. Tener este tipo de funcionalidad realmente impulsará la adopción de varios flujos de trabajo clave que estoy tratando de distribuir en nuestra empresa.
arcpy.da.SearchCursor
es mucho más rápido y más adecuado para esta tarea que el anteriorarcpy.SearchCursor
.