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.

  1. 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.

  2. 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.

  3. 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.

  4. En ArcGIS Pro, haga clic en Abrir otro proyecto.

    Haga clic en Abrir otro proyecto.

  5. En la ventana Abrir proyecto, vaya a la carpeta PythonTool, haga clic en Python Tool.aprx y luego en Aceptar.

    Abra el proyecto PythonTool.

    Se abrirá el proyecto.

    Se abre el mapa del área de DC.

    El mapa muestra varias clases de entidades del área de Washington, D.C.

  6. Si el panel Catálogo no está visible, en la cinta, en la pestaña Vista, haga clic en Panel Catálogo.
  7. En el panel Catálogo, expanda Carpetas y PythonTool.
  8. Expanda la geodatabase DC.gdb.

    Expanda Carpetas, la carpeta PythonTool y 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.

  1. En File Explorer, vaya a la carpeta C:\Tutorials\PythonTool.
  2. 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).

    Haga clic con el botón derecho en la secuencia de comandos 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.

    La secuencia de comandos se abre en IDLE.

    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.

  3. 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.

  4. 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.

  5. En IDLE, haga clic en Archivo y en Guardar para guardar los cambios realizados en la secuencia de comandos.

    Guarde el script.

  6. En IDLE, haga clic en Ejecutar y en Ejecutar módulo para ejecutar la secuencia de comandos.

    Ejecute la secuencia de comandos en IDLE.

    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.

    Ventana de shell IDLE en la que se muestran los mensajes de salida.

    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.

  7. 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.

    Refresque la carpeta PythonTool en el panel Catálogo.

  8. En el panel Catálogo, en la carpeta PythonTool, verifique que la geodatabase Clip.gdb se ha creado.

    La geodatabase Clip.gdb se ha creado.

  9. Expanda la geodatabase Clip.gdb.

    Se crearon las clases de entidades recortadas.

  10. En la geodatabase Clip.gdb, haga clic con el botón derecho en bike_racks y luego haga clic en Agregar al mapa actual.

    Agregue la clase de entidad bike_racks al mapa actual.

    La nueva capa bike_racks recortada se agrega al mapa.

    La capa bike_racks recortada se agrega al mapa.

  11. En File Explorer, vaya a la carpeta C:\Tutorials\PythonTool.

    El archivo Clip.zip se agrega a la carpeta.

    El archivo comprimido 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.

  1. 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).

    Cree una caja de herramientas.

    Se crea la caja de herramientas.

    Se crea la caja de herramientas.

  2. Escriba Recortar_y_comprimir como nombre de la caja de herramientas y pulse Intro.

    Escriba Recortar_y_comprimir.

    El nombre de la herramienta es Recortar_y_comprimir.

    Se asigna el nombre a la caja de herramientas.

    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.

  3. 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.

    Cree la herramienta de secuencia de comandos en la caja de herramientas.

    Aparece la ventana Nueva 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.

  4. 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.

  5. 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.

  6. 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.

    Información agregada a la ventana Nueva secuencia de comandos

  7. Haga clic en Aceptar.

    La herramienta de secuencias de comandos se crea con las propiedades generales que ha introducido.

  8. En el panel Catálogo, en la caja de herramientas Recortar_y_comprimir, haga doble clic en la herramienta Recortar y comprimir.

    Abra 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.

    Interfaz de usuario de la herramienta de secuencias de comandos Recortar y comprimir sin parámetros

  9. 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.

  1. Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.

    Examine las propiedades de la herramienta.

    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.

  2. Haga clic en la pestaña Parámetros.

    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.

    Pestaña Parámetros de la herramienta con una tabla vacía.

    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.

  1. En la columna Etiqueta, escriba Capas de entidades de entrada y pulse Intro.

    Escriba la etiqueta del parámetro.

    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.

  2. En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.

    Haga clic en el botón para cambiar el tipo de datos del parámetro.

    Aparece la ventana Tipo de datos del parámetro.

    Aparece la ventana Tipo de datos del parámetro.

    El valor predeterminado es Cadena de caracteres, pero lo cambiará a Capa de entidades.

  3. 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.

    Seleccione Capa de entidades como tipo de datos.

    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.

  4. Seleccione Varios valores.

    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.

  5. Haga clic en Aceptar para cerrar la ventana Tipo de datos del parámetro.

    Se configura el parámetro de entrada de la capa de entidades.

  6. 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.

  7. 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.

  8. En la ventana Propiedades de la herramienta: Recortar y comprimir, haga clic en Aceptar.
  9. 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.

    Panel de la herramienta Recortar y comprimir con el primer parámetro configurado

    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.

    Mensaje de error si intenta ejecutar la herramienta ahora

  10. Cierre la herramienta.

