I have an old script tool that I'm migrating to ArcGIS Pro. The tool only has two parameters (Subbasin: string, Directory: folder) and it is supposed export a PDF mapbook of the features for the subbasin number entered.
I wrote the code and tested it in the Python console window in Pro. It works fine. I have exported >20 mapbooks.
I configured it as a script tool and two things happen:
The logic is as follows:
I added the mapbook derived output the last time i tried to get it to work.
That does seem mysterious. Just a wild guess: one issue has bit me in the past with geoprocessing is that if you provide a string "foobar", if you have a layer named "foobar" in the session and a dataset named "foobar" in the current workspace, you sometimes get one or the other (I think this layer gets precedence, but I'm not sure, and it may depend on context). My fix for this is has been to make sure when I reference an input if I want the dataset (not the layer), I convert it to a full path.
I gave the layers completely unique names as a quick test and the result is the same.
I think I may just rebuild it as an ArcGIS Pro add-in.
Whatever subbasin is entered, the resulting section set for mapsheets is always the selection set that was desired on the previous run of the tool
What happens on the first run, since there is no previous run?
I tested everything in the Python console before I moved it to the script tool. So the first time it ran as a script tool the mapsheets/grid selection was same as the previous run in the console—not the desired result.
I created a new project, imported the maps and layouts, and created another script tool and the result is the same. The mapsheet/grid selection result is what was desired in the last run in the other project.
Since you imported the maps and layouts into the new project, you must also be importing the selections on layers from the other project. What if you clear all selections from the original project before importing maps and layouts into new project and running script tool?
That's the problem...There were no selections. The selections are cleared each time. And I'm deleting the display cache.
I may try rebuilding the project from scratch.
Here's what is happening:
The SelectLayerByLocation_management function is using the subbasin layer— before the definition query is applied— as the selecting features input.
Whatever definition query is applied to the subbasin layer when the project is opened is the one used for the spatial selection. Even though I get the correct layer object and use it as a parameter in the selection (line 33).
In the image below there was no definition query applied to the subbasin layer before the tool ran, so the selecting features were all the subbasins.
I even had the tool sleep for 30 sec (line 30) while I manually refreshed the map to no effect (BTW, there is no refresh method in the Map class of the mp module).
Next step is to export the layer with the definition query applied then use that output as the selecting features in the spatial selection.
EDIT: CopyFeatures_management does the same thing as SelectLayerByLocation_management
This is only an issue when run as a GP tool. No issue in the python console.
Sure would be nice if someone from Esri would comment on this...
import arcpy
from arcpy import env
import time
# Global variables
# ----------------
aprx = arcpy.mp.ArcGISProject('CURRENT')
myMap = aprx.listMaps('Map')[0]
sbCode = arcpy.GetParameterAsText(0)
sbAIName = f'Subbasin {sbCode}'
sbDefQ = f'AREA_CODE = {sbCode}'
# Get the layer objects
mshLayer = myMap.listLayers('Mapsheets')[0]
mshAILayer = myMap.listLayers('AI Mapsheets')[0]
aiResultLayer = myMap.listLayers('AI Results')[0]
sbAILayer = myMap.listLayers('Subbasin *')
myMap.clearSelection()
for sb in sbAILayer:
arcpy.AddMessage(f'Layer name start of loop: {sb}')
arcpy.AddMessage(f'Subbasin query string: {sbDefQ}')
sb.definitionQuery = sbDefQ
arcpy.AddMessage('Definition query applied to AI Subbasins.')
sb.name = sbAIName
arcpy.AddMessage(f'AI Subbasin layer name changed to {sbAIName}')
arcpy.AddMessage(f'Layer name end of loop: {sb}')
arcpy.AddMessage('Sleeping for 30 seconds...')
time.sleep(30) # Manually refresh the map during sleep
# Layer object again to ensure I have the correct one for selecting feature below
sbSelection = myMap.listLayers(sbAIName)[0]
# Perform spatial selections
# --------------------------
# Select Acoustic Inspection results in desired subbasin
resultsSelect = arcpy.SelectLayerByLocation_management(aiResultLayer,
'WITHIN',
sbSelection,
0,
'NEW_SELECTION')
arcpy.AddMessage(resultsSelect)
Sure would be nice if someone from Esri would comment on this...
Now that you have the problem so well defined, I would contact Esri support so they can reproduce and fix it!