Actualizar el esquema en una caja de herramientas Python

Cada parámetro de salida de tipo clase de entidad, tabla, ráster o espacio de trabajo tiene un objeto de esquema. Sólo las clases de entidad de salida, las tablas, los rásteres y los espacios de trabajo tienen esquema; otros tipos, no. El objeto de esquema se crea mediante el geoprocesamiento. Accede a este esquema por medio del objeto de parámetro y configura las reglas para describir la salida de su herramienta. Después de establecer las reglas del esquema, el código de validación interna de geoprocesamiento examina las reglas que establece y actualiza la descripción de la salida.

A modo de revisión, el flujo de control es el siguiente:

  1. Cuando el cuadro de diálogo de la herramienta se abre por primera vez, se invoca getParameterInfo. Usted configura las reglas estáticas (reglas que no cambian según la entrada del usuario) para describir la salida. No se genera ninguna descripción de salida en este momento, dado que el usuario no tiene valores especificados para ninguno de los parámetros (a menos que haya proporcionado valores predeterminados).
  2. Una vez que el usuario interactúa con el cuadro de diálogo de la herramienta de algún modo, se invoca updateParameters.
  3. updateParameters puede modificar el objeto de esquema para justificar el comportamiento dinámico que no puede determinarse desde las dependencias del parámetro (como agregar un campo nuevo con Agregar campo).
  4. Después de regresar de updateParameters, se invocan las rutinas de validación internas y se aplican las reglas que se encuentran en el objeto de esquema para actualizar la descripción de los datos de salida.
  5. Entonces se invoca updateMessages. Puede examinar los mensajes de advertencia y de error que la validación interna puede haber creado y modificarlos o agregar mensajes de advertencias y errores propios.

Todas las propiedades del Esquema se leen y escriben a excepción del tipo, que es sólo lectura.

Nombre de propiedades

Valores

type

Cadena de caracteres: "Feature", "Table", "Raster", "Container" (para espacios de trabajo y datasets de entidad) (Propiedad de solo lectura)

clon

Booleano

featureTypeRule

Cadena de caracteres: "AsSpecified", "FirstDependency"

featureType

Cadena de caracteres: "Simple", "Annotation", "Dimension"

geometryTypeRule

Cadena de caracteres: "Unknown", "FirstDependency", "Min", "Max", "AsSpecified"

geometryType

Cadena de caracteres: "Point", "Multipoint", "Polyline", "Polygon"

extentRule

Cadena de caracteres: "AsSpecified", "FirstDependency", "Intersection", "Union", "Environment"

extent

Objeto de extensión

fieldsRule

Cadena de caracteres: "None", "FirstDependency", "FirstDependencyFIDs", "All", "AllNoFIDs", "AllFIDsOnly"

additionalFields

Lista de Python de objetos de campo

cellSizeRule

Cadena de caracteres: "AsSpecified", "FirstDependency", "Min", "Max", "Environment"

cellsize

Doble

rasterRule

Cadena de caracteres: "FirstDependency", "Min", "Max", "Integer", "Float"

rasterFormatRule

Cadena de caracteres: "Img", "Grid"

additionalChildren

Lista de Python de datasets para agregar un esquema de espacio de trabajo

Propiedades del objeto del esquema

Uso de FirstDependency

Se pueden establecer varias reglas en "FirstDependency", lo que significa utilizar el valor del primer parámetro que se encuentra en el conjunto de dependencia del parámetro establecido en parameter.parameterDependencies. En el ejemplo de código a continuación, el parámetro 2 tiene dos parámetros dependientes, 0 y 1 y la primera dependencia es el parámetro 0.

# Set the dependencies for the output and its schema properties
#
parameters[2].parameterDependencies = [parameters[0].name, parameters[1].name]

Si todo parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

type

La propiedad tipo es sólo de lectura y se establece mediante el geoprocesamiento.

clon

Si es verdadero, instruye el geoprocesamiento para realizar una copia exacta (clon) de la descripción en el primer parámetro dependiente de la lista de dependencia de parámetros en la lista de dependencia del parámetro. El valor predeterminado es falso. Por lo general, establece clone en verdadero en el método getParameterInfo. Si el primer parámetro dependencia es un valor múltiple (una lista de valores), se clona el primer valor en la lista de valores múltiples.