Agregar el parámetro Polígonos de recorte

A continuación, configurará el parámetro para los polígonos de recorte.

  1. Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
  2. 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.

    La fila del parámetro Polígonos de recorte está parcialmente cumplimentada.

    El nombre del parámetro se actualiza a Recortar_Polígonos.

  3. En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
  4. En Tipo de datos, haga clic en la lista desplegable y seleccione Conjunto de entidades.

    Establezca el tipo de datos en 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.

  5. Haga clic en Aceptar para cerrar la ventana Tipo de datos del parámetro.
  6. En Tipo, acepte el valor predeterminado Requerido.
  7. 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.

  8. Desplácese hacia la derecha y haga clic en la columna Filtro.

    Haga clic en la columna Filtro.

  9. Haga clic en la lista desplegable Filtro y seleccione Tipo de entidad.

    Seleccione Tipo de entidad.

    Aparece la ventana Filtro de tipo de entidad.

  10. Seleccione Polígono.

    Seleccione Polígono en Filtro de tipo de entidad.

    Ahora, cuando alguien ejecuta la herramienta, solo se pueden utilizar polígonos para la geometría de recorte de entrada.

  11. 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.

  1. 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.
  2. En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
  3. En Tipo de datos, haga clic en la lista desplegable, seleccione Espacio de trabajo y haga clic en Aceptar.

    Establezca el tipo de datos del parámetro Geodatabase de salida en Espacio de trabajo.

  4. En Tipo, acepte el valor predeterminado Requerido.
  5. Haga clic en la columna Dirección y, en la lista desplegable, seleccione Salida.

    Establezca Dirección en 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.

  6. Haga clic en la columna Filtro.
  7. Haga clic en la lista desplegable Filtro y seleccione Espacio de trabajo.

    Establezca Filtro en Espacio de trabajo.

  8. En la ventana Filtro de espacio de trabajo, seleccione Base de datos local.

    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.

  9. 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.

  1. 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.
  2. En la columna Tipo de datos, haga clic en el botón Cambiar tipo de datos.
  3. En Tipo de datos, haga clic en la lista desplegable, seleccione Archivo y haga clic en Aceptar.

    Establezca Tipo de datos en Archivo.

    Un archivo zip es un archivo, por lo que es el tipo de datos correcto.

  4. Haga clic en la columna Dirección y, en la lista desplegable, seleccione Salida.
  5. Haga clic en la lista desplegable Filtro y seleccione Archivo.

    Establezca Filtro en Archivo.

  6. En la ventana Filtro de archivo, en el cuadro Extensiones, escriba zip.

    Tipo 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.

  7. Haga clic en Aceptar.

    Ha agregado todos los parámetros de la herramienta.

    Se han agregado todos los parámetros.

  8. 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.

  1. 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; se han agregado todos los parámetros a la herramienta.

    Se abre la herramienta Recortar y comprimir. Todos los parámetros configurados en los pasos anteriores aparecen ahora en el panel de herramientas.

  2. 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.

    Herramienta con la capa bike_racks agregada

  3. 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.

    Localice la clase de entidad bike_routes en la geodatabase DC.gdb.

    La clase de entidad bike_routes no se encontraba en el mapa, pero la agregó en la herramienta Recortar_y_comprimir.

    La clase de entidad bike_routes se agrega a la herramienta.

    Esto confirma que un usuario puede seleccionar varias entradas, incluyendo capas de entidades del mapa activo y clases de entidad del disco.

  4. Haga clic en la herramienta de boceto Polígonos de recorte.

    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.

  5. En el cuadro Output geodatabase, escriba C:\Tutorials\PythonTool\Clip y haga clic en el cuadro de texto Archivo ZIP de salida.

    La ruta a una carpeta recibe un marcador de error.

    Al introducir la ruta de una carpeta se activa un icono de alerta de error en el parámetro Geodatabase de salida.

  6. Apunte al icono de alerta de error.

    El mensaje de error indica que se trata de un tipo de espacio de trabajo incorrecto.

    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.

  7. 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.

    Se aagrega el sufijo zip.

  8. 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.

  9. Apunte al icono de alerta de error.

    El mensaje de error muestra que la entrada es un tipo de archivo incorrecto.

    Si apunta al icono, aparece un mensaje de error que indica que se trata de un tipo de archivo incorrecto.

  10. 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.

  1. Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
  2. Haga clic en la pestaña Ejecución.

    Haga clic en la pestaña Ejecución para ver la plantilla de código Python de la herramienta.

    La pestaña muestra la plantilla de código Python para una herramienta de secuencia de comandos.

    Plantilla de código Python.

    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.

  3. 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í:

    Cambie el nombre de la función.

    Debe tener este aspecto:

    Se ha agregado el nuevo nombre de función.

    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.

  4. En el cuadro de código, edite la línea script_tool(param0, param1) para que sea ClipZip(param0, param1)

    Edite el nombre donde se llama a la función.

    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.

  5. En la pestaña Ejecución, debajo el cuadro de código, haga clic en Aceptar.

    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.

  6. Haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
  7. En la parte inferior del cuadro de código, haga clic en el botón Abrir en Editor de secuencias de comandos.

    Haga clic en 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.

    Archivo de secuencias de comandos temporal 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.

  8. En IDLE, agregue una nueva línea de código debajo de import arcpy y agregue el código siguiente:

    import os
    import zipfile

    Las dos líneas de importación se agregan a la secuencia de comandos temporal.

    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.

  9. En IDLE, haga clic en Archivo y luego en Guardar.

    Guarde la secuencia de comandos Python temporal.

  10. Cierre IDLE.

    El código agregado en IDLE se encuentra ahora en el cuadro de código.

    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.

  1. 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.

    Exportar a secuencia de comandos.

  2. En la ventana Exportar secuencia de comandos, verifique que la ubicación es la carpeta PythonTool y, en Nombre, escriba clip_zip_tool.py.

    Asigne un nombre al archivo .py de salida.

    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.

  3. 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 ruta del archivo de secuencia de comandos .py aparece en la parte superior del cuadro de código.

    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.

  4. 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.

    La secuencia de comandos 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.

  5. En la ventana Propiedades, haga clic en Aceptar.

    Cierre la ventana Propiedades.

    A continuación, cambiará el código para que coincida con los parámetros de la herramienta de secuencias de comandos.

  6. 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)

    Parámetros de la plantilla predeterminada

    El código actualizado debe tener este aspecto:

    Parámetros actualizados

    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.

  7. 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)

    Actualiza los parámetros en la línea que llama a la función ClipZip.

    El cambio debe tener el aspecto siguiente:

    Parámetros actualizados.

    Esta línea llama a la función ClipZip() con esos parámetros.

  8. Elimine la línea arcpy.SetParameterAsText(2, "Result").

    Elimine la línea SetParameterAsText de la plantilla.

    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().

  9. 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):

    Actualice la línea def ClipZip.

    El cambio debe tener el aspecto siguiente:

    Definición de la función actualizada a los nuevos parámetros.

    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).

  10. 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:

    Progreso de la secuencia de scripts hasta el momento

    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.

  1. En IDLE, haga clic en Archivo y luego en Abrir.

    Abra un archivo desde IDLE.

  2. En la carpeta C:\Tutorials\PythonTool, haga clic en clip_zip.py y luego en Abrir.

    Abra el archivo clip_zip.py.

  3. 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 y arrastre para seleccionar la mayor parte de la secuencia de comandos.

  4. Haga clic con el botón derecho en el código seleccionado y luego haga clic en Copiar.

    Copie el código.

  5. En IDLE, cambie a la ventana clip_zip_tool.py.
  6. Seleccione el comentario """Script code goes below""".

    Seleccione el comentario.

  7. Haga clic con el botón derecho en el código seleccionado y luego haga clic en Pegar.

    Pegue el código de la secuencia de comandos original en el bloque de código.

    El código se pega en el bloque de código de la función ClipZip.

    El código se pega en el bloque de código para la definición de la función.

    Ha terminado con la secuencia de comandos original. Ahora puede cerrar dicha ventana y centrarse en el código clip_zip_tool.py.

  8. 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.

  9. 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.

    Seleccione las líneas que debe sangrar.

  10. Haga clic en Formato y luego en Sangrar región.

    Aplique sangría a la región seleccionada.

    Las líneas de código se sangrarán cuatro espacios más.

    Ahora el bloque de código está sangrado.

  11. 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).
  12. 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.

  1. 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 las líneas que codifican las rutas.

  2. 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.

  3. 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.

    Mantener la línea que divide la ruta gdb

  4. 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.

  5. 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.

  1. 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")

    Edite la línea para usar arcpy.AddMessage en lugar de print.

    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.

  2. 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.

    Seleccione las dos líneas.

    La sección debe tener este aspecto:

    Una vez eliminadas las líneas, el código queda así.

    A continuación, editará la tercera declaración print.

  3. 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")

    La tercera declaración print convertida para usar arcpy.AddMessage.

  4. 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.

  5. Cierre IDLE.

