Estou tentando adaptar uma combinação de modelo e script encontrada no blog da ESRI, intitulada 'Gerando uma lista de opções de vários valores'.
No entanto, concluí que parte da validação usada no script incorporado depende da ferramenta 'Frequency' para funcionar corretamente, mas isso só está disponível com uma licença avançada (lame). A postagem do blog explica o fluxo de trabalho e onde fazer o download dos modelos e scripts (mas felizmente os publicarei aqui, mediante solicitação). Até onde eu sei, o núcleo da funcionalidade que procuro, gerando uma lista de opções com vários valores:
..é baseado no script de validação funcionando corretamente. Sem a validação, não consigo fazer com que os valores do campo apareçam como uma lista. Existe alguma coisa que eu possa remover desse script de validação para obter a funcionalidade que estou procurando ou existe uma solução alternativa? Não estou familiarizado com o processo de validação. Aqui está o código para a validação (eu ia postar como um exemplo de código, mas parece que pode ser mais fácil seguir):
[ Nota do editor: aqui está o código de validação real, a imagem não está correta]
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
É possível que minha suposição (via teste) de que a validação é a peça principal seja falsa e que algo mais não esteja permitindo que os valores sejam expostos como uma lista selecionável? Muito obrigado antecipadamente. Ter esse tipo de funcionalidade realmente dará um salto na adoção de vários fluxos de trabalho importantes que estou tentando distribuir em nossa empresa!
fonte
arcpy.da.SearchCursor
é muito mais rápido e mais adequado para esta tarefa do que o anteriorarcpy.SearchCursor
.Respostas:
Eu pensei que algumas pessoas poderiam achar isso valioso. A ESRI teve a gentileza de ajudar a resolver isso e encontrar uma alternativa à validação usada na postagem do blog que não requer uma licença Avançada. Embora eu certamente tivesse que descobrir alguns itens adicionais, não posso receber crédito pelo código de validação. Mas, os fins justificam os meios e isso se qualifica como a resposta para minha pergunta. Aqui está:
O uso do arcpy.da.SearchCursor retorna valores do campo escolhido muito rapidamente, considerando o número de registros que sua pesquisa (pelo menos nos meus dados). Posso iniciar um novo thread para ver se alguém tem alguma idéia de como aplicar um filtro à validação com base em uma consulta. Espero que isso ajude alguém, mas estou feliz por termos uma resposta!
fonte
Fiz isso de outra maneira: usando o banco de dados consiste em níveis variáveis, sem escolher o shapefile ou os campos apenas selecionando itens do primeiro nível, o script de validação gera os valores para o segundo nível de acordo com a sua escolha no primeiro nível, o script:
fonte
fonte
{ }
botão para formatar corretamente seu código.