Revisar y probar una secuencia de comandos
Las secuencias de comandos Python se pueden utilizar para automatizar tareas en ArcGIS Pro. Puede compartir con otros las secuencias de comandos que haya creado como archivo Python .py. Sin embargo, para utilizar una secuencia de comandos escrita por otra persona es necesario tener ciertos conocimientos de Python, aunque solo sea para cambiar los nombres de los datasets que se van a procesar. Para compartir una secuencia de comandos Python en un formato más fácil de utilizar, puede crear una herramienta de secuencias de comandos Python.
Una herramienta de secuencias de comandos Python permite proporcionar la secuencia de comandos Python con una interfaz fácil de usar que se parece a las herramientas estándar de geoprocesamiento. Puede hacer que su herramienta de secuencias de comandos se comporte como una herramienta de geoprocesamiento estándar agregando código para validar las entradas del usuario y devolver mensajes al usuario. También puede incluir documentación de ayuda integrada para explicar cómo utilizar la herramienta y configurar sus parámetros.
La creación de herramientas de secuencias de comandos facilita compartir la funcionalidad de una secuencia de comandos Python con otros usuarios. Las secuencias de comandos Python se pueden integrar en un archivo de caja de herramientas personalizado (.atbx), lo que simplifica su compartición.
Abrir un proyecto y revisar los datasets
En primer lugar, descargará los datos del tutorial, abrirá un proyecto existente y revisará los datos que procesará la herramienta.
- Descargue el archivo PythonTool.zip de este tutorial y localícelo en su equipo.
Nota:
La mayoría de los navegadores web descargan archivos de manera predeterminada en la carpeta Downloads del equipo. - Haga clic con el botón derecho en el archivo PythonTool.zip y extráigalo en la carpeta C:\Tutorials\.
Nota:
Si aún no tiene esta carpeta en su equipo, puede crearla y extraer en ella el archivo zip. También puede extraerlo en otra ubicación, sin embargo, en las instrucciones y la secuencia de comandos se utiliza la ruta C:\Tutorials. Si coloca la carpeta PythonTool en una ubicación diferente, tendrá que actualizar la secuencia de comandos script para que apunte a la ruta de su carpeta. - Inicie ArcGIS Pro e inicie sesión en ArcGIS Online.
Nota:
Si no tiene una cuenta de organización, consulte las opciones de acceso a software.
- En ArcGIS Pro, haga clic en Abrir otro proyecto.
- En la ventana Abrir proyecto, vaya a la carpeta PythonTool, haga clic en Python Tool.aprx y luego en Aceptar.
Se abrirá el proyecto.
El mapa muestra varias clases de entidades del área de Washington, D.C.
- Si el panel Catálogo no está visible, en la cinta, en la pestaña Vista, haga clic en Panel Catálogo.
- En el panel Catálogo, expanda Carpetas y PythonTool.
- Expanda la geodatabase DC.gdb.
La geodatabase contiene ocho clases de entidades. Algunas son capas del mapa.
La carpeta PythonTool también contiene un shapefile denominado neighborhood.shp que también está presente en el mapa.
Supongamos que trabaja en una oficina municipal y recibe periódicamente solicitudes de extractos de datos de barrios concretos de la ciudad.
Para completar esta tarea, es necesario recortar todas las clases de entidades de la geodatabase en una vecindad y almacenar las clases de entidades recortadas en una nueva geodatabase. Esta nueva geodatabase debe comprimirse en un archivo ZIP para poder compartirla fácilmente o utilizarla como copia de seguridad.
Se trata de una tarea relativamente habitual en muchos lugares de trabajo de SIG.
Puede llevar a cabo estas tareas en ArcGIS Pro utilizando la herramienta Crear geodatabase de archivos para crear la nueva geodatabase y ejecutando la herramienta Recortar varias veces, una vez para cada clase de entidad. Luego puede crear el archivo ZIP desde File Explorer o bien utilizar una utilidad de compresión. Este proceso puede ser engorroso y llevar mucho tiempo, sobre todo si es preciso procesar muchas clases de entidades.
Dado que se trata de una tarea habitual, tiene sentido automatizarla.
Con el proyecto se incluye una secuencia de comandos para automatizar la tarea. Revisará y probará esta secuencia de comandos independiente y, a continuación, creará una herramienta de secuencias de comandos Python basada en ella.
Revisar y probar una secuencia de comandos Python
En primer lugar, abrirá la secuencia de comandos y revisará su contenido.
- En File Explorer, vaya a la carpeta C:\Tutorials\PythonTool.
- Haga clic con el botón derecho en el archivo de secuencia de comandos clip_zip.py Python y haga clic en Editar con IDLE (ArcGIS Pro).
Nota:
Si también tiene instalado ArcGIS Desktop 10.x (ArcMap), el menú contextual también incluirá el acceso directo Editar con IDLE. No use este acceso directo, ya que no abre la versión correcta de Python.Nota:
Si utiliza Windows 11 y la opción Editar con IDLE (ArcGIS Pro) no aparece, haga clic en Mostrar más opciones y luego en Editar con IDLE (ArcGIS Pro).La secuencia de comandos se abre en IDLE, el editor predeterminado de Python.
Revisará esta secuencia de comandos para entender cómo funciona y la probará.
La secuencia de comandos comienza con las importaciones:
import arcpy import os import zipfile
Estas líneas importan módulos que la secuencia de comandos utilizará.
ArcPy se necesita para ejecutar herramientas de geoprocesamiento y tareas relacionadas, el módulo os es necesario para manipular rutas y el módulo zipfile es necesario para crear un archivo ZIP.
La siguiente parte de la secuencia de comandos configura el espacio de trabajo y las rutas para los datasets de entrada y salida. Sin los comentarios, queda como sigue:
arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb" clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp" gdb = "C:/Tutorials/PythonTool/Clip.gdb" gdb_path, new_gdb = os.path.split(gdb) gdb = "C:/Tutorials/PythonTool/Clip.zip" arcpy.env.overwriteOutput = True
El espacio de trabajo se establece en la geodatabase DC.gdb, que contiene las clases de entidades que deben recortarse. La clase de entidad neighborhood.shp se utilizrá como entidades de recorte. La secuencia de comandos creará la geodatabase Clip.gdb, que contendrá la salida de la herramienta Recortar. La ruta completa de la geodatabase se divide en la carpeta, C:\Tutorials\PythonTool, y el nombre de el nombre de la geodatabase, Clip.gdb, mediante os.path.split(). Se necesitan como variables separadas más adelante en la secuencia de comandos. El archivo ZIP Clip.zip incluirá todo el contenido de la geodatabase Clip.gdb
Todos los datasets residen en la misma carpeta, pero no es necesario que sea así para que la secuencia de comandos funcione. Por ejemplo, la nueva geodatabase podría crearse en otra carpeta.
Lo siguiente en la secuencia de comandos es la creación de la nueva geodatabase. Un mensaje confirma que se ha creado la nueva geodatabase.
arcpy.CreateFileGDB_management(gdb_path, new_gdb) print(f"Output geodatabase {gdb} created")
En la siguiente sección se ejecuta la herramienta Recortar:
inputs = arcpy.ListFeatureClasses() for fc in inputs: fc_name = arcpy.da.Describe(fc)["baseName"] new_fc = os.path.join(gdb, fc_name) arcpy.analysis.Clip(fc, clip_fc, new_fc) print(f"Output feature class {new_fc} created")
La función ListFeatureClasses() devuelve todas las clases de entidad del espacio de trabajo, que es la geodatabase DC.gdb. En el bucle for siguiente, se obtiene el nombre base de la clase de entidad. Aunque esto no es estrictamente necesario en este ejemplo, permite que la secuencia de comandos sea más sólida, ya que elimina cualquier extensión de archivo, como .shp cuando las entradas son shapefiles. La ruta completa de la clase de entidad de salida se crea mediante os.path.join(). Esto es necesario ya que la salida debe terminar en la geodatabase Clip.gdb, no en el espacio de trabajo. Se ejecuta la herramienta Clip y se muestra un mensaje en el que se confirma que se ha creado la nueva clase de entidad. Estos pasos se repiten para cada clase de entidad de la lista.
La última sección crea el archivo ZIP:
with zipfile.ZipFile(out_zip, "w") as myzip: for f in os.listdir(gdb): if not f.endswith(".lock"): file_name = os.path.join(gdb, f) arc_name = os.path.join(new_gdb, f) myzip.write(file_name, arc_name)
Se crea un nuevo archivo ZIP vacío mediante zipfile.ZipFile(). En este caso se utiliza una declaración with para crear y abrir el archivo, al tiempo que se garantiza que el archivo se cierra una vez finalizado el procesamiento. El contenido de la geodatabase se determina mediante os.listdir(), que devuelve una lista de todos los archivos dentro de la carpeta de la geodatabase. Los archivos con la extensión .lock se omiten. El resto de los archivos se escriben en el archivo ZIP. La variable file_name representa la ruta completa de cada archivo en la geodatabase original. La variable arc_name representa cada uno de los archivos que se va a escribir en el archivo ZIP, pero solo incluye el nombre de la geodatabase y el nombre del archivo. Esto reproduce cómo se crearía manualmente un archivo ZIP en File Explorer.
Después de revisar la secuencia de comandos, se preparará para probarla.
- En IDLE, observe las rutas utilizadas al principio de la secuencia de comandos.
Si copió la carpeta del tutorial en una ubicación distinta de C:/Tutorials/PythonTool/, tendrá que obtener la ruta a los datos mediante File Explorer.
- Edite las cuatro rutas de esta sección:
arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb" clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp" gdb = "C:/Tutorials/PythonTool/Clip.gdb" gdb_path, new_gdb = os.path.split(gdb) gdb = "C:/Tutorials/PythonTool/Clip.zip" arcpy.env.overwriteOutput = True
Nota:
Observe que las rutas de la secuencia de comandos utilizan la barra oblicua (/) como separador de rutas. Si copia una ruta desde File Explorer, utilizará el carácter separador de rutas Windows predeterminado de \. Deberá cambiar todos los caracteres de barra invertida por barras diagonales en la secuencia de comandos.Las rutas completas codificadas se encuentran solo en la parte superior de la secuencia de comandos, donde se asignan a variables. En el resto de la secuencia de comandos se utilizan estas variables. Las rutas completas y los nombres de los archivos no se repiten más allá de esta sección superior. Esta estrategia hace que sea más fácil identificar lo que puede ser necesario cambiar, y será útil al adaptar la secuencia de comandos para utilizarla como una herramienta de secuencia de comandos Python más adelante en este tutorial.
- En IDLE, haga clic en Archivo y en Guardar para guardar los cambios realizados en la secuencia de comandos.
- En IDLE, haga clic en Ejecutar y en Ejecutar módulo para ejecutar la secuencia de comandos.
La secuencia de comandos se ejecuta.
Aparece la ventana de shell IDLE y la secuencia de comandos muestra mensajes de progreso a medida que va procesando los datos.
Nota:
Es posible que aparezcan mensajes de error si no ha modificado correctamente las rutas. Por ejemplo, si el espacio de trabajo no está bien configurado, la lista denominada inputs está vacía y la secuencia de comandos devuelve el siguiente error:TypeError: ‘NoneType’ object is not iterable
O bien, si la ruta de la geodatabase Clip.gdb es incorrecta, la secuencia de comandos devuelve el siguiente error:
ERROR 000732: File GDB Location: Dataset … does not exist or is not supported
Estos errores ilustran la dificultad de compartir secuencias de comandos. Crear una herramienta de secuencia de comandos es una buena forma de prevenir este tipo de errores.
Si la secuencia de comandos se ejecuta correctamente, los mensajes confirman que se han creado la geodatabase y las clases de entidades recortadas. Lo comprobará mediante ArcGIS Pro y File Explorer.
- En ArcGIS Pro, en el panel Catálogo, haga clic con el botón derecho en la carpeta PythonTool y luego haga clic en Refrescar.
- En el panel Catálogo, en la carpeta PythonTool, verifique que la geodatabase Clip.gdb se ha creado.
- Expanda la geodatabase Clip.gdb.
- En la geodatabase Clip.gdb, haga clic con el botón derecho en bike_racks y luego haga clic en Agregar al mapa actual.
La nueva capa bike_racks recortada se agrega al mapa.
- En File Explorer, vaya a la carpeta C:\Tutorials\PythonTool.
El archivo Clip.zip se agrega a la carpeta.
La secuencia de comandos independiente funciona de la forma esperada. Si desea utilizar la secuencia de comandos para diferentes datasets, puede abrir la secuencia de comandos y modificar las rutas. Es un proceso que no resulta muy fácil para personas no familiarizadas con la creación de secuencias de comandos Python. Además, es fácil cometer errores al modificar las rutas en la secuencia de comandos. En la siguiente sección, desarrollará una herramienta de secuencia de comandos Python con una interfaz fácil de utilizar.
Crear una herramienta y agregar parámetros
La siguiente fase del proceso consiste en crear una herramienta de secuencias de comandos y configurar sus parámetros. De este modo se configura la interfaz de usuario de la herramienta.
Crear una caja de herramientas y una herramienta de secuencias de comandos
Las herramientas de secuencias de comandos Python se crean en ArcGIS Pro. Se almacenan en una caja de herramientas personalizada. Ahora creará una caja de herramientas personalizada en su proyecto y le agregará una herramienta de secuencias de comandos.
- En ArcGIS Pro, en el panel Catálogo, haga clic con el botón derecho en la carpeta PythonTool, haga clic en Nuevo y luego en Toolbox (.atbx).
Se crea la caja de herramientas.
- Escriba Recortar_y_comprimir como nombre de la caja de herramientas y pulse Intro.
El nombre de la herramienta es Recortar_y_comprimir.
Nota:
En versiones anteriores de ArcGIS Pro se utilizaba el formato .tbx. Puede seguir utilizando cajas de herramientas antiguas en este formato, no obstante, al crear cajas de herramientas, debe utilizar el formato .atbx a partir de ArcGIS Pro 3.0. - Haga clic con el botón derecho en la caja de herramientas Recortar_y_comprimir, apunte a Nuevo y haga clic en Secuencia de comandos.
Aparece la ventana Nueva secuencia de comandos.
Esta ventana se utiliza para establecer las propiedades generales de la herramienta, configurar sus parámetros, introducir el código de ejecución y agregar el código de validación. Completará todos estos pasos en el resto de este tutorial.
Por ahora, especificará el nombre, la etiqueta y la descripción de la herramienta de secuencias de comandos.
- En el cuadro Nombre, escriba RecortaryComprimir.
El nombre de la herramienta es el nombre de identificación interno y único que utiliza la herramienta. El nombre solo puede contener letras y números. No se admiten espacios ni caracteres especiales.
- En el cuadro Etiqueta, escriba Recortar y comprimir.
La etiqueta de la herramienta es el nombre descriptivo de la herramienta en la caja de herramientas, y se muestra cuando la herramienta está abierta en el cuadro de diálogo de herramientas. La etiqueta puede tener espacios y caracteres especiales.
En el siguiente cuadro, Caja de herramientas, se encuentra la herramienta de secuencias de comandos. La ruta y el nombre de la caja de herramientas se muestran en función de la ubicación del archivo .atbx y no pueden modificarse en la ventana. Es importante reconocer que la herramienta de secuencias de comandos no es un archivo independiente, sino que forma parte del archivo .atbx.
- En el cuadro Descripción, escriba Esta herramienta de secuencias de comandos le permite seleccionar múltiples capas de entidades o clases de entidades y recortarlas utilizando una o más entidades de polígono. Los resultados se almacenan en una nueva geodatabase y se crea un archivo ZIP de esta nueva geodatabase para simplificar el proceso de compartir o realizar copias de seguridad.
- Haga clic en Aceptar.
La herramienta de secuencias de comandos se crea con las propiedades generales que ha introducido.
- En el panel Catálogo, en la caja de herramientas Recortar_y_comprimir, haga doble clic en la herramienta Recortar y comprimir.
La herramienta de secuencias de comandos se abre en el panel Geoprocesamiento. Dispone del marco de una herramienta de geoprocesamiento, pero sigue estando vacía en su mayor parte.
- Cierre la herramienta.
El siguiente paso consiste en configurar los parámetros de la herramienta.
Examinar las propiedades de la herramienta
Configurar cuidadosamente los parámetros de la herramienta es una parte fundamental de la creación de una herramienta de secuencias de comandos Python. Los parámetros de la herramienta definen la interfaz de usuario de la misma, que permite al usuario de la herramienta introducir los datos y otros valores que serán procesados por la secuencia de comandos.
- Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
Se abre la ventana Propiedades de la herramienta: Recortar y comprimir, en la que se pueden ver las entradas anteriores en la pestaña General.
- Haga clic en la pestaña Parámetros.
Aquí configurará los parámetros de la herramienta. Los parámetros de la herramienta se organizan en una tabla en la que cada fila es un parámetro y las columnas son las propiedades de cada parámetro.
Utilizará esta tabla para crear los siguientes parámetros:
- Capas de entidades de entrada: el usuario puede seleccionar cualquier capa de entidades del mapa activo, o navegar a cualquier clase de entidad del disco.
- Polígonos de recorte: el usuario puede seleccionar una capa de entidades de polígono, buscar una clase de entidades de polígono en el disco o crear un conjunto de entidades en el mapa activo formadas por polígonos.
- Geodatabase de salida: el usuario puede especificar la ruta y el nombre de archivo de una nueva geodatabase para almacenar los resultados.
- Archivo ZIP de salida: el usuario puede especificar la ruta y el nombre del archivo ZIP que se creará con el contenido de la geodatabase.
Agregar el parámetro de la capa de entidades de entrada
Primero agregará el parámetro de la capa de entidades de entrada.
- En la columna Etiqueta, escriba Capas de entidades de entrada y pulse Intro.
La etiqueta del parámetro es la etiqueta de fácil lectura del parámetro, que se muestra en el panel de herramientas.
El nombre del parámetro se rellena automáticamente a partir de la etiqueta, sustituyendo los espacios por guiones bajos. El nombre del parámetro se utiliza internamente en la herramienta de secuencias de comandos, y se puede utilizar al establecer los parámetros de la herramienta en una secuencia de comandos Python.
- En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
Aparece la ventana Tipo de datos del parámetro.
El valor predeterminado es Cadena de caracteres, pero lo cambiará a Capa de entidades.
- Haga clic en la lista desplegable de tipos de datos, desplácese hasta la sección C de la lista y haga clic en Capa de entidades.
Establecer el tipo de datos en Capa de entidades permite al usuario seleccionar capas de entidades en el mapa activo utilizando una lista desplegable en la herramienta, o buscar clases de entidades en el disco.
La herramienta debe poder aceptar varias capas de entidades de entrada.
- Seleccione Varios valores.
Seleccionar Varios valores significa que el usuario puede seleccionar una o más entradas para este parámetro de la herramienta. Puede tratarse de una combinación de capas de entidades y clases de entidades.
- Haga clic en Aceptar para cerrar la ventana Tipo de datos del parámetro.
- En Tipo, acepte el valor predeterminado Requerido.
Establecer el parámetro como Requerido significa que la herramienta no se puede ejecutar si el parámetro no se establece.
- En Dirección, acepte el valor predeterminado Entrada.
Establecer la dirección del parámetro en Entrada indica a la herramienta que se trata de una de las capas o valores de entrada que procesará. También permite utilizar la herramienta en ModelBuilder, donde las capas de entidades pueden conectarse a la herramienta como entradas.
Esto completa el primer parámetro. Con este único parámetro puede comprobar inmediatamente el aspecto de la herramienta de secuencia de comandos.
- En la ventana Propiedades de la herramienta: Recortar y comprimir, haga clic en Aceptar.
- En el panel Catálogo, en la caja de herramientas Recortar_y_comprimir, haga doble clic en la herramienta Recortar y comprimir.
La herramienta de secuencias de comandos se abre en el panel Geoprocesamiento. Se muestra el primer parámetro. Hay una lista desplegable para seleccionar capas de entidades del mapa activo y un botón de navegación para buscar clases de entidades en el disco. Un asterisco rojo delante de la etiqueta del parámetro indica que se trata de un parámetro obligatorio.
En esta fase, está configurando los parámetros de la herramienta y visualizando la interfaz de usuario de la herramienta para comprobar que los parámetros aparecen correctamente. Todavía no se puede probar si la herramienta funciona correctamente porque no se ha agregado el código Python.
Nota:
Si selecciona al menos una capa de entidades de entrada y ejecuta la herramienta, obtendrá un mensaje de error. - Cierre la herramienta.
Agregar el parámetro Polígonos de recorte
A continuación, configurará el parámetro para los polígonos de recorte.
- Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
- En la pestaña Parámetros, en la segunda fila de la tabla, haga clic en la columna Etiqueta, escriba Polígonos de recorte y pulse Intro.
El nombre del parámetro se actualiza a Recortar_Polígonos.
- En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
- En Tipo de datos, haga clic en la lista desplegable y seleccione Conjunto de entidades.
Un conjunto de entidades es una representación ligera de una clase de entidad. En el contexto de una herramienta de geoprocesamiento, un conjunto de entidades permite a la herramienta aceptar entradas interactivas. Un usuario puede crear entidades dibujando en el mapa, de la misma forma que crearía entidades durante la edición utilizando el panel Crear entidades. El usuario también puede seleccionar capas de entidades del mapa activo, o buscar clases de entidades en el disco.
- Haga clic en Aceptar para cerrar la ventana Tipo de datos del parámetro.
- En Tipo, acepte el valor predeterminado Requerido.
- En Dirección, acepte el valor predeterminado Entrada.
A continuación, establecerá un filtro en este parámetro para que el parámetro Polígonos de recorte de la herramienta solo acepte entidades de polígono como entrada.
- Desplácese hacia la derecha y haga clic en la columna Filtro.
- Haga clic en la lista desplegable Filtro y seleccione Tipo de entidad.
Aparece la ventana Filtro de tipo de entidad.
- Seleccione Polígono.
Ahora, cuando alguien ejecuta la herramienta, solo se pueden utilizar polígonos para la geometría de recorte de entrada.
-
En la ventana Filtro de tipo de entidad, haga clic en Aceptar.
Ha configurado el parámetro Polígonos de recorte.
Agregar el parámetro de geodatabase de salida
A continuación, configurará el parámetro para la geodatabase de salida.
- En la pestaña Parámetros, en la tercera fila de la tabla, haga clic en la columna Etiqueta, escriba Geodatabase de salida y pulse Intro.
- En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
- En Tipo de datos, haga clic en la lista desplegable, seleccione Espacio de trabajo y haga clic en Aceptar.
- En Tipo, acepte el valor predeterminado Requerido.
- Haga clic en la columna Dirección y, en la lista desplegable, seleccione Salida.
Establecer Dirección en Salida indica a la herramienta que esta es una de las salidas que producirá. También permite utilizar la herramienta en ModelBuilder, donde se generarán elementos de salida para la herramienta.
- Haga clic en la columna Filtro.
- Haga clic en la lista desplegable Filtro y seleccione Espacio de trabajo.
- En la ventana Filtro de espacio de trabajo, seleccione Base de datos local.
Establecer el filtro en Base de datos local significa que el usuario solo podrá especificar una geodatabase de archivos como entrada, no una geodatabase corporativa ni una carpeta.
- Haga clic en Aceptar.
Ha configurado el parámetro Geodatabase de salida.
Agregar el parámetro de archivo zip de salida
A continuación, configurará el parámetro para el archivo zip de salida.
- En la pestaña Parámetros, en la cuarta fila de la tabla, haga clic en la columna Etiqueta, escriba Archivo ZIP de salida y pulse Intro.
- En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
- En Tipo de datos, haga clic en la lista desplegable, seleccione Archivo y haga clic en Aceptar.
Un archivo zip es un archivo, por lo que es el tipo de datos correcto.
- Haga clic en la columna Dirección y, en la lista desplegable, seleccione Salida.
- Haga clic en la lista desplegable Filtro y seleccione Archivo.
- En la ventana Filtro de archivo, en el cuadro Extensiones, escriba zip.
La extensión del archivo debe ser solo las letras de la extensión, sin incluir el punto separador de extensión del archivo. No escriba .zip.
La extensión del archivo no distingue entre mayúsculas y minúsculas.
- Haga clic en Aceptar.
Ha agregado todos los parámetros de la herramienta.
- En la ventana Propiedades de la herramienta: Recortar y comprimir, haga clic en Aceptar.
El siguiente paso consiste en probar los parámetros que ha configurado.
Probar los parámetros
Una vez creados todos los parámetros de la herramienta, puede probar el panel de herramientas para asegurarse de que los ajustes de cada parámetro funcionan según lo previsto.
- En el panel Catálogo, en la caja de herramientas Recortar_y_comprimir, haga doble clic en la herramienta Recortar y comprimir.
Se abre la herramienta Recortar y comprimir. Todos los parámetros configurados en los pasos anteriores aparecen ahora en el panel de herramientas.
- En la herramienta Recortar y comprimir, haga clic en la lista desplegable Capas de entidades de entrada y seleccione bike_racks.
Aparece un segundo cuadro Capas de entidades de entrada debajo del de bike_racks, porque este parámetro de la herramienta admite varios valores.
- Haga clic en el botón Examinar de Capas de entidades de entrada, expanda la geodatabase DC.gdb, haga clic en bike_routes y luego en Aceptar.
La clase de entidad bike_routes no se encontraba en el mapa, pero la agregó en la herramienta Recortar_y_comprimir.
Esto confirma que un usuario puede seleccionar varias entradas, incluyendo capas de entidades del mapa activo y clases de entidad del disco.
- Haga clic en la herramienta de boceto Polígonos de recorte.
La entrada de boceto del conjunto de entidades está limitada a entidades de polígono.
Esto evitará que alguien intente recortar con entidades de punto o línea, lo que provocaría un error.
Ahora probará las salidas.
- En el cuadro Output geodatabase, escriba C:\Tutorials\PythonTool\Clip y haga clic en el cuadro de texto Archivo ZIP de salida.
Al introducir la ruta de una carpeta se activa un icono de alerta de error en el parámetro Geodatabase de salida.
- Apunte al icono de alerta de error.
Aparece un mensaje de error que indica que en la ubicación especificada no existe ninguna geodatabase o que se trata de un tipo de espacio de trabajo incorrecto.
Además, si introduce una extensión de archivo incorrecta, por ejemplo, .fdb, esta cambia automáticamente a .gdb.
Se produce una validación similar para el parámetro final.
- En el cuadro Archivo ZIP de salida, escriba C:\Tutorials\PythonTool\Clip y haga clic en el cuadro de texto Geodatabase de salida.
La herramienta agrega la extensión de archivo .zip a Recortar.
- En el cuadro Archivo ZIP de salida, escriba C:\Tutorials\PythonTool\Clip y haga clic en el cuadro Geodatabase de salida.
Si se introduce una ruta que termina en una extensión de archivo incorrecta, se activa un icono de alerta de error en el parámetro Archivo ZIP de salida.
- Apunte al icono de alerta de error.
Si apunta al icono, aparece un mensaje de error que indica que se trata de un tipo de archivo incorrecto.
- Cierre la herramienta.
Las pruebas muestran que los filtros y otros parámetros que ha configurado funcionan. El diseño cuidadoso de los parámetros da como resultado una herramienta más sólida, ya que evita que los usuarios ejecuten la herramienta con valores no válidos.
Ha probado los parámetros, pero la herramienta todavía no está lista para ejecutarse, ya que no se ha agregado el código. Esto es lo que hará a continuación.
Editar el código de ejecución
El código de extensión de una herramienta de secuencias de comando Python es el código Python que se ejecuta cuando un usuario hace clic en Ejecutar en el panel Geoprocesamiento. Utilizará la secuencia de comandos independiente que revisó anteriormente, pero tendrá que realizar algunos cambios en ella para que la secuencia de comandos pueda recibir los parámetros introducidos por un usuario en el panel de herramientas.
- Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
- Haga clic en la pestaña Ejecución.
La pestaña muestra la plantilla de código Python para una herramienta de secuencia de comandos.
El código comienza con un marcador de posición de comentario de varias líneas para la documentación de la secuencia de comandos. En Python, tres comillas inician un comentario de varias líneas, y tres comillas lo terminan. Python no ejecuta el texto que se introduce dentro del comentario.
Después del comentario, la primera línea de código es import arcpy. La mayor parte de secuencias de comandos de la herramienta de geoprocesamiento utilizarán ArcPy, por lo que se incluye en la plantilla.
A continuación, se define una función denominada script_tool(). Una función se crea utilizando la palabra clave def seguida del nombre de la función y los argumentos de la misma. Cambiará el nombre de la función de plantilla para que coincida con su herramienta.
La función de plantilla especifica dos parámetros, pero su herramienta acepta más; esto también lo cambiará.
El código de ejecución de la herramienta de secuencias de comandos irá dentro de esta función.
Al final del bloque de plantilla de función hay una declaración return. Esto finaliza la función y devuelve los resultados.
La sección final del código comienza con if __name__ == '__main__':. Se trata de una declaración condicional y el bloque de código sangrado que sigue solo se ejecutará cuando la condición se evalúe como True. La variable __name__, con dos guiones bajos a cada lado, tiene el valor '__main__' para cualquier secuencia de comandos.
Cuando se ejecuta el código como una secuencia de comandos, que es el caso cuando se ejecuta una herramienta de secuencia de comandos, se ejecuta el bloque de código sangrado. En el caso de un módulo importado, sin embargo, la variable se establece con el nombre del módulo. En ese caso, el bloque de código sangrado no se ejecuta. Esta estructura de código permite distinguir entre ejecutar el código como una secuencia de comandos o importarlo a otra secuencia de comandos como módulo. Este escenario no se aplica en este caso. Para crear la herramienta de secuencias de comandos, basta con saber que el bloque de código sangrado se ejecuta cuando se ejecuta la herramienta de secuencias de comandos. El bloque de código recibe parámetros mediante la función ArcPy GetParameterAsText() y luego se invoca la función ScriptTool() en los parámetros.
La plantilla utiliza dos parámetros denominados param0 y param1. Se trata de marcadores de posición temporales; tendrá que editar los parámetros para que coincidan con su secuencia de comandos.
Nota:
En los próximos pasos, comenzará a modificar el código de ejecución. Es importante saber dónde se almacena el código. De forma predeterminada, el código Python está integrado. Esto significa que forma parte del archivo de caja de herramientas .atbx y que no se almacena por separado. Sin embargo, puede exportar el código a un archivo .py para facilitar la edición y, posteriormente, integrar el código. Practicará este flujo de trabajo a medida que realice cambios incrementales en el código.A continuación, modificará el nombre de la función script_tool() por algo más significativo. Para empezar, editará el código integrado directamente en el cuadro de diálogo de propiedades de la herramienta.
- En la pestaña Ejecución, en el cuadro de código, edite la línea def script_tool(param0, param1): para que sea def ClipZip(param0, param1):
Modifíquela aquí:
Debe tener este aspecto:
Al modificar el código en el cuadro de diálogo de propiedades de la herramienta, las líneas de código que se han modificado muestran un marcador amarillo delante.
- En el cuadro de código, edite la línea script_tool(param0, param1) para que sea ClipZip(param0, param1)
De este modo, ha actualizado el nombre de la función en los dos lugares en los que aparece en la plantilla de la herramienta de secuencias de comandos.
Si bien editar el código de esta manera es muy práctico y rápido, el cuadro de código ofrece una funcionalidad limitada en comparación con un editor Python típico. A continuación, verá dos métodos para editar el código de ejecución en un editor Python.
- En la pestaña Ejecución, debajo el cuadro de código, haga clic en Aceptar.
Los cambios en el código integrado se guardan automáticamente y los marcadores amarillos desaparecerán cuando cierre el cuadro de diálogo de propiedades de la herramienta.
- Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
- En la parte inferior del cuadro de código, haga clic en el botón Abrir en Editor de secuencias de comandos.
Se abre un archivo de secuencias de comandos temporal en el editor Python predeterminado. A menos que haya configurado otro editor, la secuencia de comandos se abre en IDLE.
Las modificaciones realizadas en el cuadro de secuencia de comandos se incluyen en la secuencia de comandos.
Nota:
Puede configurar el editor Python desde la pestaña Proyecto. Haga clic en la pestaña Proyecto, haga clic en Opciones y, por último, haga clic en Geoprocesamiento en el panel de la izquierda. La opción Editor de secuencias de comandos está en blanco de forma predeterminada, lo que indica que se utiliza IDLE. Puede cambiar a su editor preferido especificando la ruta. Para el propósito de este tutorial, IDLE será suficiente.La ruta será similar a: C:\Users\UserName\AppData\Local\Temp\1\ArcGISProTemp19512\
El nombre de archivo consta de las letras tmp seguidas por un código alfanumérico y la extensión de archivo .py. Al realizar cambios en el código y guardar el archivo .py, estos cambios se agregan al bloque de código de ejecución integrado. Practicará este flujo de trabajo.
- En IDLE, agregue una nueva línea de código debajo de import arcpy y agregue el código siguiente:
import os import zipfile
Estos dos módulos se utilizan en la secuencia de comandos independiente original. Puedes copiar y pegar desde la secuencia de comandos o escribir el código.
- En IDLE, haga clic en Archivo y luego en Guardar.
- Cierre IDLE.
El código agregado en IDLE se encuentra ahora en el cuadro de código.
A continuación, editará los parámetros de la secuencia de comandos en un archivo de secuencia de comandos independiente.
Guardar la secuencia de comandos en un archivo independiente
El código con el que ha trabajado hasta ahora se ha integrado en la caja de herramientas. También puede exportar el código a un archivo .py para utilizarlo en su editor Python preferido.
- En la pestaña Ejecución, encima del cuadro de secuencia de comandos, haga clic en la flecha verde del botón Exportar secuencia de comandos a archivo.
- En la ventana Exportar secuencia de comandos, verifique que la ubicación es la carpeta PythonTool y, en Nombre, escriba clip_zip_tool.py.
La secuencia de comandos original con la mayor parte del código que necesita para transferir y actualizar se denomina clip_zip.py, así que asegúrese de utilizar un nombre diferente para no sobrescribir el archivo original.
- Haga clic en Guardar.
Tras haber exportado el código del cuadro de secuencia de comandos a un archivo de secuencia de comandos Python externo, el código ya no se almacena en la caja de herramientas.
En la parte superior del cuadro se muestra la ruta del archivo de secuencia de comandos.
La ventaja de tener un archivo .py independiente es que ahora puede trabajar más fácilmente con el código en su editor preferido. Sin embargo, en el presente tutorial seguirá utilizando IDLE.
El código que aparece en la ventana de propiedades de la herramienta ya no es el código integrado, sino el código del archivo .py. Sin embargo, puede seguir editando el código directamente en la ventana de propiedades de la herramienta y el archivo .py se guardará automáticamente al cerrar la ventana de propiedades de la herramienta.
Para la mayor parte del resto de este tutorial, abrirá el archivo .py en IDLE en lugar de editarlo en la ventana de propiedades de la herramienta.
- En la parte inferior del cuadro de código, haga clic en el botón Abrir en Editor de secuencias de comandos.
El archivo .py se abre en IDLE.
El nombre y la ruta del archivo ya no son temporales.
Nota:
Es posible editar el archivo de secuencia de comandos .py en el cuadro de código de la pestaña Ejecución y en IDLE al mismo tiempo. Sin embargo, esta no es la mejor manera de hacerlo. Recibirá un mensaje de advertencia y tendrá que determinar qué cambios conservar. Para evitarlo, edite su secuencia de comandos solo en una aplicación a la vez.Tras haber exportado el código a un archivo .py, cerrará esta ventana.
- En la ventana Propiedades, haga clic en Aceptar.
A continuación, cambiará el código para que coincida con los parámetros de la herramienta de secuencias de comandos.
- En IDLE, después de la línea if __name__ == "__main__":, reemplace las dos líneas de parámetros que empiezan por param0 y param1 por el código siguiente:
inputs = arcpy.GetParameter(0) clip_fc = arcpy.GetParameterAsText(1) gdb = arcpy.GetParameterAsText(2) out_zip = arcpy.GetParameterAsText(3)
El código actualizado debe tener este aspecto:
Nota:
Es importante que la sangría de las nuevas líneas coincida con el nivel de sangría original de cuatro espacios.Se establecen cuatro parámetros para la herramienta de secuencias de comandos. De esta forma, la secuencia de comandos Python recibirá los cuatro parámetros.
Para obtener los parámetros de la herramienta de secuencia de comandos, puede utilizar las funciones ArcPy GetParameter() y GetParameterAsText(). La interfaz de usuario de la herramienta pasa los parámetros a la secuencia de comandos como una tupla Python, un tipo de datos de secuencia que utiliza la indexación basada en cero. El primer parámetro tiene un índice cero, el segundo parámetro tiene un índice uno, y así sucesivamente. Estos valores de índice están referenciados por los números entre paréntesis al final de cada una de las nuevas líneas. Si el orden de estos números no coincide con el orden de los parámetros en la interfaz de usuario de la herramienta, la secuencia de comandos obtendrá valores de datos erróneos.
Nota:
A partir de ArcGIS Pro 3.2, también es posible hacer referencia a los parámetros por su nombre. Por ejemplo, en lugar de utilizar arcpy.GetParameter(0), puede utilizar arcpy.GetParameter("Input_feature_layers"). Esto permite introducir los parámetros en cualquier orden y no es necesario conocer el índice de cada parámetro.El primer parámetro consiste en una lista Python que puede contener varios nombres de clases de entidades de entrada. La función GetParameter() conserva este formato, por lo que se utiliza esta función para el primer parámetro. Los demás parámetros se reciben como texto mediante GetParameterAsText().
Cada valor de parámetro se asigna a una variable. Las variables se pasarán a la función ClipZip. Los nombres de las variables se eligieron para que fueran coherentes con el código de la secuencia de comandos independiente existente.
- Edite la línea ClipZip(param0, param1) para reemplazar param0, param1 por las variables que contienen los valores de los parámetros:
ClipZip(inputs, clip_fc, gdb, out_zip)
El cambio debe tener el aspecto siguiente:
Esta línea llama a la función ClipZip() con esos parámetros.
- Elimine la línea arcpy.SetParameterAsText(2, "Result").
Esta herramienta de secuencias de comandos no utiliza esta línea de la plantilla.
A continuación, actualizará la definición de la función ClipZip().
- Edite la línea def ClipZip(param0, param1): para reemplazar param0, param1 por las variables que contienen los valores de los parámetros:
def ClipZip(inputs, clip_fc, gdb, out_zip):
El cambio debe tener el aspecto siguiente:
Esto define la función ClipZip() que acepta los cuatro parámetros.
No es necesario que las variables de la definición de la función utilicen los mismos nombres que la pestaña Parámetros, siempre que el orden de las variables sea el mismo. Los nombres de las variables de la línea de definición de la función deben ser coherentes con las variables del bloque de código que define lo que hace la función (que aún no se ha agregado).
- En IDLE, haga clic en Archivo y luego en Guardar.
Los cambios realizados en IDLE se guardan en el archivo de secuencias de comandos.
La secuencia de comandos debe tener este aspecto:
A continuación, agregará código de la secuencia de comandos original al bloque de código.
Copiar código de la secuencia de comandos original
La secuencia de comandos original contiene el código que agregará al bloque de código de su herramienta de secuencias de comandos.
- En IDLE, haga clic en Archivo y luego en Abrir.
- En la carpeta C:\Tutorials\PythonTool, haga clic en clip_zip.py y luego en Abrir.
- En IDLE, en la secuencia de comandos clip_zip.py, haga clic al principio de la línea # Workspace and datasets y luego haga clic y arrastre hasta el final de la secuencia de comandos para seleccionar todo código, con la excepción de las líneas import.
- Haga clic con el botón derecho en el código seleccionado y luego haga clic en Copiar.
- En IDLE, cambie a la ventana clip_zip_tool.py.
- Seleccione el comentario """Script code goes below""".
- Haga clic con el botón derecho en el código seleccionado y luego haga clic en Pegar.
El código se pega en el bloque de código de la función ClipZip.
Ha terminado con la secuencia de comandos original. Ahora puede cerrar dicha ventana y centrarse en el código clip_zip_tool.py.
- En IDLE, cierre la ventana de la secuencia de comandos clip_zip.py.
Todo el bloque de código que ha copiado en la secuencia de comandos clip_zip_tool.py necesita una sangría de cuatro espacios para formar parte de la función.
Aunque es posible hacerlo manualmente, escribiendo cuatro espacios antes de cada línea, también puede seleccionar las líneas que desea sangrar y sangrarlas todas a la vez.
En este caso, es mejor hacerlo todo de una vez, porque los espacios en blanco sangrados son importantes en Python. Si accidentalmente agregara tres espacios, o cinco, a una línea, el código no se ejecutaría correctamente. Además, dado que el código tiene varias líneas e incluye secciones sangradas para bucles y condiciones, es probable que agregar la indentación manualmente genere errores.
- En IDLE, en la ventana clip_zip_tool.py, haga clic y arrastre para seleccionar el código que ha pegado y que aún no tiene una sangría de cuatro espacios para que coincida con el contenido del bloque de código.
La línea # Workspace and datasets puede o no tener sangría, dependiendo de si los espacios antes del comentario """Script code goes below""" se seleccionaron al pegar el código.
Asegúrese de detener la selección antes de la línea return.
- Haga clic en Formato y luego en Sangrar región.
Las líneas de código se sangrarán cuatro espacios más.
- Compruebe que el bloque de código de función ClipZip, las líneas posteriores a la línea def ClipZip y hasta la línea return inclusive tienen una sangría de cuatro espacios (o más, para líneas en bucles o declaraciones condicionales).
- En IDLE, haga clic en Archivo y luego en Guardar.
Eliminar valores codificados
Varias de las líneas de la secuencia de comandos original establecen variables en rutas específicas, lo que se conoce como codificación rígida de rutas. Esto era necesario para que la secuencia de comandos pudiera localizar y procesar los datos. Sin embargo, en una herramienta de secuencias de comandos, el usuario de la herramienta especifica las entradas y salidas utilizando los controles de la interfaz de usuario de la herramienta. Ha configurado el script para que utilice arcpy.GetParameter y arcpy.GetParameterAsText para obtener esta información de la interfaz de usuario de la herramienta. El siguiente paso es eliminar las líneas codificadas.
- Elimine cada una de las líneas que especifican una ruta codificada.
Son las líneas que empiezan por arcpy.env.workspace = , clip_fc = , gdb = y out_zip =
- Elimine la línea arcpy.env.overwriteOutput = True.
No hay necesidad de mantener esta línea porque la propiedad overwriteOutput se controla mediante ArcGIS Pro cuando el código se ejecuta como una herramienta de secuencia de comandos.
- Mantenga la línea de código que asigna valores a las variables gdb_path y new_gdb dividiendo el valor de la variable gdb.
- Compruebe que la línea tiene una sangría de cuatro espacios, el mismo nivel que el comentario # Workspace and datasets.
Acaba de eliminar todas las líneas de código con valores codificados. La secuencia de comandos obtendrá los valores de los parámetros de la herramienta de secuencia de comandos.
- Guarde el script.
Cambiar las declaraciones print por mensajes
La secuencia de comandos original utilizaba declaraciones print para imprimir el estado en la ventana Shell IDLE. Esto solo funciona cuando la secuencia de comandos se ejecuta desde el editor de secuencias de comandos. Editará las declaraciones print para utilizar arcpy.AddMessage para enviar esta información a los mensajes de geoprocesamiento.
Hay tres declaraciones print. Cambiará dos de ellas y borrará la restante.
- Edite la línea print(f"Output geodatabase {gdb} created") para cambiar print por arcpy.AddMessage.
La línea debería tener este aspecto:
arcpy.AddMessage(f"Output geodatabase {gdb} created")
La siguiente declaración print del código imprime la lista de clases de entidades de entrada. La lista de clases de entidad variables inputs se establece ahora mediante la herramienta de secuencias de comandos, por lo que la línea de ajuste de entradas mediante arcpy.ListFeatureClasses no es necesaria. Borrará esta declaración print y la línea que crea la lista.
- En la sección # Clip each input feature class, seleccione la línea inputs = arcpy.ListFeatureClasses() y la línea print(inputs) y elimínelas.
La sección debe tener este aspecto:
A continuación, editará la tercera declaración print.
- Edite la línea print(f"Output feature class {new_fc} created") para cambiar print por arcpy.AddMessage.
La línea debe indicar lo siguiente:
arcpy.AddMessage(f"Output feature class {new_fc} created")
- En IDLE, haga clic en Archivo y luego en Guardar.
La sección final del código que crea el archivo ZIP no requiere ningún cambio.
- Cierre IDLE.
Probar la herramienta de secuencias de comandos
La herramienta de secuencias de comandos ya está lista para ser probada.
- En ArcGIS Pro, en el panel Catálogo, expanda la geodatabase DC.gdb.
- Haga clic con el botón derecho en bike_routes y seleccione Agregar al mapa actual.
- Expanda la caja de herramientas Clip_and_ZIP.atbx y haga doble clic en la herramienta Recortar y comprimir.
Se abre la herramienta Recortar y comprimir.
- En el parámetro Capas de entidades de entrada, haga clic en el botón de flecha Agregar muchos.
- En el cuadro Agregar muchos, seleccione bike_racks, bike_routes y bus_lines y haga clic en Agregar.
- En el parámetro Polígonos de recorte, seleccione la capa neighborhood.
- En el parámetro Geodatabase de salida, escriba C:\Tutorials\PythonTool\Clip.gdb
- En el parámetro Archivo ZIP de salida, escriba C:\Tutorials\PythonTool\Clip.zip
- Haga clic en Ejecutar.
La herramienta se ejecutará. Cuando termine, la parte inferior de la herramienta mostrará un banner verde que indica que ha terminado.
- En el banner, haga clic en Ver detalles.
La sección Mensajes de la herramienta muestra los mensajes generados por la herramienta, con el código modificado de declaraciones print a arcpy.AddMessage.
- Cierre la ventana Detalles.
- Haga clic en la pestaña Catálogo.
La geodatabase Clip.gdb se agregó a la carpeta del proyecto.
El archivo zip no aparece en el panel Catálogo, no obstante, puede utilizar Windows File Explorer para verificar que se ha creado.
Ha creado una herramienta de secuencias de comandos Python operativa. La herramienta dispone de parámetros de entrada y salida, así como de algunos filtros básicos para estos parámetros con el fin de evitar algunos problemas comunes.
En la siguiente sección se muestra cómo se puede agregar más código de validación a la herramienta de secuencias de comandos para que resulte más sólida.
Mejorar la herramienta con la validación
Las herramientas de secuencias de comandos están diseñadas para procesar datos introducidos por el usuario. La validación se utiliza para garantizar que las entradas del usuario tengan sentido y no den lugar a errores. El primer paso en la validación consiste en diseñar cuidadosamente los parámetros de la herramienta. Por ejemplo, el parámetro Polígonos de recorte tiene un filtro para garantizar que solo se seleccionan clases de entidad de polígono. En esta sección, explorará otros métodos de validación.
Agregar una comprobación de clases de entidad vacías
Imaginemos un escenario en el que una de las clases de entidad de salida esté vacía. Esto ocurre cuando ninguna de las entidades de una clase de entidad de entrada se encuentra dentro de los límites del polígono de recorte. En este caso, sería conveniente proporcionar un mensaje que indique que la salida está vacía.
- En el panel Catálogo, haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
- Haga clic en la pestaña Ejecución.
- En la sección # Clip each input feature class, seleccione la línea arcpy.AddMessage(f"Output feature class {new_fc} created").
- Sustituya la línea por el código siguiente:
count = int(arcpy.management.GetCount(new_fc)[0]) if count > 0: arcpy.AddMessage(f"Output feature class {new_fc} created") else: arcpy.AddWarning(f"Output feature class {new_fc} created but does not contain any features.")
- Compruebe que la sangría de su código coincide con esta imagen:
El nuevo código comienza con la línea count = int(arcpy.management.GetCount(new_fc)[0]) que obtiene el número de entidades de la clase de entidad de salida. Se debe aplicar a esta línea el mismo nivel de sangría que a la línea anterior, que empieza por arcpy.analysis.Clip.
La siguiente línea utiliza una declaración if condicional para determinar si la nueva clase de entidad contiene entidades. En caso afirmativo, el bloque condicional se ejecuta y agrega el mensaje original. De lo contrario, se ejecuta el bloque else y se utiliza arcpy.AddWarning para agregar un mensaje de advertencia en el que se indica que la clase de entidad se ha creado pero está vacía. Las dos líneas condicionales, después de if y de else, deben presentar una sangría de cuatro espacios, en relación con las líneas anteriores.
- Haga clic en Aceptar para cerrar la ventana Propiedades de la herramienta y guardar los cambios.
- Haga doble clic en la herramienta Recortar y comprimir
- En el panel Capas de entidad de entrada, haga clic en Examinar y, en la geodatabase DC.gdb, haga clic en la clase de entidad points_outside y luego en Aceptar.
Esta clase de entidad contiene entidades de punto que se encuentran fuera del polígono del shapefile de las vecindades. La utilizará para probar la herramienta.
- Para la segunda de las Capas de entidad de entrada, seleccione la capa bike_routes en el mapa.
- En el parámetro Polígonos de recorte, seleccione la capa de entidad neighborhood.
- En el parámetro Geodatabase de salida, introduzca esta ruta: C:\Tutorials\PythonTool\Clip_empty.gdb.
- En al parámetro Archivo ZIP de salida, introduzca esta ruta: C:\Tutorials\PythonTool\Clip_empty.zip.
- Haga clic en Ejecutar.
Se ejecuta la herramienta. Cuando termine, la parte inferior de la herramienta mostrará un banner amarillo que indica que ha terminado, pero con advertencias.
- En el banner, haga clic en Ver detalles.
La sección Mensajes de la herramienta muestra los mensajes generados por el código actualizado. Un mensaje de advertencia indica que la clase de entidad points_outside se ha creado, pero no contiene ninguna entidad.
Los demás mensajes de la herramienta también están presentes, como era de esperar.
- Cierre los mensajes de Recortar y comprimir y cierre la herramienta Recortar y comprimir.
Este tipo de validación se produce después de que la herramienta se haya ejecutado y se hayan creado los resultados. Otra posibilidad es utilizar la validación antes de ejecutar la herramienta.
Utilizar la validación para comprobar si la entrada está vacía
Supongamos un escenario en el que los polígonos de recorte seleccionados por un usuario consisten en una clase de entidad vacía. Esto no causará ningún error, ya que las entradas son válidas. Sin embargo, los resultados no serán significativos, ya que todas las clases de entidad recién creadas estarán vacías. Si hay una forma de saber de antemano que los resultados no van a ser significativos, lo ideal es que la herramienta no se ejecute.
Modificará las propiedades de la herramienta de secuencia de comandos y agregará una comprobación de entrada vacía. Este tipo de validación no se agrega al archivo de secuencias de comandos, sino que utiliza un tipo de validación diferente.
- En el panel Catálogo, haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
- Haga clic en la pestaña Validación.
La pestaña Validación muestra una casilla de código, pero no es un archivo de secuencia de comandos. El código aquí solo reside en las propiedades de la herramienta y no se almacena como un archivo .py independiente. La pestaña Validación contiene código de plantilla que puede utilizar como punto de partida.
El código de plantilla muestra una clase denominada ToolValidator. La clase incluye varios métodos que se utilizan para distintos tipos de validación. La mayor parte de esta validación se lleva a cabo antes de ejecutar la herramienta.
Puede modificar el código directamente en el cuadro de código o puede abrir el código como un archivo de secuencia de comandos temporal haciendo clic en Abrir en Editor de secuencias de comandos.
- Haga clic en Abrir en Editor de secuencias de comandos.
- En la sección def updateMessages, seleccione las dos líneas de comentario.
- Seleccione las tres líneas del bloque de código def updateMessages.
- Sustituya los comentarios y la declaración return copiando y pegando el siguiente código:
# When the clip polgyon feature set, feature layer or # feature class does not contain any features, a warning # message appears in the tool dialog since this would result # in empty feature classes in the new geodatabase. if self.params[1].value: count = int(arcpy.management.GetCount(self.params[1].value)[0]) if count < 1: self.params[1].setWarningMessage("No clip features. This results in empty outputs.") return
El código se pega en la definición del método. Sin embargo, hay un problema. La primera línea de comentarios está correctamente sangrada, pero las líneas siguientes deben sangrarse cuatro espacios más.
- Seleccione las líneas que deben sangrarse.
- Haga clic en Formato y luego en Sangrar región.
- Compruebe que la sangría es ahora correcta.
- En IDLE, haga clic en Archivo y luego en Guardar.
- Cierre IDLE.
En ArcGIS Pro, se muestra una advertencia que indica que se han realizado cambios.
- Haga clic en Sí.
- Haga clic en Aceptar para cerrar la ventana de propiedades de la herramienta.
- Haga doble clic en la herramienta Recortar y comprimir.
- En Capas de entidad de entrada, agregue las capas bike_racks y bike_routes.
- En el parámetro Polígonos de recorte, haga clic en Examinar y, en la geodatabase DC.gdb, haga clic en la clase de entidad polygon_empty y luego en Aceptar.
La clase de entidad polygon_empty es una clase de entidad de polígono que no contiene ninguna entidad.
Aparece un icono junto a la casilla de entrada Polígonos de recorte.
- Apunte al icono de advertencia.
El código de validación de la herramienta que ha agregado detecta que la clase de entidad de polígono está vacía y genera un mensaje de advertencia.
Un mensaje de advertencia significa que el usuario puede seguir ejecutando la herramienta, pero sabe de antemano cuáles serán los resultados. Por el contrario, si utiliza setErrorMessage en lugar de setWarningMessage, se muestra un mensaje de error, que evitará la ejecución de la herramienta. Al diseñar la herramienta, es necesario analizar detenidamente qué tipo de mensaje es el más significativo.
Nota:
El código de validación utilizado aquí incluye la herramienta Obtener recuento. Esta herramienta se ejecuta cuando se ha seleccionado un valor para el parámetro. Por lo general, no conviene utilizar herramientas de geoprocesamiento en el código de validación, ya que puede llevar mucho tiempo y dar lugar a problemas imprevistos. La herramienta Obtener recuento es una excepción, porque es una herramienta muy sencilla que se ejecuta rápidamente, incluso para datasets muy grandes.
Agregar valores predeterminados
Otro tipo de validación de herramientas consiste en rellenar los parámetros de las herramientas con valores predeterminados. Esta técnica se utiliza en muchas herramientas de geoprocesamiento. Por ejemplo, cuando se ejecuta la herramienta Recortar, el nombre de la clase de la clase de entidad de salida es, de forma predeterminada, el nombre de la clase de entidad de entrada seguido de _Recortar. En el caso de la herramienta Recortar y comprimir, no existen valores predeterminados para los parámetros Geodatabase de salida y Archivo ZIP de salida. Puede agregar estos valores predeterminados al código de validación.
- Cierre la herramienta Recortar y comprimir.
- Abra la ventana Propiedades de la herramienta y haga clic en la pestaña Validación.
- Haga clic en Abrir en Editor de secuencias de comandos.
- En IDLE, seleccione las tres líneas del bloque de código def updateParameters.
- Reemplace las líneas por el siguiente código:
# The output geodatabase and ZIP archive are given default # names of Clip.gdb and Clip.zip, respectively, inside the # workspace of the project. Users can specify a different # file name and folder. if self.params[0].value and self.params[1].value: folder = os.path.split(arcpy.env.workspace)[0] self.params[2].value = os.path.join(folder, "Clip.gdb") self.params[3].value = os.path.join(folder, "Clip.zip") return
- Examine el código que ha pegado.
La primera línea está correctamente sangrada, pero las demás deben sangrarse cuatro espacios más.
- Seleccione las líneas que deben sangrarse y, a continuación, haga clic en Formato y luego en Sangrar región.
Se ha solucionado el problema de sangría.
- En IDLE, haga clic en Archivo y luego en Guardar.
- Cierre IDLE.
- En ArcGIS Pro, en el mensaje de advertencia, haga clic en Sí.
- Haga clic en Aceptar para cerrar la ventana de propiedades de la herramienta.
- Haga doble clic en la herramienta Recortar y comprimir.
- En Capas de entidad de entrada, agregue las capas bike_racks y bike_routes.
- En el parámetro Polígonos de recorte, seleccione la capa neighborhood.
En cuanto se ha especificado un valor para los dos primeros parámetros, el tercero y el cuarto se rellenan con los valores predeterminados correspondientes. Aparece un mensaje de advertencia, porque los archivos Clip.gdb y Clip.zip ya existen.
Puede ejecutar la herramienta con estas advertencias, o bien cambiar los nombres de salida y ejecutar la herramienta.
En este tutorial, ha aprendido a crear una herramienta de secuencia de comandos que proporciona una interfaz fácil de usar para el código Python. Ha aprendido a configurar parámetros para la herramienta de secuencia de comandos, y cómo editar el código para que acepte parámetros de la herramienta de secuencia de comandos. También ha aprendido a eliminar rutas codificadas y a agregar mensajes de retorno de código. Por último, ha aprendido a agregar validación al código para que sea más sólido.