Đặt giá trị mặc định cho bảng giá trị trong công cụ Hộp công cụ Python


10

Tôi đã tạo một công cụ Python Toolbox để sắp xếp lại các trường và tạo một lớp tính năng mới với các trường được sắp xếp lại. Công cụ này hoạt động độc đáo và tôi có thể sử dụng bảng giá trị để cho phép người dùng sắp xếp các trường theo thứ tự họ chọn hoặc họ có thể điền giá trị xếp hạng cho từng trường. Tuy nhiên, phần khó chịu của công cụ này là tất cả các trường cần được thêm vào bảng giá trị một lần trước khi sắp xếp lại.

Tôi đang cố gắng thiết lập điều này để đưa tất cả các trường vào bảng giá trị theo mặc định và mọi trường không mong muốn có thể được xóa trước khi sắp xếp lại chúng. Có ai đã thành công khi làm một cái gì đó như thế này trước đây? Tôi đang cố gắng để đạt được điều này trong phương pháp UpdateParameter. Đây là mã tôi đang thử:

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

nhập mô tả hình ảnh ở đây

Tôi muốn mang tất cả các trường như được hiển thị trong bảng giá trị ở trên theo mặc định. Tôi cũng đã thử sử dụng parameters[1].valueđể thêm các hàng vào bảng giá trị cụ thể từ GUI, nhưng điều đó đã gây ra lỗi cho tôi. Tôi đang sử dụng ArcGIS 10.2.2.


1
Tôi chưa từng làm điều gì như vậy trước đây, vì vậy chỉ cần đưa ra một ý tưởng ngoài đó và nó có thể rất vô lý, nhưng bạn có thể lưu trữ tất cả các trường từ tất cả các lớp trong init của bạn và sau đó khi người dùng chọn một lớp, nó sẽ sử dụng nó cấu trúc dữ liệu để điền vào các lĩnh vực? như tôi đã nói tôi chưa bao giờ làm việc với điều này trước đây và chỉ cố gắng đưa vào 2 xu không đáng kể của mình
dassouki

Cám ơn vì sự gợi ý. Tôi đã thử điều đó trong phương thức getParameterInfo () với cả việc thêm hàng vào chính đối tượng vt param và tạo bảng giá trị mới, thêm các hàng và đặt vt.value vào bảng giá trị mới mà vẫn không gặp may. Tôi không nghĩ rằng tôi có thể sử dụng điều này trong phần khởi tạo ReorderFields vì các trường phụ thuộc vào một lớp tính năng đầu vào. Có lẽ tôi có thể tạo một đối tượng bảng giá trị trong init và thử đặt vt.value thành self.valueTable sau khi các hàng đã được điền.
crmackey

Câu trả lời:


7

Thay đổi updateParameter như sau:

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

Lỗi của bạn ở đây là thử thay đổi một tham số đã bắt đầu thay vì các giá trị của nó do sử dụng sai thuộc tính. Vui lòng xem thuộc tính 'giá trị' của Thông số (arcpy).


Xinh đẹp! Tôi không thể tin rằng tôi đã bỏ lỡ điều đó ... Có vẻ như quá rõ ràng. Cảm ơn rât nhiều!
crmackey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.