Probar la herramienta de secuencias de comandos

La herramienta de secuencias de comandos ya está lista para ser probada.

  1. En ArcGIS Pro, en el panel Catálogo, expanda la geodatabase DC.gdb.

    Expanda la geodatabase DC.

  2. Haga clic con el botón derecho en bike_routes y seleccione Agregar al mapa actual.
  3. 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.

    La herramienta Recortar y comprimir está lista para las pruebas.

  4. En el parámetro Capas de entidades de entrada, haga clic en el botón de flecha Agregar muchos.

    Botón Agregar muchos

  5. En el cuadro Agregar muchos, seleccione bike_racks, bike_routes y bus_lines y haga clic en Agregar.

    Agregue varias capas de entidades de entrada.

  6. En el parámetro Polígonos de recorte, seleccione la capa neighborhood.
  7. En el parámetro Geodatabase de salida, escriba C:\Tutorials\PythonTool\Clip.gdb
  8. En el parámetro Archivo ZIP de salida, escriba C:\Tutorials\PythonTool\Clip.zip

    La herramienta está lista para la prueba.

  9. 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.

  10. En el banner, haga clic en Ver detalles.

    Observe los 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.

  11. Cierre la ventana Detalles.
  12. Haga clic en la pestaña Catálogo.

    La geodatabase Clip.gdb se agregó a la carpeta del proyecto.

    Se agregó Clip.gdb.

    El archivo zip no aparece en el panel Catálogo, no obstante, puede utilizar Windows File Explorer para verificar que se ha creado.

    Archivo Clip.zip en el Explorador de archivos de Windows

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.

  1. En el panel Catálogo, haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
  2. Haga clic en la pestaña Ejecución.
  3. En la sección # Clip each input feature class, seleccione la línea arcpy.AddMessage(f"Output feature class {new_fc} created").

    Seleccione esta línea.

  4. 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.")

  5. Compruebe que la sangría de su código coincide con esta imagen:

    Compruebe la sangría.

    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.

  6. Haga clic en Aceptar para cerrar la ventana Propiedades de la herramienta y guardar los cambios.
  7. Haga doble clic en la herramienta Recortar y comprimir
  8. 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.

    La clase de entidad points_outside se selecciona para agregarla a la entrada de la herramienta.

    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.

  9. Para la segunda de las Capas de entidad de entrada, seleccione la capa bike_routes en el mapa.
  10. En el parámetro Polígonos de recorte, seleccione la capa de entidad neighborhood.
  11. En el parámetro Geodatabase de salida, introduzca esta ruta: C:\Tutorials\PythonTool\Clip_empty.gdb.
  12. En al parámetro Archivo ZIP de salida, introduzca esta ruta: C:\Tutorials\PythonTool\Clip_empty.zip.
  13. 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.

  14. En el banner, haga clic en Ver detalles.

    Consulte las advertencias.

    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.

    Mensajes de advertencia de la herramienta.

    Los demás mensajes de la herramienta también están presentes, como era de esperar.

  15. 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.

  1. En el panel Catálogo, haga clic con el botón derecho en la herramienta Recortar y comprimir y seleccione Propiedades.
  2. Haga clic en la pestaña Validación.

    Vaya a 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.

    Código de plantilla ToolValidator

    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.

  3. Haga clic en Abrir en Editor de secuencias de comandos.

    Abra el editor de secuencias de comandos IDLE.

  4. En la sección def updateMessages, seleccione las dos líneas de comentario.
  5. Seleccione las tres líneas del bloque de código def updateMessages.

    Se seleccionan los dos comentarios y la línea de retorno.

  6. 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

    Pegue el código.

    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.

    Observe que parte del código pegado no tiene la sangría correcta.

  7. Seleccione las líneas que deben sangrarse.

    Seleccione las líneas que deben sangrarse.

  8. Haga clic en Formato y luego en Sangrar región.
  9. Compruebe que la sangría es ahora correcta.

    Compruebe que la sangría es correcta.

  10. En IDLE, haga clic en Archivo y luego en Guardar.
  11. Cierre IDLE.

    En ArcGIS Pro, se muestra una advertencia que indica que se han realizado cambios.

  12. Haga clic en .
  13. Haga clic en Aceptar para cerrar la ventana de propiedades de la herramienta.
  14. Haga doble clic en la herramienta Recortar y comprimir.
  15. En Capas de entidad de entrada, agregue las capas bike_racks y bike_routes.
  16. 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.

    Seleccione la clase de entidad polygon_empty.

    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.

  17. Apunte al icono de advertencia.

    Apunte al icono de advertencia para ver el mensaje.

    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.

  1. Cierre la herramienta Recortar y comprimir.
  2. Abra la ventana Propiedades de la herramienta y haga clic en la pestaña Validación.
  3. Haga clic en Abrir en Editor de secuencias de comandos.
  4. En IDLE, seleccione las tres líneas del bloque de código def updateParameters.

    Seleccione las líneas del bloque de código def updateParameters.

  5. 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

  6. Examine el código que ha pegado.

    La primera línea está correctamente sangrada, pero las demás deben sangrarse cuatro espacios más.

    Observe en el problema de sangría.

  7. Seleccione las líneas que deben sangrarse y, a continuación, haga clic en Formato y luego en Sangrar región.

    Aplique sangría a la región seleccionada.

    Se ha solucionado el problema de sangría.

    Problema de sangría resuelto.

  8. En IDLE, haga clic en Archivo y luego en Guardar.
  9. Cierre IDLE.
  10. En ArcGIS Pro, en el mensaje de advertencia, haga clic en .
  11. Haga clic en Aceptar para cerrar la ventana de propiedades de la herramienta.
  12. Haga doble clic en la herramienta Recortar y comprimir.
  13. En Capas de entidad de entrada, agregue las capas bike_racks y bike_routes.
  14. 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.

    Herramienta con los nombres de salida predeterminados rellenados.

    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.