Python Toolbox 도구에서 값 테이블의 기본값 설정


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].valueGUI를 사용하여 행에 특정 값 테이블을 추가 하려고 시도했지만 오류가 발생했습니다. 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

여기서 실수는 잘못된 속성을 사용하여 값 대신 이미 시작된 매개 변수를 변경하는 것입니다. Parameter (arcpy)의 'values'속성 을 참조하십시오 .


아름다운! 나는 그것을 놓쳤다는 것을 믿을 수 없다. .. 그것은 매우 명백해 보인다. 대단히 감사합니다!
crmackey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.