4

I developed a simple python toolbox that lists values of a table in the value table parameter. The user can rank each row using the Rank field drop down values.Everything is ok untill user selected value. Now i want to update the table based on the rank values.My solution is search rank values in the value table (params3) and update params4 from these values.The main problem in search cursor is access to the Rank field ( search cursor is in execute function of my code). I think if i can search these values then i can use updatecursor to update the values in the table. enter image description here

import arcpy
class Toolbox(object):
 def __init__(self):
 """Define the toolbox (the name of the toolbox is the name of the
 .pyt file)."""
 self.label = "Toolbox"
 self.alias = ""
 # List of tool classes associated with this toolbox
 self.tools = [Tool]
class Tool(object):
 def __init__(self):
 """Define the tool (tool name is the name of the class)."""
 self.label = ""
 self.description = ""
 self.canRunInBackground = False
 def getParameterInfo(self):
 """Define parameter definitions"""
 # line station parameter
 params0 = arcpy.Parameter(
 displayName="Line Station",
 name="line_station",
 datatype="GPFeatureLayer",
 parameterType="Required",
 direction="Input")
 params0.filter.list = ["Polyline"]
 # station parameter
 params1 = arcpy.Parameter(
 displayName="Station",
 name="point_station",
 datatype="GPFeatureLayer",
 parameterType="Required",
 direction="Input")
 params1.filter.list = ["POINT"]
 # Table
 params2 = arcpy.Parameter(
 displayName="Table",
 name="table",
 datatype="GPTableView",
 parameterType="Required",
 direction="Input")
 # value table
 params3 = arcpy.Parameter(
 displayName='Values',
 name='values',
 datatype='GPValueTable',
 parameterType='Required',
 direction='Input')
 # Table output
 params4 = arcpy.Parameter(
 displayName="Tableoutput",
 name="tableoutput",
 datatype="GPTableView",
 parameterType="Derived",
 direction="Output")
 params4.parameterDependencies = [params2.name]
 params3.columns = [['Long', 'Station Code'],['GPString','Station Name'],['GPString','Rank']]
 params3.filters[2].type="ValueList"
 params = [params0,params1,params2,params3,params4]
 return params
 def isLicensed(self):
 """Set whether tool is licensed to execute."""
 return True
 def updateParameters(self, parameters):
 if parameters[2].altered:
 if not parameters[3].altered:
 result = arcpy.GetCount_management(parameters[2].value)
 count = int(result.getOutput(0))
 with arcpy.da.SearchCursor(parameters[2].value,["Station","Line","Row"]) as cur:
 vtab = []
 for row in cur:
 vtab.append([row[0],row[1],row[2]])
 parameters[3].value = vtab
 parameters[3].filters[2].list = range(1,count+1)
 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."""
 if parameters[3].altered:
 with arcpy.da.SearchCursor(parameters[3].valueAsText,parameters[3].columns[2][1]) as curs:
 vtab = []
 for rows in curs:
 vtab.append(rows[0])
 # The code rised an error and can not find the Rank field.
 return
asked Nov 10, 2016 at 18:54
3
  • Have you tried something like self.original and comparing like that? I may not be understanding what you're trying to accomplish. Commented Nov 11, 2016 at 0:29
  • @Paul . No i have not try self.original and i don't know how to use it. please give an example.Thank you Commented Nov 11, 2016 at 1:15
  • If you're trying to remember values between the user changing them (and therefore triggering validation) make original a property of your class and see if you can read from it. Commented Nov 11, 2016 at 2:42

1 Answer 1

2

I finally solved my problem.I listed fields without using arcpy functions(fields variable).Then list values of the user ranks (Ranklist). using updatecursor and these lists i updated the values in value list

def execute(self, parameters, messages):
 """The source code of the tool."""
 if parameters[3].altered:
 fields = [f for f in parameters[3].value]
 codelist = [f[0] for f in parameters[3].value]
 rankslist = zip(*fields)[-1]
 with arcpy.da.UpdateCursor(parameters[4].valueAsText,["code","Rank"]) as cur:
 for row in cur:
 if row[0] in codelist:
 row[1] = rankslist[i]
 cur.updateRow(row)
 i+=1
 return
answered Nov 14, 2016 at 10:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.