Después de establecer clone en verdadero, todos los métodos basados en la regla, como featureTypeRule, geometryTypeRule y extentRule, se establecen en "FirstDependency".

Los dos ejemplos de código a continuación realizan el trabajo equivalente. Los dos ejemplos se basan en cómo la herramienta Recortar crea el esquema de salida.

Ejemplo 1: establezca todas las reglas explícitamente
class ExampleClipTool1(object):
    def __init__(self):
        self.label       = "Example Clip tool 1"
        self.description = "Explicitly setting all rules"

    def getParameterInfo(self):
        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input Features",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Clip Features",
            name="clip_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Output Feature Class",
            name="out_feature_class",
            datatype="DEFeatureClass",
            parameterType="Required",
            direction="Output")

        # Set the dependencies for the output and its schema properties
        #  The two input parameters are feature classes.
        #
        param2.parameterDependencies = [param0.name, param1.name]

        # Feature type, geometry type, and fields all come from the first 
        #  dependency (parameter 0), the input features
        #
        param2.schema.featureTypeRule = "FirstDependency"
        param2.schema.geometryTypeRule = "FirstDependency"
        param2.schema.fieldsRule = "FirstDependency"

        # The extent of the output is the intersection of the input features 
        #  and the clip features (parameter 1)
        #
        param2.schema.extentRule = "Intersection"

        params = [param0, param1, param2]

        return params
Ejemplo 2: utilizar clone para establecer las reglas en FirstDependency y, a continuación, invalidar la regla de extensión:
class ExampleClipTool2(object):
    def __init__(self):
        self.label       = "Example Clip tool 2"
        self.description = "Using clone to set rules to FirstDependency, then overriding the extent rule"

    def getParameterInfo(self):
        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input Features",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Clip Features",
            name="clip_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Output Feature Class",
            name="out_feature_class",
            datatype="DEFeatureClass",
            parameterType="Required",
            direction="Output")

        # Set the dependencies for the output and its schema properties
        #  The two input parameters are feature classes.
        #
        param2.parameterDependencies = [param0.name, param1.name]
        param2.schema.clone = True

        params = [param0, param1, param2]

        return params

    def updateParameters(self, parameters):
        # The only property of the clone that changes is that the extent 
        #  of the output is the intersection of the input features 
        #  and the clip features (parameter 1)
        #
        parameters[0].schema.extentRule = "Intersection"
        return

featureTypeRule

Esta configuración determina el tipo de entidad de la clase de entidad de salida. Esta regla no tiene efecto sobre los rásteres o las tablas de salida.

Valor

Descripción

"AsSpecified"

El tipo de entidad se determinará mediante la propiedad featureType.

"FirstDependency"

El tipo de entidad será el mismo que el primer parámetro en las dependencias. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

valores featureTypeRule

featureType

Cuando featureTypeRule es "AsSpecified", el valor en featureType se utiliza para especificar el tipo de entidad de la salida.

Valor

Descripción

"Simple"

La salida incluirá entidades simples. El tipo de geometría de las entidades se especifica con geometryTypeRule.

"Annotation"

La salida incluirá entidades de anotación.

"Dimension"

La salida incluirá entidades de dimensión.

valores featureType

geometryTypeRule

Esta configuración determina el tipo de geometría (como punto o polígono) de la clase de entidad de salida.

Valor

Descripción

"Unknown"

es la configuración predeterminada. Por lo general, debe poder determinar el tipo de geometría en updateParameters() según los valores de otros parámetros. Solo establece la regla en "Unknown" si no tiene información suficiente para determinar el tipo de geometría.

"FirstDependency"

El tipo de geometría es el mismo que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

Examina las geometrías de todos los parámetros dependientes y establece el tipo de geometría de salida en el tipo máximo o mínimo encontrado. "Min" y "Max" se definen de la manera siguiente:

  • Punto y multipunto = 0
  • Polilínea = 1
  • Polígono = 2
Por lo tanto, si los parámetros dependientes fueran una clase de entidad de punto y polígono, el mínimo sería punto y el máximo sería polígono.

"AsSpecified"

El tipo de geometría se determinará por el valor de la propiedad geometryType.

