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:
- 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).
- Una vez que el usuario interactúa con el cuadro de diálogo de la herramienta de algún modo, se invoca updateParameters.
- 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).
- 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.
- 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 |
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.
- Si parameter.parameterType es "Derivado", se realiza una copia exacta. Este es el comportamiento de la herramienta Agregar campo.
- Si parameter.parameterType se configura como "Requerido", también se realiza una copia exacta pero se modifica la ruta del catálogo al dataset. Las rutas de catálogo constan de dos partes: el espacio de trabajo y el nombre base. Por ejemplo:
E:/Data/TestData/netcity.gdb/infrastructure/roads
- Espacio de trabajo = E:/Data/TestData/netcity.gdb/infrastructure
- Nombre base = carreteras
- El nombre base es el mismo que el nombre base del primer parámetro de entrada que contiene un dataset (no la primera dependencia sino el primer parámetro) adjunto con el nombre de la herramienta de secuencia de comandos (por ejemplo, roads_MyTool).
- El espacio de trabajo se establece como la configuración del entorno del espacio de trabajo temporal. Si éste está vacío, se utiliza la configuración del entorno del espacio de trabajo actual. Si está vacío, se utiliza el espacio de trabajo del primer parámetro de entrada que contiene un dataset. Si este espacio de trabajo es de sólo lectura, entonces se utiliza el directorio temporal del sistema.
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.
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
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. |
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. |
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:
|
"AsSpecified" |
El tipo de geometría se determinará por el valor de la propiedad geometryType. |
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. |
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.
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. |
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. |
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). |
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.
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. |
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. |
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. |
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.
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