Script Tool - Reference Bookmarks in Alphabetical Order

11-20-2017 06:35 AM
Occasional Contributor

I have a custom script tool that is supposed to set up a map layout, by adjusting the scale bar, north arrow, title, and legend. It is then supposed to reference a bookmark and export the layout as a PDF.

The problem is that when I use this tool in ModelBuilder it references the wrong bookmarks.

I'm using this script tool in ModelBuilder for ArcGIS Pro. This model iterates through Urgent Care centers and its corresponding data one at a time (in alphabetical order by center name). I have bookmarks for every Urgent Care center, so my thought is that, if I can find a way for the model to reference the bookmarks in alphabetical order, then they will correspond with the correct Urgent Care center.

Could this be achieved via a table or list Index, or some kind of loop? Or is there a better way to go about this whole process?

Here is the code from the script tool I am using.


import arcpy

input layer

lyr = arcpy.GetParameterAsText(0)

input name of layout

p ="CURRENT") 
lyt = p.listLayouts("Layout_King")[0]

Reposition the scale bar

scaleBar = lyt.listElements("MAPSURROUND_ELEMENT", "Scale Bar")[0] 
mf = scaleBar.mapFrame 
scaleBar.elementPositionX = mf.elementPositionX + 0.0 
scaleBar.elementPositionY = mf.elementPositionY - 0.5

Reposition the north arrow

northArrow = lyt.listElements("MAPSURROUND_ELEMENT", "North Arrow")[0] 
mf = northArrow.mapFrame 
northArrow.elementPositionX = mf.elementPositionX + 8.8 
northArrow.elementPositionY = mf.elementPositionY + 0.7

Align the title with the center of the map frame

title = lyt.listElements("TEXT_ELEMENT","Name of Map Text")[0] 
mf = lyt.listElements('MAPFRAME_ELEMENT',"Map Frame")[0] 
title.elementPositionX = mf.elementPositionX + (mf.elementWidth / 3.7) 
title.elementPositionY = mf.elementPositionY + (mf.elementHeight / 0.98)

Reposition the Legend and fix legend title

legend = lyt.listElements("LEGEND_ELEMENT", "Legend")[0] 
legend.title = "Legend" 
legend.elementPositionX = mf.elementPositionX + 7.7 
legend.elementPositionY = mf.elementPositionY + 7.15

setting layout to bookmark

aprx ="Current")

add name of layout

lyt = aprx.listLayouts("Layout_King")[0] mf = lyt.listElements("MAPFRAME_ELEMENT")[0]

add name of bookmark

bkmks ="*") 
for bkmk in bkmks:   
   lyt.exportToPDF(r"C:\arcGIS_Shared\Exports" + "\\" + + ".pdf")
0 Kudos
2 Replies
MVP Legendary Contributor

Code Formatting the Basics++ would be useful to get the code into shape.  

And what does your modelbuilder model do? perhaps it would be way easier to go whole code rather than a combo

0 Kudos
Occasional Contributor

I work for an urgent care company and this model creates a table for an urgent care center we have, along with the patient data for that center. The model then geocodes the addresses for the patients and then performs a summarize within using census blocks and the patient geocoded locations. The next step in the model (which I need help with) is a script tool that will create a layout for the center by referencing a bookmark and export it as a PDF. 

Hopefully that clarifies what I'm trying to do.

I've read all the web pages on creating script tools, but it is still confusing to know when to use the GetParameterAsText and to know what data type to use when setting the tool parameters

0 Kudos