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
3
  • Have you tried something like self.original and comparing like that? I may not be understanding what you're trying to accomplish.
    – Paul
    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
    – BBG_GIS
    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.
    – Paul
    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

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.