ตั้งค่าเริ่มต้นสำหรับตารางค่าในเครื่องมือกล่องเครื่องมือหลาม


10

ฉันสร้างเครื่องมือ Python Toolbox เพื่อจัดลำดับฟิลด์ใหม่และสร้างคลาสฟีเจอร์ใหม่ด้วยฟิลด์ที่เรียงลำดับใหม่ เครื่องมือทำงานได้เป็นอย่างดีและฉันสามารถใช้ตารางค่าเพื่อให้ผู้ใช้จัดเรียงเขตข้อมูลตามลำดับที่พวกเขาเลือกหรือพวกเขาสามารถกรอกค่าอันดับสำหรับแต่ละเขตข้อมูล อย่างไรก็ตามส่วนที่น่ารำคาญของเครื่องมือนี้คือต้องเพิ่มเขตข้อมูลทั้งหมดในตารางค่าทีละครั้งก่อนที่จะจัดลำดับใหม่

ฉันกำลังพยายามตั้งค่านี้เพื่อนำฟิลด์ทั้งหมดไปยังตารางค่าโดยค่าเริ่มต้นและสามารถลบฟิลด์ที่ไม่ต้องการใด ๆ ก่อนที่จะจัดลำดับใหม่ มีใครเคยประสบความสำเร็จทำอะไรแบบนี้มาก่อนหรือไม่ ฉันพยายามทำสิ่งนี้ให้สำเร็จในวิธี UpdateParameters นี่คือรหัสที่ฉันพยายาม:

import arcpy
import os

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "Reorder Fields"
        self.alias = "Reorder Fields"

        # List of tool classes associated with this toolbox
        self.tools = [ReorderFields]


class ReorderFields(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "Reorder Fields"
        self.description = ""
        self.canRunInBackground = False

    def getParameterInfo(self):
        """Define parameter definitions"""
        fc = arcpy.Parameter(displayName='Features',
            name='features',
            datatype='Feature Layer',
            parameterType='Required',
            direction='Input')

        vt = arcpy.Parameter(
            displayName='Fields',
            name='Fields',
            datatype='Value Table',
            parameterType='Required',
            direction='Input')

        output = arcpy.Parameter(
            displayName='Output Features',
            name='output_features',
            datatype='Feature Class',
            parameterType='Required',
            direction='Output')

        vt.columns = [['Field', 'Fields'], ['Long', 'Ranks']]
        vt.parameterDependencies = [fc.name]    
        params = [fc, vt, output]
        return params

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        return True

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        if parameters[0].value:
            if not parameters[1].altered:
                fields = [f for f in arcpy.Describe(str(parameters[0].value)).fields
                          if f.type not in ('OID', 'Geometry')]
                vtab = arcpy.ValueTable(2)
                for field in fields:
                    vtab.addRow("{0} {1}".format(field.name, ''))
                parameters[1].value = vtab
        return

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

    def execute(self, parameters, messages):
        """The source code of the tool."""
        fc = parameters[0].valueAsText
        vt = parameters[1].valueAsText
        output = parameters[2].valueAsText

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการนำฟิลด์ทั้งหมดตามที่แสดงในตารางค่าด้านบนเป็นค่าเริ่มต้น ฉันพยายามใช้parameters[1].valueเพื่อเพิ่มแถวในตารางค่าเฉพาะจาก GUI แต่นั่นทำให้ฉันมีข้อผิดพลาด ฉันใช้ ArcGIS 10.2.2


1
ฉันไม่ได้ทำอะไรแบบนั้นมาก่อนดังนั้นเพียงแค่โยนความคิดออกไปและมันอาจไม่มีเหตุผลมากนัก แต่คุณสามารถเก็บฟิลด์ทั้งหมดจากเลเยอร์ทั้งหมดในinitของคุณและจากนั้นเมื่อผู้ใช้เลือกเลเยอร์ โครงสร้างข้อมูลเพื่อเติมฟิลด์? อย่างที่ฉันบอกว่าฉันไม่เคยทำงานกับเรื่องนี้มาก่อนและแค่พยายามใส่ 2 เซนต์ที่ไม่มีนัยสำคัญของฉัน
dassouki

ขอบคุณสำหรับคำแนะนำ ฉันลองที่ใน getParameterInfo () วิธีการที่มีทั้งการเพิ่มแถวไปยังวัตถุ vt param ตัวเองและสร้างตารางค่าใหม่เพิ่มแถวและการตั้งค่า vt.value ไปยังตารางค่าใหม่ที่ยังไม่มีโชค ฉันไม่คิดว่าฉันสามารถใช้สิ่งนี้ในการสร้างอินสแตนซ์ของ ReorderFields เนื่องจากฟิลด์นั้นขึ้นอยู่กับคลาสคุณลักษณะการป้อนข้อมูล บางทีฉันสามารถสร้างวัตถุตารางค่าใน init และลองตั้งค่า vt.value เป็น self.valueTable เมื่อแถวได้รับการเติมข้อมูลแล้ว
crmackey

คำตอบ:


7

เปลี่ยน updateParameters ดังต่อไปนี้:

def updateParameters(self, parameters):
    """Modify the values and properties of parameters before internal
    validation is performed.  This method is called whenever a parameter
    has been changed."""
    if parameters[0].value:
        if not parameters[1].altered:
            fields = [f for f in arcpy.Describe(str(parameters[0].value)).fields
                      if f.type not in ('OID', 'Geometry')]
            vtab = []
            for field in fields:
                vtab.append([field.name,None])
            parameters[1].values = vtab
    return

ความผิดพลาดของคุณที่นี่คือการลองเปลี่ยนพารามิเตอร์ที่เริ่มต้นแล้วแทนที่จะเป็นค่าเนื่องจากการใช้คุณสมบัติที่ไม่ถูกต้อง โปรดดูคุณสมบัติ 'ค่า'ของพารามิเตอร์ (arcpy)


สวย! ฉันไม่อยากเชื่อเลยว่าฉันจะพลาด ... ดูเหมือนชัดเจนมาก ขอบคุณมาก!
crmackey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.