¿De lejos, acceder a ArcObjects desde Python? es mi Q&A más leída y referenciada en GIS Stack Exchange. A pesar de ese éxito, es probable que sea una de mis áreas más débiles en lo que respecta al uso real. Una gran parte de esa mala presentación se deriva de mi poca capacidad para leer y comprender los documentos de ArcObjects .
Entonces, para cualquier tarea, ¿cuáles son algunas pautas para traducir documentos .net / c ++ / java / ... y ejemplos a sus equivalentes en Python? (¿en qué idioma es el mejor para trabajar?) y ¿cuál es el mejor índice o página de inicio para comenzar? ¿En qué cosas debería centrarse, y probablemente al menos tan importante, qué se puede ignorar libremente?
Suponga que su audiencia es al menos un poco alfabetizada en Python y analfabeta en otros lenguajes de desarrollo. Indíquenos un pequeño ejercicio de codificación, desde la idea inicial y la investigación hasta los resultados de Python.
fuente
Respuestas:
Tampoco soy muy fuerte en esta área, pero he modificado el módulo Snippets y he hecho un par de envoltorios para tareas muy simples. Tengo un ejemplo de solo agregar elementos de línea. El ejemplo debajo del bloque principal forma un triángulo con la vista de diseño justo afuera del documento.
Utilizo este script junto con otros cursores de búsqueda para crear tablas gráficas en el diseño a partir de líneas individuales y elementos de texto, pero eso se aleja rápidamente del ejemplo "simple". El siguiente código es bastante simple y utiliza una versión modificada de fragmentos:
Editar:
@matt wilkie
En cuanto a la determinación de las importaciones, allí es donde tendrá que revisar los Diagramas de modelo de ArcObjects o ver desde qué espacio de nombre se llama a una Clase o Interfaz en particular en los documentos de ayuda de .NET SDK. En algunos casos, se puede usar más de un espacio de nombres debido a la herencia.
No soy un experto en ArcObjects, por lo que generalmente me lleva un tiempo descubrir cuándo lanzar cosas con CType (). La mayoría de esto, lo he recogido de muestras en línea. Además, la sintaxis de los ejemplos de VB.NET parece estar más cerca de lo que haces en Python, pero los ejemplos de C # tienen más sentido para mí en términos de legibilidad (si eso tiene sentido). Pero, como regla general, generalmente sigo estos pasos:
No estoy seguro de si estoy usando la terminología adecuada o no ... Soy principalmente un desarrollador de Python que "incursiona" en algunos ArcObjects ... Sin embargo, solo he tocado la punta del iceberg.
Además, esta función auxiliar cargará todas las bibliotecas de objetos de ArcObjects (.olb):
fuente
import comtypes.gen.esriArcMapUI as esriArcMapUI
y luego lo usópMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(y descubrió la sintaxis en esa declaración)?En otra publicación, relacionada pero ligeramente diferente, proporcioné una respuesta que puede ser de interés para los usuarios de python que intentan entender los documentos de ayuda de Esri ArcObjects.
Vengo del otro lado: ya conocía ArcObjects mucho (mucho, mucho) antes de haber oído hablar de Python y gracias a publicaciones como estas, puedo incluir algunos ArcObjects críticos en la fácil creación de secuencias de comandos de Python (consulte esta publicación para ver un ejemplo ) Recuerdo la frustración de tratar de entender la herencia, los métodos y las propiedades; dilemas como Tengo X, que está relacionado con Y ... entonces, ¿cómo llego de X a Y? Método ()?
La respuesta es mirar las CoClasses que implementan la interfaz (vea el texto completo aquí ) ... para un ejemplo básico, si quiero ver si una capa tiene una consulta de definición, y si es así, ¿qué es?
C ª#:
En lugar de
ctype
(que es prominente en VB), C # utiliza()
oas
para la conversión, por ejemplo,IObject x = (IObject)y;
es (fundamentalmente) el mismoIObject x = y as IObject;
que seríadim x as IObject = ctype(y,IObject)
en VB.Puedo decir que necesito un IFeatureLayer para llegar a IFeatureLayerDefinition porque:
Y cuando lees el documento de ayuda para IFeatureLayer ves:
Lo que indica que es seguro ir a ILayer-> IFeatureLayer-> IFeatureLayerDef, siempre que ILayer sea del tipo FeatureLayer (o cualquiera de las otras CoClasses).
Entonces, ¿qué pasa con los yoes y no yoes? La interfaz I significa, es el bit que hace el trabajo, sin un I es un CoClass (un tipo ), por lo que cualquier cosa que quiera usar realmente debe comenzar con un I y si está creando uno nuevo o verificando el tipo luego omita el I. Una interfaz puede tener muchas CoClasses y una CoClass puede admitir muchas interfaces, pero es la interfaz la que realmente hace el trabajo.
En python:
Esta muestra hace un poco más que la C, ya que encuentra su camino hacia la aplicación actual, que solo estaría disponible en la ventana de Python o en un complemento, si intenta ejecutar esto desde la línea de comandos, la aplicación es Null y el script luego bloqueo con una excepción de referencia nula.
fuente