AnsweredAssumed Answered

Data Driven Page Export ArcPRO to Image

Question asked by ElPone on Jul 10, 2018
Latest reply on Jul 11, 2018 by ElPone

The key issue to me seems to be:

arcpy.AddMessage(theRow.getValue(theNameField))

Is not working in arcpro in respect to a row object from a layout mapseries, this worked  just fine in ArcGIS (10.3)

 

Details

I am trying to automate the export of a data driven page into .png in arcpro.  The issue I am running into working out how to automate the naming of the output .png's.

The naming pattern I want to use is

theOutput = outDir + '\\' + theBase + '_'+str(theNameValue) + ".png"

Where

outDir is an output directory which is passed into the job as a parameter.

theBase is the base file name of the arcpro project and is defined thus

theBase = os.path.splitext(os.path.basename(aprx.filePath))[0]

 

The issue is arising in setting theNameValue. 

I want to use the value of mapsSeries.pageNameField for the current page the script is iterating through. 

 

A sample script is attached and requires the following parameters.

outDir = arcpy.GetParameterAsText(0) # Create or use an output directory variable
outRes = arcpy.GetParameterAsText(1) # Resolution of PNG in dpi.
theLayout = arcpy.GetParameterAsText(2) #The layout we want to push out DDPs on.

 

Now on my test data I happen to have set the map series name field to be a field named: Name (the use case is bridges, but that's not really relevant...) but it is successfully used in line 23

arcpy.AddMessage(theRow.Name)

 

Now according to the help on map series line 20 on the snippet below, theRow should be returning a row object.   

Checking what theRow is via line24 returns:  [0, 'Aughnacrew Bridge Culvert', 'BR01', ' ']

 

on the test data I was using this is expected.  According to the help on row objects this should have a method

getValue (field_name)

that Gets the field value....

 

However when I try to use it like in line 26:

arcpy.AddMessage(theRow.getValue(theNameField))

It will cause the code to fail like the image below and as far as I can tell this should work.

 

Can anyone help me understand why this is not working?  

 

I have managed to get this script to  sort of work by calling

theRow.__getattribute__(theNameField)

But this does not strike me as good form.

I am using ArcPRO 2.2.0

 

for lyt in aprx.listLayouts(theLayout):
    if lyt.name == theLayout:
        #we check we are hitting on our desired
        if  lyt.mapSeries is not None:
            ms = lyt.mapSeries
            idxLyer = ms.indexLayer
            idxLyerName = ms.indexLayer.name
            if ms.enabled:
                arcpy.AddMessage("\n\tMap Doc is data driven page.\n\tAll good to proceed")
               
                #get the name field.
                theNameField = ms.pageNameField.name
                test = ms.pageNameField
               
                #get the number of pages to use for push out
                for pageNum in range(1,ms.pageCount + 1):
                    #make the page the current page number..
                    ms.currentPageNumber = pageNum
                    arcpy.AddMessage(pageNum)
                    theRow = ms.pageRow
                    fields = arcpy.ListFields(idxLyerName)
                    arcpy.AddMessage(theNameField)
                    arcpy.AddMessage(theRow.Name)
                    arcpy.AddMessage(theRow)    #seeing what row contains
                    arcpy.AddMessage(theRow[1]) #access row by index
                    #arcpy.AddMessage(theRow.getValue(theNameField))    #This causing fail
                    arcpy.AddMessage(dir(theRow))   #find out what methods and attributes theRow has.
                    arcpy.AddMessage(theRow.__getattribute__(theNameField)) #This works?
                    arcpy.AddMessage("where is this going wrong?")
                  
                   
                    theOutput = outDir + '\\' + theBase + '_'+str(theRow.__getattribute__(theNameField)) + ".png"
                    arcpy.AddMessage(theOutput)

geoprocessing fail due to line:arcpy.AddMessage(theRow.getValue(theNameField))

Outcomes