¿Agregar código arbitrario a ArcGIS ModelBuilder?

11

¿Hay alguna forma de agregar fragmentos de código arbitrario a un modelo de ArcGIS?

Imagino algo similar al "bloque de código show" del generador de expresiones en el etiquetado avanzado o la calculadora de campo .

Por ejemplo, mi proyecto del momento podría beneficiarse enormemente al buscar el nombre de usuario de la persona que ejecuta la herramienta. Sé que en Python esto es simple import os; os.environ.get('USERNAME'). Creo que podría escribir ese fragmento get_username.py, agregarlo a una caja de herramientas en Arccatalog, luego agregar esa herramienta al modelo y usarla como parámetro de modelo requerido para mi herramienta actual. Eso es mucho trabajo para una cosa tan pequeña, y la próxima vez podría querer algo más, como la sustitución de variables en línea o una variable compuesta .

Creo que una herramienta de fragmento de código o similar podría abordar todas estas necesidades de manera genérica y ampliamente útil.

wilkie mate
fuente
pensamiento loco: en lugar del generador de expresiones, ¿qué pasa con una ventana de línea de comandos de Python que guarda el historial para que el modelo vuelva a usarse?
Matt wilkie
2
En realidad, lo que realmente busco es que toda la biblioteca de Python se exponga al generador de modelos de la misma manera que las herramientas arcgis. pero eso es una locura (¿verdad?)
Matt wilkie
¡Gran idea! Desea escribir fragmentos de código sobre la marcha en una "herramienta" que procesará el fragmento y devolverá los resultados, ¿verdad? Entonces, en su ejemplo, la "herramienta" devolvería <nombre de usuario actual> que luego podría aplicarse a otras herramientas en sentido descendente.
RyanKDalton
@ RyanDalton, sí, eso es exactamente correcto.
Matt wilkie

Respuestas:

3

Nueva respuesta a una publicación anterior, solo para aclarar cómo crear un modelo reutilizable para hacer esto.

Abra el modelo, Insertar-> Herramientas solo modelo-> Calcular valor.

En la expresión, escriba: getuser()

En el bloque de código, escriba:

def getuser():
    import getpass
    return getpass.getuser()

(Consulte " Obtener el nombre de usuario en un formato específico " para obtener el fragmento de código de nombre de usuario de @ChadCooper)

Para Tipo de datos, elija String.

ingrese la descripción de la imagen aquí

Cambie el nombre del círculo de salida a username. El modelo de resultado final se verá así: Usar la herramienta Calcular valor

Y luego puede arrastrar este modelo a cualquier modelo futuro y hacer referencia a la variable llamada% username% en cualquier modelo o script futuro. Solo asegúrese de que este modelo se ejecute antes de intentar acceder a la variable% username%. Puede hacer esto utilizando una condición previa .

RyanKDalton
fuente
Ryan quizás podría ampliar por qué la salida es un parámetro [P] y mostrar un ejemplo del módulo que se incluye en otro módulo. Inicialmente, estaba muy confundido por qué P para una salida, ya que los parámetros generalmente se tratan de entradas.
Matt Wilkie
@mattwilkie, no necesita ningún parámetro de entrada porque el script de Python "leerá" las entradas de su sistema. Sin embargo, debe hacer que la salida (el nombre de usuario) sea un parámetro para poder consumir los resultados en otro modelo o script de Python. El siguiente paso sería pasar el parámetro del nombre de usuario a algo así como un "script de correo electrónico" que usaría automáticamente el parámetro de salida uesrname como entrada a la dirección de correo electrónico "Para".
RyanKDalton
10

En realidad, puede hacerlo con la herramienta Calcular valor (gestión de datos) .

No es particularmente elegante (todo el código fuente de la herramienta se imprime en el registro cada vez que se ejecuta), y el editor (realmente solo un cuadro de texto) es abismal.

Sugeriría escribir módulos desde los que luego pueda importar y llamar funciones, y luego solo necesitaría escribir fragmentos muy cortos en el cuadro de diálogo. De lo contrario, no es muy limpio.

Calcular valor está disponible en todos los niveles de licencia para Arcgis v10. Con v9.x está disponible para Arcview solo si las extensiones Spatial o 3D Analyst están instaladas ( ref .).

blah238
fuente
¡gracias! Esto funcionó bastante bien para lo que necesitaba hoy (insertar %USERNAME%en una conexión de base de datos .sde). De acuerdo en que el editor no es digno de ese nombre, funciona bien como destino de pegado.
matt wilkie
1
re: 9.x, la redacción de la página de ayuda de CV indica que la herramienta podría estar disponible si las extensiones SA / 3D simplemente se instalan . Es posible usarlo sin que la extensión tenga licencia o esté activada.
matt wilkie
"Sugeriría escribir módulos que luego pueda importar", ¡es una idea realmente genial!
Curtis Precio
2

Quizás estoy malinterpretando la pregunta, pero parece que la funcionalidad de la herramienta de script de Python, dentro de ArcToolBox, es lo que está buscando:

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Integrating_scripts_within_a_model/002w0000006n000000/

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//001500000006000000.htm

De hecho, también puede usar / combinar varios otros lenguajes de secuencias de comandos (R en este ejemplo):

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002w0000007w000000

Brent Edwards
fuente
Ver también Integrar guiones dentro de un modelo
Chad Cooper
3
Esto funciona (y es cómo lo haría), pero Matt específicamente llamó a este método "mucho trabajo para una cosa tan pequeña" en su pregunta :)
nmpeterson