He estado trabajando en una caja de herramientas de Python que contiene 6 parámetros. Estoy un poco perdido en todos los diferentes tipos de datos disponibles en ArcMap (¡parece que hay cientos de ellos!). Sin embargo, uno de los parámetros de entrada tiene una extensión de archivo .shp (shapefile). Siempre he usado el tipo de datos GPFeatureLayer y siempre ha funcionado para todo lo demás que espero hacer con mi herramienta, aunque no entiendo completamente por qué. Solo he estado haciendo pruebas con shapefiles de punto por el momento.
Lo que espero hacer en última instancia es verificar si el usuario ha ingresado un shapefile que no es un punto (o una colección de puntos). Si no es un punto, lanzar una advertencia al usuario, pero aún permitirle usar la herramienta. Según entiendo, puedes verificar el tipo de forma utilizando la clase Describe(). Sin embargo, cuando intento pasar mi parámetro a Describe (para devolver un objeto Describe), ArcMap lanza un error:
Así es como defino el parámetro en el que me estoy enfocando:
def getParameterInfo(self):
"""Definir definiciones de parámetros"""
# Primer parámetro = capa con características personalizadas
param0 = arcpy.Parameter(
displayName = "Capa de origen con características personalizadas",
name = "origen",
datatype = "GPFeatureLayer",
parameterType = "Requerido",
direction = "Entrada")
Y esperaba lanzar la advertencia en el método updateParameters():
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('Advertencia: Este es un shapefile de puntos')
¿Alguna idea de por qué estoy recibiendo este error?
¿Estoy usando el tipo de datos correcto?
He intentado usar otros tipos de datos para este parámetro, como DEFeatureClass, GPPoint y DEShapefile, pero recibí el siguiente error si intentaba agregar mi shapefile como mi parámetro:
El error fue el mismo independientemente de cuál de los tres utilizara.
Se ha aclarado mi problema con la clase Describe() al agregar la extensión .value en mi método updateParameters():
def updateParameters(self, parameters):
describe = arcpy.Describe(parameters[0].value)
Sin embargo, ahora cuando intento usar la función setWarningMessage(), no recibo ninguna respuesta de ArcMap. Mi updateParameters() consta de lo siguiente:
def updateParameters(self, parameters):
describe = arcpy.Describe(parameters[0].value)
#check = str(describe.shapeType)
if describe.shapeType == 'Point':
parameters[0].setWarningMessage('Esta es una clase de entidad de punto')
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
Cuando agrego un shapefile que sé que de hecho es un punto, la herramienta no emite una advertencia. Simplemente lo acepta sin ningún comentario al usuario.
¿Importa si la función Describe.shapeType tiene una salida de Unicode?
Probé esto a través de la ventana de Python de ArcMap con la siguiente secuencia de comandos:
Sin embargo, incluso si intento convertir el Describe.shapeType a una cadena, aún no recibo un mensaje de advertencia. He hecho las siguientes pruebas:
- En lugar de verificar si describe.shapeType == 'Point', intenté verificar si describe.shapeType == u'Point', lo que lo obligaría a verificar un tipo de datos Unicode.
- Convertir el shapeType en una cadena a través de str(describe.shapeType).
- Usar el método encode para cambiar el Unicode en una secuencia de caracteres ASCII: describe.shapeType.encode('ascii', 'ignore').
Por lo tanto, he vuelto a llegar a un callejón sin salida.
2 votos
No creo que uses AddWarning() allí. Probablemente debas usar setErrorMessage() - echa un vistazo a este enlace: resources.arcgis.com/en/help/main/10.1/index.html#/…
0 votos
Con respecto a la confusión sobre los tipos de datos de parámetros.. ¿Desde dónde estás arrastrando y soltando el shapefile? Si tu Tipo de dato es DEShapefile, arrastrar y soltar el shapefile desde ArcCatalog o navegar hasta él debería funcionar definitivamente. Si has agregado un shapefile a ArcMap y lo estás arrastrando y soltando desde la TOC de ArcMap - eso no funcionará. Ahora es una capa de entidad y requeriría que el Tipo de dato GPFeatureLayer sea aceptado como parámetro.
0 votos
Simplemente estoy arrastrando y soltando los shapefiles desde el Explorador de Windows directamente en la TOC de ArcMap. ¿Importa si arrastro y suelto a través del Explorador de Windows o ArcCatalog? ¿Se convertirá igualmente el shapefile en una capa de entidades una vez que esté en la TOC?
0 votos
Usaría GPLayer, porque aceptará shapefiles, clases de entidades de geodatabase y capas.