Ich versuche, eine Modell- und Skriptkombination anzupassen, die auf der ESRI-Blog-Site mit dem Titel "Generieren einer mehrwertigen Auswahlliste" zu finden ist.
Ich bin jedoch zu dem Schluss gekommen, dass ein Teil der im eingebetteten Skript verwendeten Validierung vom 'Frequenz'-Tool abhängt, um ordnungsgemäß zu funktionieren. Dies ist jedoch nur mit einer erweiterten Lizenz (lahm) verfügbar. Der Blog-Beitrag erklärt den Workflow und wo die Modelle und Skripte heruntergeladen werden können (aber ich werde sie auf Anfrage gerne hier veröffentlichen). Soweit ich das beurteilen kann, ist der Kern der Funktionalität, nach der ich suche, die Erstellung einer mehrwertigen Auswahlliste:
..ist vorausgesetzt, dass das Validierungsskript ordnungsgemäß funktioniert. Ohne die Validierung kann ich die Werte aus dem Feld nicht als Liste anzeigen lassen. Gibt es etwas, das ich aus diesem Validierungsskript entfernen kann, um die gewünschte Funktionalität zu erhalten, oder gibt es eine Problemumgehung? Ich bin mit dem Validierungsprozess nicht vertraut. Hier ist der Code für die Validierung (ich wollte ihn als Codebeispiel veröffentlichen, aber es sieht so aus, als ob es einfacher wäre, ihm zu folgen):
[ Anmerkung des Herausgebers: Hier ist der tatsächliche Validierungscode, das Bild ist nicht korrekt.]
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
Ist es möglich, dass meine Annahme (durch Testen), dass die Validierung das Schlüsselelement ist, falsch ist und dass etwas anderes nicht zulässt, dass die Werte als auswählbare Liste angezeigt werden? Vielen Dank im Voraus. Diese Art von Funktionalität wird die Einführung mehrerer wichtiger Workflows, die ich in unserem Unternehmen zu verteilen versuche, wirklich beschleunigen!
arcpy.da.SearchCursor
viel schneller und besser für diese Aufgabe geeignet ist als das älterearcpy.SearchCursor
.