How do I access a multivalue output parameter from a python script in modelbuilder, in ArcGIS 10.0?
That is, I have a python script that loops through several input layers (working through a script tool in a toolbox), performing a number of tasks and finally outputting a final layer. There is one output layer for each input layer. The number of input layers is typically 5, but not always. I have seen Using multivalue output parameter with ArcPy?
My entire script is too long to post, so I have posted a pared down version at the end of my post.
You will see that my script currently creates output parameters (feature layers) as part of the loop, using an incrementing number variable as the output parameter number. The script works fine as long as I know how many input layers I will be looping through and I can set up the output parameters of the attached toolbox tool appropriately.
But I need to have a tool(s) that don't know how many inputs there will be. I see from the referenced link how to set up a semicolon-delimited string as the output parameter, but I can't figure out how to do anything with it in modelbuilder. I also setup a boolean output parameter that simply shows that the script has run, in case the number of output layers is fewer than what I have set up for the tool--but I would like something better than that. I thought all the new iterators and other new modelbuilder-specific tools were supposed to be for things like this, but I can't get it to work. Of course, I could be setting up the tool parameters incorrectly, using the modelbuilder iterators incorrectly, I don't know.
Does anybody know how to do this?
Can you show me an example?
The link I referred to doesn't actually show any examples of the ModelBuilder as recipient of such an output parameter (the semicolon-delimited string) or describe what to do.
# IMPORT MODULES import arcpy, os, sys, string, traceback, datetime # SCRIPT ARGUMENTS # Select layer inSelect = arcpy.GetParameterAsText(0) # Input layers inLayers = string.split(arcpy.GetParameterAsText(1), ";") # Output workspace outFolder = arcpy.GetParameterAsText(2) # OTHER FRONT STUFF try: # SET VAR FOR INITIAL OUTPUT PARAMETER NUMBER outputParam = 4 # SET VAR FOR COMPLETION OUTPUT PARAMETER bComplete = False # CREATE LIST FOR INTERMEDIATE DATA TO BE DELETED DURING FINALLY intermediateData =  # LOOP THROUGH INPUT LAYERS. for lyr in inLayers: # SELECT FEATURES # PROJECT # BUFFER # MERGE # CREATE LAYER # Create virtual layer layerName = lyr + prjLayernameSuffix virtualLayer = arcpy.MakeFeatureLayer_management(outFC, layerName) # Create layer on disk - required for arcpy.mapping.Layer layerFilename = layerName + ".lyr" layerPath = os.path.join(outFolder, layerFilename) arcpy.SaveToLayerFile_management(virtualLayer, layerPath, "RELATIVE") # Find layer to symbolize from - some of this is left out from actual script symbolLayerName = hcatype + "_sample_buffers.lyr" symbolLayer = arcpy.mapping.Layer(os.path.join(tooldataPath, symbolLayerName)) # Create map layer from layer file - must use complete path mapLayer = arcpy.mapping.Layer(layerPath) # Symbolize map layer arcpy.mapping.UpdateLayer(df, mapLayer, symbolLayer, True) mapLayer.transparency = outputLayerTransparency # Add map layer to current map arcpy.mapping.AddLayer(df, mapLayer) # Save a layer file with FC in case you want to re-use the layer arcpy.SaveToLayerFile_management(mapLayer, layerPath, "RELATIVE") # CLEAR SELECTION # SET OUTPUT PARAMETER AND INCREMENT PARAMETER NUMBER arcpy.SetParameter(outputParam, mapLayer) outputParam += 1 # SET COMPLETION OUTPUT PARAMETER bComplete = True arcpy.SetParameter(3, bComplete) # REFRESH arcpy.RefreshActiveView() arcpy.RefreshTOC() mxd.save() except: # SET COMPLETION OUTPUT PARAMETER arcpy.SetParameter(3, bComplete) tb = sys.exc_info() tbinfo = traceback.format_tb(tb) pymsg = tbinfo + "\n" + str(sys.exc_type)+ ": " + str(sys.exc_value) arcpy.AddError("Python Messages: " + pymsg + " GP Messages: " + arcpy.GetMessages(2)) finally: # Delete vars and intermediate data for dataObj in intermediateData: if arcpy.Exists(dataObj): arcpy.Delete_management(dataObj) del inSelect, inLayers, prjSpatRef, outFolder # Other appropriate deletions are left out for clarity of example del layerName, virtualLayer, layerFilename, layerPath, mapLayer