valores geometryTypeRule

geometryType

Establezca esto en el tipo de geometría a utilizar (ya sea "Point", "Multipoint", "Polyline", o "Polygon") cuando geometryTypeRule es "AsSpecified".

extentRule

Valor

Descripción

"AsSpecified"

La extensión de salida se especificará en la propiedad extensión.

"FirstDependency"

La extensión de salida es la misma que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Intersection"

La extensión de salida será la intersección geométrica de todos los parámetros dependientes. (Esto es lo que utiliza la herramienta Recortar, como se muestra a continuación).

"Union"

La extensión de salida será la combinación geométrica de todos los parámetros dependientes.

"Environment"

La extensión de salida se calculará según la configuración del entorno de la extensión de salida.

valores extentRule

Ejemplo

# The extent of the output is the intersection of the input features 
#  and the clip features (the dependent parameters)
#
parameters[2].schema.extentRule = "Intersection"

extent

Establezca esto en la extensión a utilizar cuando extentRule sea "AsSpecified". Puede establecer la extensión con una cadena de texto delimitada por espacios o un objeto de lista de Python con cuatro valores. La secuencia es xmin, ymin, xmax, ymax.

Ejemplo
parameters[2].schema.extentRule = "AsSpecified"
parameters[2].schema.extent = "123.32 435.8 987.3 567.9"

o con una lista de Python

xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
parameters[2].schema.extent = ext

fieldsRule

fieldsRule determina qué campos existirán en la clase o tabla de la entidad de salida.

En la tabla a continuación, FID representa Id. de entidad pero, en realidad, se refiere al campo ObjectID que se encuentra en cada clase o tabla de entidad.

Valor

Descripción

"None"

Ningún campo será de salida a excepción de Id. de objeto.

"FirstDependency"

Los campos de salida serán los mismos que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"FirstDependencyFIDs"

Sólo el ObjectID de la primera entrada dependiente se escribirá en la salida.

"All"

Todos los campos en la lista de parámetros dependientes serán de salida.

"AllNoFIDs"

Todos los campos excepto los ObjectID se escribirán en la salida.

"AllFIDsOnly"

Todos los campos del ObjectID se escriben en la salida pero no se escribirá ningún otro campo desde las entradas.

valores fieldsRule

additionalFields

Además de los campos que se agregan mediante la aplicación de fieldsRule, puede agregar campos adicionales a la salida. additionalFields toma una lista de Python de los objetos del campo.

cellSizeRule

Esto determina el tamaño de la celda de los rásteres o las cuadrículas de salida.

Valor

Descripción

"AsSpecified"

El tamaño de la celda de salida se especifica en la propiedad cellSize.

"FirstDependency"

El tamaño de la celda se calcula desde el primer parámetro dependiente. Si el parámetro dependiente es un ráster, entonces se utiliza su tamaño de celda. Para otros tipos de parámetros dependientes, como clases de entidad o datasets de entidad, la extensión de los datos se utiliza para calcular el tamaño de la celda. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

"Min" significa el tamaño de celda de salida más pequeño de los parámetros dependientes. "Max" significa el tamaño de celda más grande de los parámetros dependientes.

"Environment"

El tamaño de celda de salida se calcula según la configuración del entorno del tamaño de celda.

valores cellSizeRule

cellSize

Establezca esto al tamaño de celda a utilizar cuando cellSizeRule sea "AsSpecified".

rasterRule

Esto determina el tipo de datos, entero o flotante, incluido en el ráster de salida.

Valor

Descripción

"FirstDependency"

El tipo de datos (entero o flotante) es el mismo que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

Entero se considera más pequeño que flotante. Por ejemplo, si hay dos parámetros dependientes, uno contiene enteros y el otro flotantes, "Min" crea una salida de entero y "Max" crea una salida de flotante.

"Integer"

El ráster de salida contiene enteros (números completos).

"Float"

El ráster de salida contiene flotantes (números fraccionarios).

valores rasterRule

rasterFormatRule

Esto determina el formato ráster de salida, ya sea "Grid" o "Img". La opción predeterminada es "Img", que es formato de ERDAS IMAGINE. "Grid" es el formato de Esri.

Más información acerca de los formatos de datos ráster

