Tôi đang cố gắng điều chỉnh kết hợp mô hình và tập lệnh được tìm thấy trên trang blog của ESRI có tiêu đề 'Tạo danh sách lựa chọn đa giá trị'.
Tuy nhiên, tôi đã kết luận rằng một phần xác thực được sử dụng trong tập lệnh nhúng phụ thuộc vào Công cụ 'Tần số' để hoạt động chính xác, nhưng điều này chỉ khả dụng với Giấy phép nâng cao (khập khiễng). Bài đăng trên blog giải thích quy trình làm việc và nơi để tải xuống các mô hình và tập lệnh (nhưng tôi sẽ vui vẻ đăng chúng lên đây theo yêu cầu). Theo như tôi có thể nói, cốt lõi của chức năng mà tôi đang theo đuổi, tạo ra một danh sách lựa chọn đa giá trị:
.. được xác nhận dựa trên kịch bản xác nhận hoạt động đúng. Nếu không có xác thực, tôi không thể lấy các giá trị từ trường để xuất hiện dưới dạng danh sách. Có bất cứ điều gì tôi có thể loại bỏ khỏi tập lệnh xác thực này để có được chức năng mà tôi đang theo dõi, hoặc có một cách giải quyết không? Tôi không quen với quy trình xác nhận. Đây là mã để xác thực (Tôi sẽ đăng dưới dạng Mẫu mã, nhưng điều này có vẻ như có thể dễ theo dõi hơn):
[ Ghi chú của biên tập viên: đây là mã xác thực thực tế, hình ảnh không chính xác]
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
Có thể giả định của tôi (thông qua thử nghiệm) rằng xác thực là phần chính là sai và điều gì đó khác không cho phép các giá trị được hiển thị dưới dạng danh sách có thể chọn? Rất cám ơn trước. Có loại chức năng này sẽ thực sự bắt đầu áp dụng một số quy trình công việc chính mà tôi đang cố gắng phân phối trong công ty của chúng tôi!
arcpy.da.SearchCursor
nhanh hơn và phù hợp hơn cho nhiệm vụ này so với cũarcpy.SearchCursor
.