Hi All,
I am wondering if you could help with following. Essentially it relates to the following help article "Setting Script Tool Parameters" ArcGIS Help (10.2, 10.2.1, and 10.2.2)
I have a used ModelBuilder to create a geoprocessing workflow. However for part of this I need to run a script within the model to dissolve some features within a layer (the inbuilt modelbuilder geoprocessing function for this does not give me multi-part polygons, despite this being a supposed option).
Thanks in advance (Using ArcGIS 10.2)
Nick
Essentially the problem I encounter is that when I run the model ArcGIS goes in to 'not responding mode' and does not recover. I suspect there is something wrong with wither my python script or the way I am passing variables between modelbuilder and my python script?
Python Script - Dissolve2
import arcpy
arcpy.env.workspace = "C:/Data/ArcGIS/Default.gdb/Dissolve1"
inLayer = arcpy.GetParameter(0)
outLayer = "C:/Data/ArcGIS/temp/OutDisolve.shp"
arcpy.Dissolve_management(inLayer, outLayer, "Id", "","MULTI_PART", "")
arcpy.SetParameter(1, OutLayer)
I have provided screenshots below
1. A simplified view of the model
2. Parameter Input and Output
Does the Model freeze up with this particular dataset?
Thanks Freddie,
No I have tried with several different and simplified datasets and this does not help.
Check the capitalization of outLayer vs. OutLayer. These are two different things according to Python.
Try:
arcpy.SetParameter(1, outLayer)
Thanks picking this up Darren,
I have tried this but it does not seem to be the source of my issue. I am still trying to solve this.
Cheers
Nick
> (the inbuilt modelbuilder geoprocessing function for this does not give me multi-part polygons, despite this being a supposed option).
I'm kind of confused by this because the Dissolve tool is the same tool, whether called from ModelBuilder, a Python script, or run from a toolbox in ArcMap interactively.
Another option to the overhead of setting up a script tool is to use the Calculate Value tool in ModelBuilder. Especially handy for situations where the logic of ModelBuilder validations and preconditions get complicated or problematic, but you don't want to bother with a python script tool.
Expression
proc(r"%InLayer%", r"%OutName%")
Code Block
import os import arcpy def proc(lyr, outname): output = os.path.join( os.path.dirname(arcpy.Describe(lyr).catalogPath), outname) arcpy.Dissolve_management(lyr, output) return output
Data Type:
Feature Class
Curtis Price wrote:
> (the inbuilt modelbuilder geoprocessing function for this does not give me multi-part polygons, despite this being a supposed option).
I'm kind of confused by this because the Dissolve tool is the same tool, whether called from ModelBuilder, a Python script, or run from a toolbox in ArcMap interactively.
Hi Curtis, yes I agree that the underlying tools are (should) be the same... but when I put the dissolve action into modelbuilder I can't seem to get it make multi-polygons (only single-part), despite this being an obvious option to specify? Is this your experience?
With regards to the "Calculate Value Tool" should the expression have an r before %OutName%? This does seem like a more simple way to go. Do you know of any other examples I can follow?
Thanks
Nick
No I have not seen this behavior. I'm wondering if there is a logic thing going on here.
The raw strings are only needed when you are passing a model variable that is a path (like a dataset path) into the function used by Calculate Value. The r is needed to ensure the backslashes are always interpreted as path delimeters instead of part of an escape sequence (for example so "path\temp" isn't intepretes as "path" + <tab> + "emp").
I'm not sure if it will help but you may want to try changing arcpy.GetParameter(0) to arcpy.GetParameterAsText(0). If that doesn't help you may want to use a
try:
code
except arcpy.ExecuteError:
msg = arcpy.GetMessage(0)
arcpy.AddError(msgs)
This might show what's going wrong. If not, you could import os and traceback and write a more detailed "except" to catch other python errors.
GetParameterAsText and SetParameterAsText should always be used unless you have a good reason to use the GetParameter and SetParameter functions. The GP environment is really setup to move data around as strings (think XML) and generally you'll be happier just going with that flow.
As for trapping exceptions and traceback - always a great idea. There are some nice code samples in the help here: