필자는 필드를 재정렬하고 재정렬 된 필드로 새 기능 클래스를 작성하기 위해 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