I have been working on a Python toolbox which contains 6 parameters. I am a little lost on all of the different data types available in ArcMap (it seems like there's hundreds of them!). However, one of the input parameters has a file extension of .shp (shapefile). I have always used the GPFeatureLayer data type and it has always worked for everything else I hope to do with my tool, although I don't completely understand why. I have only been doing my testing with point shapefiles for the time being.
What I would ultimately hope to do is check if the user has entered a shapefile that is not a point (or a collection of points). If it is not a point, throw a warning to the user, but still allow them to use the tool. From what I understand, you can check the shape type by utilizing the Describe() class. However, when I attempt to pass my parameter into Describe (in order to return a Describe object), ArcMap throws an error:
Here is how I define the parameter I am focusing on:
def getParameterInfo(self):
"""Define parameter definitions"""
# First parameter = layer with customized features
param0 = arcpy.Parameter(
displayName = "Source layer with customized features",
name = "source",
datatype = "GPFeatureLayer",
parameterType = "Required",
direction = "Input")
And I was hoping to throw the warning in the updateParameters() method:
def updateParameters(self, parameters):
if parameters[2].value == True:
parameters[3].enabled = True
parameters[4].enabled = True
parameters[5].enabled = True
else:
parameters[3].enabled = False
parameters[4].enabled = False
parameters[5].enabled = False
describe = arcpy.Describe(parameters[0])
if describe.shapeType == 'Point':
arcpy.AddWarning('Warning: This is a point shapefile')
Any ideas as to why I am getting this error?
Am I using the correct data type?
I have tried using other data types for this parameter, such as DEFeatureClass, GPPoint, and DEShapefile, but I received the following error if I tried adding my shapefile in as my parameter:
The error was the same regardless of which of the three I used.
My issue with the Describe() class has been cleared up by adding the .value extension in my updateParameters() method:
def updateParameters(self, parameters):
describe = arcpy.Describe(parameters[0].value)
However, now when I attempt to use the setWarningMessage() function, I get no response from ArcMap. My updateParameters() consists of the following:
def updateParameters(self, parameters):
describe = arcpy.Describe(parameters[0].value)
#check = str(describe.shapeType)
if describe.shapeType == 'Point':
parameters[0].setWarningMessage('This is a point feature class')
else:
parameters[0].clearMessage()
if parameters[2].value == True:
parameters[3].enabled = True
parameters[4].enabled = True
parameters[5].enabled = True
else:
parameters[3].enabled = False
parameters[4].enabled = False
parameters[5].enabled = False
return
When I add a shapefile that I know in fact is a point, the tool does not output a warning. It simply accepts it without any feedback to the user.
Does it matter if the Describe.shapeType function has an output of Unicode?
I tested this through the ArcMap Python window with the following sequence of commands:
However, even if I try to convert the Describe.shapeType to a string, I still don't get a warning message. I've done the following tests:
- Rather than checking for: if describe.shapeType == 'Point', I tried to check for: if describe.shapeType == u'Point', which would force it to check for a Unicode data type.
- Converting the shapeType into a string via str(decribe.shapeType).
- Using the encode method to change the Unicode into a sequence of ASCII characters: describe.shapeType.encode('ascii', 'ignore').
Hence, I've hit a wall once again.