Próbuję dostosować kombinację modelu i skryptu znalezioną na stronie blogu ESRI zatytułowanej „Generowanie listy wyboru wielu wartości”.
Doszedłem jednak do wniosku, że część sprawdzania poprawności zastosowana we wbudowanym skrypcie zależy od narzędzia „Częstotliwość” w celu poprawnego działania, ale jest ona dostępna tylko z licencją Advanced i lame. Wpis na blogu wyjaśnia przepływ pracy oraz miejsce pobrania modeli i skryptów (ale chętnie opublikuję je tutaj na żądanie). O ile mi wiadomo, rdzeń funkcjonalności, której szukam, generuje listę opcji wielowartościowych:
.. jest uzależniony od poprawnego działania skryptu sprawdzania poprawności. Bez sprawdzania poprawności nie mogę uzyskać wartości z pola, które pojawią się jako lista. Czy jest coś, co mogę usunąć ze skryptu sprawdzania poprawności, aby uzyskać funkcjonalność, której szukam, czy jest to obejście? Nie znam procesu walidacji. Oto kod do sprawdzania poprawności (miałem zamiar opublikować jako próbkę kodu, ale wygląda na to, że łatwiejsze do naśladowania):
[ Uwaga edytora: tutaj jest aktualny kod weryfikacyjny, obraz jest niepoprawny]
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
Czy to możliwe, że moje założenie (poprzez testowanie), że sprawdzanie poprawności jest kluczowym elementem, jest fałszywe i że coś innego nie pozwala na ujawnienie wartości jako listy do wyboru? Z góry bardzo dziękuję. Posiadanie tego rodzaju funkcjonalności naprawdę przyspieszy przyjęcie kilku kluczowych przepływów pracy, które próbuję rozpowszechnić w naszej firmie!
arcpy.da.SearchCursor
jest znacznie szybszy i bardziej odpowiedni do tego zadania niż starszearcpy.SearchCursor
.