additionalChildren

Un espacio de trabajo es un contenedor para datasets (entidades, tablas y rásteres). Estos datasets son elementos secundarios del espacio de trabajo (considere el espacio de trabajo como el elemento principal). Si la herramienta agrega datasets a un espacio de trabajo existente o nuevo, puede actualizar la descripción del espacio de trabajo al agregar descripciones de los elementos secundarios. Por ejemplo, usted puede tener una herramienta que toma una lista de clases de entidad (un valor múltiple), las modifica de algún modo y después escribe las clases de entidad modificadas en un espacio de trabajo existente. Cuando se utiliza la herramienta en ModelBuilder, el espacio de trabajo es la salida derivada de la herramienta y es posible que quiera utilizar este espacio de trabajo como entrada a la herramienta Seleccionar datos. Seleccionar datos le permite seleccionar un dataset de elemento secundario que se encuentra en un contenedor y usarlo como entrada para otra herramienta.

La entrada a additionalChildren es una descripción o más de los elementos secundarios. Existen dos formas de descripciones de los elementos secundarios:

Forma

Descripción

objeto de valor

Una clase de entidad, tabla, ráster, dimensión o valor de anotación, según la devolución de la propiedad valor.

Objeto de lista de Python de la forma [tipo, nombre, campos, extensión, referencia espacial]

Una lista de Python que contiene una descripción del elemento secundario que se agregará. Sólo se requieren las primeras dos entradas en la lista, tipo y nombre. Los argumentos restantes son opcionales.

Listas de miembros para additionalChildren

Cuando agrega más de un elemento secundario, proporciona una lista de descripciones de los elementos secundarios. Si está agregando los elementos secundarios con la forma del objeto de la lista de Python, creará una lista de listas para additionalChildren.

La forma de la lista de Python tiene cinco argumentos, como se describe en la siguiente tabla.

Argumento

Tipo

Descripción

type

requerido

Una de las siguientes: "Point", "Multipoint", "Polyline", "Polygon", "Table", "Raster", "Annotation", "Dimension"

name

requerido

El nombre del dataset. Solo puede ser el nombre base del dataset ("calles") o la ruta del catálogo completa ("E:\mydata\test.gdb\infrastructure\streets"). Cuando se proporciona toda la ruta del catálogo, se ignora todo excepto el nombre base ("calles").

campos

opcional

Una lista de Python de objetos de campo. Contiene los campos que aparecen en el elemento secundario, si se conocen.

extent

opcional

Una cadena de texto o lista de Python que contiene la extensión espacial del elemento secundario.

referencia espacial

opcional

Un objeto de referencia espacial.

Contenidos de la lista de elemento secundario

Estos argumentos deben proporcionarse en el orden que se visualizan. Para omitir un argumento opcional, utilice la palabra clave Python None o "#".

A continuación, algunos ejemplos de la configuración de un esquema de espacio de trabajo. Los ejemplos se basan en una herramienta de secuencia de comandos que tiene los argumentos siguientes:

Nombre del parámetro

Propiedades

0

Clase de entidad de entrada

Clase de entidad—entrada.

1

Tabla de entrada

Tabla—entrada.

2

Espacio de trabajo de entrada

Espacio de trabajo—entrada (un espacio de trabajo actual que contiene los resultados de la herramienta).

3

Espacio de trabajo derivado

Espacio de trabajo—Salida derivada, obtenida de Input_workspace. El esquema de este espacio de trabajo se modifica para incluir elementos secundarios adicionales.

Parámetros de la herramienta de ejemplo

La herramienta toma la clase y la tabla de entidad de entrada, las copia en el espacio de trabajo, agrega un campo nuevo a la clase de entidad, después crea una clase de entidad de polígono nueva en el espacio de trabajo. (El trabajo actual de la herramienta no es importante ya que sólo sirve para ilustrar la configuración de un esquema del espacio de trabajo). Los ejemplos de código a continuación se construyen uno sobre otro, comenzando con el uso simple de additionalChildren. Si elige implementar y probar algunos de los ejemplos de código a continuación, puede probar el código por medio del modelo que se ilustra a continuación.

Modelo utilizado para ver los resultados de la validación

