我正在尝试改编ESRI博客网站上的模型和脚本组合,标题为 “生成多值选择列表”。
但是,我得出的结论是,嵌入式脚本中使用的部分验证依赖于“频率”工具才能正常运行,但这仅适用于Advanced许可(lam)。博客文章解释了工作流程以及在何处下载模型和脚本(但我会根据要求将它们愉快地发布在此处)。据我所知,我所追求的功能的核心是生成一个多值选择列表:
..取决于验证脚本是否正常运行。没有验证,我无法从字段中获取值以列表形式显示。有什么我可以从验证脚本中删除的东西来获得我想要的功能,还是有解决方法?我不熟悉验证过程。这是验证的代码(我打算作为代码示例发布,但是看起来可能更容易理解):
[ 编者注:这是实际的验证码,图片不正确]
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
我的假设(通过测试)是否可能是验证是关键,是否有其他假设不允许将值显示为可选列表呢?提前谢谢了。拥有这种类型的功能,将真正促使我尝试在公司中分发的几个关键工作流程的采用!
链接的工具箱的验证码与链接的图像中的验证码不同。前者需要使用高级许可证,因为它使用了频率工具。后者不应在较早的博客文章中详细介绍,因为它仅使用标准的arcpy函数(如SearchCursor),因此不应该。对于您,我没有答案,但是如果您将两者结合在一起,也许您可以解决。
—
blah238 2014年
@ blah268其10.2,很抱歉错过了。嗯,这是一个非常有趣的观察。我会看的,但我很好奇:我是否正确理解验证是将值作为选择列表传递的原因?多项选择是我追求的功能。我会尽快回复您,非常感谢您的回复!
—
Clickinaway 2014年
脚本工具参数属性是您在其中设置参数及其属性(包括MultiValue属性)的列表的地方。脚本工具验证是在此特定工具根据其他参数值(功能类和字段名称)填充多值参数值的地方。对于较大的要素类使用它,我不会将其投入生产。太慢了,如果没有在“地理处理”选项中选中“覆盖地理处理操作的输出”,也会出错。
—
blah238
我无法聊天,但我建议编辑您的问题以详细说明您的要求,您尝试过的内容以及不起作用的内容。
—
blah238 2014年
arcpy.da.SearchCursor
比旧版本更快,更适合此任务arcpy.SearchCursor
。