การใช้คุณสมบัติที่เปลี่ยนแปลงใน ArcGIS Toolbox Validator Class

Aug 20 2020

ฉันพยายามเขียนสคริปต์พฤติกรรมบางอย่างลงในคลาสตัวตรวจสอบความถูกต้องของกล่องเครื่องมือ ArcGIS โดยเฉพาะอย่างยิ่งฉันกำลังสร้างพารามิเตอร์แบบเลื่อนลงเพื่อให้ผู้ใช้สามารถเลือกตัวเลือกที่กำหนดไว้ล่วงหน้าจากนั้นพารามิเตอร์ที่สองจะอัปเดตรายการของรายการ ปัญหาที่ฉันพบคือเมื่อฉันเปลี่ยนตัวเลือกในพารามิเตอร์แรกฉันจะได้รับตัวเลือกเพื่อเปลี่ยนในพารามิเตอร์ที่สอง แต่เมื่อฉันสลับปุ่ม 'ยกเลิกการเลือกทั้งหมด' ในพารามิเตอร์ที่สองรายการจะไม่ยกเลิกการเลือก ( พวกเขายังคงตรวจสอบ) ฉันรู้สึกว่ามันเกี่ยวข้องกับสคริปต์ของฉันใน Validator

นี่คือรายละเอียด (ดูภาพด้านล่างเช่นกัน):

  1. พารามิเตอร์แรกคือประเภทสตริง จำเป็นต้องป้อนทิศทางมีค่าเริ่มต้น Multivalue = ไม่ใช่และใช้รายการค่าเพื่อให้ฉันมีรายการแบบเลื่อนลงโดยมี 3 ตัวเลือกให้เลือก
  2. พารามิเตอร์ที่สองคือประเภทสตริง มันเป็นสิ่งจำเป็น ประกอบด้วยค่าเริ่มต้น Multivalue = ใช่และใช้รายการค่าเพื่อให้รายการที่เติมในพารามิเตอร์นี้ (รายการของรายการ) สามารถเปิดหรือปิดได้

ดังนั้นใน Validator สคริปต์ของฉันจะเป็นดังนี้ ใครเห็นสิ่งที่ชัดเจนว่าฉันอาจพลาดที่นี่เพื่อให้ปุ่ม "เลือกทั้งหมด" และ "ยกเลิกการเลือกทั้งหมด" ทำงานได้

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."""

    self.params[1].filter.list = [1,2,3,4]
    self.params[1].values = self.params[1].filter.list    
    return

  def updateParameters(self):
    """Modify the values and properties of parameters before internal
    validation is performed.  This method is called whenever a parameter
    has been changed."""
    if self.params[0].altered == True:
      if self.params[0].value == 'Option 1':     
        self.params[1].filter.list = [1,2,3,4]
        self.params[1].values = self.params[1].filter.list

      elif self.params[0].value == 'Option 2':  
        self.params[1].filter.list = ['a', 'b', 'c']
        self.params[1].values = self.params[1].filter.list

      elif self.params[0].value == 'Option 3':  
        self.params[1].filter.list = ['dr', 'bht', 'cjjjyy']
        self.params[1].values = self.params[1].filter.list
    
    return

  def updateMessages(self):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return

คำตอบ

1 user2856 Aug 21 2020 at 04:30

"arcpy way ™" คือการตรวจสอบ if parameters[0].altered and not parameters[0].hasBeenValidated:

ตาม [เอกสาร] [1]:

เปลี่ยนแปลง

alteredจะเป็นจริงถ้าค่าของพารามิเตอร์มีการเปลี่ยนแปลง ... เมื่อมีการเปลี่ยนแปลงพารามิเตอร์พารามิเตอร์จะยังคงถูกเปลี่ยนแปลงจนกว่าผู้ใช้จะล้าง (เว้นว่าง) ค่าซึ่งในกรณีนี้ค่าจะกลับสู่การไม่เปลี่ยนแปลง

hasBeenValidated

hasBeenValidatedเป็นเท็จหากค่าของพารามิเตอร์ถูกแก้ไขโดยผู้ใช้ตั้งแต่ครั้งสุดท้ายupdateParametersและมีการเรียกใช้การตรวจสอบความถูกต้องภายใน เมื่อเรียกการตรวจสอบความถูกต้องภายในแล้วการประมวลผลทางภูมิศาสตร์จะตั้งค่าhasBeenValidatedเป็นจริงสำหรับทุกพารามิเตอร์โดยอัตโนมัติ

hasBeenValidated ใช้เพื่อตรวจสอบว่าผู้ใช้เปลี่ยนค่าตั้งแต่การโทรครั้งล่าสุดถึง updateParametersหรือไม่

ดังนั้นเปลี่ยนของคุณupdateParametersเป็น:

  def updateParameters(self):
      """Modify the values and properties of parameters before internal
      validation is performed.  This method is called whenever a parameter
      has been changed."""

      if self.params[0].altered and not self.params[0].hasBeenValidated:
          etc...