En getParametersInfo, el espacio de trabajo de la salida se clona desde su parámetro dependiente (param2).

class ExampleTool(object):
    def __init__(self):
        self.label       = "Example tool"
        self.description = "Example of parameter dependencies"

    def getParameterInfo(self):
        #Define parameter definitions

        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input feature class",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Input table",
            name="in_table",
            datatype="GPTableView",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Input workspace",
            name="in_workspace",
            datatype="DEWorkspace",
            parameterType="Required",
            direction="Input")

        # Derived workspaces
        param3 = arcpy.Parameter(
            displayName="Derived workspace",
            name="out_workspace",
            datatype="DEWorkspace",
            parameterType="Derived",
            direction="Output")

        # Set dependencies to the input workspace parameter
        param3.parameterDependencies = [param0.name]

        # Copy all existing contents to output
        param3.schema.clone = True

        params = [param0, param1, param2, param3]

        return params

Ejemplo: copie las dos entradas (sin modificaciones) al espacio de trabajo de salida:

def updateParameters(self, parameters):
    inFC = parameters[0].value     # input feature class
    inTable = parameters[1].value  # input table
    inWS = parameters[2].value     # input workspace
    if inFC and inTable and inWS:
        parameters[3].schema.additionalChildren = [inFC, inTable]

    return

Ejemplo: la herramienta crea una nueva clase de entidad poligonal. Las propiedades únicas conocidas sobre esta clase de entidad nueva (cuando se valida) son el nombre ("SummaryPolygon") y tipo ("polygon").

def updateParameters(self, parameters):
    children = []    # New empty list
    children.append(parameters[0].value)
    children.append(parameters[1].value)
    children.append(["polygon", "SummaryPolygon"])
    parameters[3].schema.additionalChildren = children

    return

Ejemplo: agregue un campo a la clase de entidad de entrada.

def updateParameters(self, parameters):
    
    # Create a field object with the name "Category" and type "Long"
    #
    newField = arcpy.Field()
    newField.name = "Category"
    newField.type = "Long"

    # Describe the input feature class in order to get its list of fields. The 9.3
    #  version of the geoprocessing object returns fields in a Python list, unlike
    #  previous versions, which returned fields in an enumerator.
    #
    desc = arcpy.Describe(parameters[0].value)
    fieldList = desc.fields

    # Add the new field to the list
    #
    fieldList.append(newField)

    # Create a new child based on the input feature class, but with the 
    #  additional field added
    #
    newChild = [desc.shapeType, desc.catalogPath, fieldList, 
               desc.extent, desc.spatialReference]

    # Now create our list of children and add to the schema
    #
    children = []
    children.append(newChild)
    children.append(inTable)
    children.append(["polygon", "SummaryPolygon"])
    parameters[3].schema.additionalChildren = children

    return

Para crear campos para SummaryPolygon (la clase de entidad de polígono nueva), cree una lista de objetos de campo similar al patrón que se muestra en el ejemplo de arriba.

Ejemplo: entrada de valor múltiple

En este ejemplo, el primer parámetro es un valor múltiple de las clases entidad. Cada clase de entidad en el valor múltiple se copia al espacio de trabajo derivado. Se agrega un campo nuevo, "ProjectID", para cada una de las clases de entidad copiadas.

# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace

def updateParameters(self, parameters):
    inVT = parameters[0].value   # multivalue ValueTable
    inWS = parameters[1].value   # WorkSpace

    # Add each feature class to the output workspace. In addition,
    #  add a new field "ProjectID" to each feature class
    #
    if inVT and inWS:
        rowCount = inVT.rowCount  # Row count in MultiValue table
        children = []
        newField = arcpy.Field()
        newField.name = "ProjectID"
        newField.type = "Long"
        for row in range(0, rowCount):
            value = inVT.getValue(row, 0)
            if value:
                d = arcpy.Describe(value)
                fieldList = d.fields

                # Note -- not checking if field already exists
                #
                fieldList.append(newField)

                # Create new child with additional ProjectID 
                #  field and add child to list of children
                #
                child = [d.shapeType, d.catalogPath, fieldList]
                children.append(child)            
              
        parameters[2].schema.additionalChildren = children
    return

Temas relacionados

9/11/2013