ESRI'nin 'Çok değerli bir seçim listesi oluşturma' başlıklı blog sitesinde bulunan bir model ve komut dosyası kombinasyonunu uyarlamaya çalışıyorum .
Ancak, gömülü komut dosyasında kullanılan doğrulamanın bir kısmının düzgün çalışması için 'Frekans' Aracı'na bağlı olduğu sonucuna vardım, ancak bu yalnızca ve Gelişmiş lisans (topal) ile kullanılabilir. Blog gönderisi, iş akışını ve modelleri ve komut dosyalarını nereden indireceğinizi açıklar (ancak istek üzerine bunları memnuniyetle buraya gönderirim). Anlayabildiğim kadarıyla, peşinde olduğum işlevselliğin özü, çok değerli bir seçim listesi oluşturarak:
.. Doğrulama betiğinin düzgün çalışmasına dayanıyor. Doğrulama olmadan, alandaki değerleri bir liste olarak görünecek şekilde alamıyorum. Sonradan işlevselliği elde etmek için bu doğrulama komut dosyasından kaldırabileceğim bir şey var mı, yoksa bir geçici çözüm var mı? Doğrulama sürecine aşina değilim. İşte doğrulama için kod (Ben bir kod örneği olarak göndermek için gidiyordu, ama bu takip etmek daha kolay olabilir gibi görünüyor):
[ Editör notu: İşte gerçek doğrulama kodu, görüntü doğru değil]
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
Doğrulamanın anahtar parça olduğu (test yoluyla) varsayımımın ve değerlerin seçilebilir bir liste olarak gösterilmesine izin vermediği başka bir şey olabilir mi? Şimdiden çok teşekkürler. Bu tür bir işleve sahip olmak gerçekten atlayacaktır Şirketimizde dağıtmaya çalıştığım birkaç anahtar iş akışını benimsemeye başlayın!
arcpy.da.SearchCursor
bu görev için eskisinden çok daha hızlı ve daha uygunarcpy.SearchCursor
.