De loin, accéder à ArcObjects à partir de Python? est mon Q&A le plus lu et référencé sur GIS Stack Exchange. Malgré ce succès, c'est probablement l'un de mes points faibles en matière d'utilisation réelle. Une grande partie de cette mauvaise performance provient de ma faible capacité à lire et à comprendre les documents ArcObjects .
Donc, pour une tâche donnée, quelles sont les lignes directrices pour traduire des documents et des exemples .net / c ++ / java / ... dans leurs équivalents python? (quelle langue est la meilleure pour travailler d'ailleurs?) et quel est le meilleur index ou page de destination pour commencer? quels éléments devraient être axés sur, et probablement au moins aussi importants, ce qui peut être librement ignoré?
Supposons que votre public soit au moins un peu alphabétisé en python et analphabète dans d'autres langages de développement. Guidez-nous à travers un petit exercice de codage, de l'idée initiale et de la recherche aux résultats de travail en python.
la source
Réponses:
Je ne suis pas très fort dans ce domaine non plus, mais j'ai modifié le module Snippets et j'ai créé quelques wrappers pour des tâches très simples. J'ai un exemple d'ajout d'éléments de ligne. L'exemple sous le bloc principal forme un triangle vers la vue de mise en page juste à l'extérieur du document.
J'utilise ce script en conjonction avec un autre et des curseurs de recherche arcpy pour créer des tableaux graphiques dans la mise en page à partir de lignes individuelles et d'éléments de texte, mais cela s'éloigne rapidement de l'exemple "simple". Le code ci-dessous est assez simple et utilise une version modifiée des extraits de code:
Éditer:
@matt wilkie
En ce qui concerne les importations, c'est là que vous devrez parcourir les diagrammes de modèle ArcObjects ou voir à partir de quel espace de noms une classe ou une interface particulière est appelée dans les documents d'aide du kit de développement .NET SDK. Dans certains cas, plusieurs espaces de noms peuvent être utilisés en raison de l'héritage.
Je ne suis pas un expert en ArcObjects, donc cela me prend généralement un certain temps pour savoir quand lancer des choses avec CType (). La plupart de cela, j'ai récupéré des échantillons en ligne. De plus, la syntaxe des exemples VB.NET semble être plus proche de ce que vous faites en Python, mais les exemples C # ont plus de sens pour moi en termes de lisibilité (si cela a un sens). Mais, en règle générale, je suit généralement ces étapes:
Je ne sais pas si j'utilise la terminologie appropriée ou non ... Je suis principalement un développeur Python qui "touche" à certains ArcObjects ... Je n'ai cependant touché que la pointe de l'iceberg.
De plus, cette fonction d'assistance chargera toutes les bibliothèques d'objets ArcObjects (.olb):
la source
import comtypes.gen.esriArcMapUI as esriArcMapUI
et ensuite utilisé danspMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(et découvert la syntaxe dans cette déclaration)?Dans un autre article, connexe mais légèrement différent, j'ai fourni une réponse qui peut être intéressante pour les utilisateurs de python essayant de faire le tour des documents d'aide d'Esri ArcObjects.
Je venais de l'autre côté: je connaissais ArcObjects depuis longtemps (très longtemps) avant même d'avoir entendu parler de python et grâce à des articles comme ceux-ci, je suis en mesure d'inclure des ArcObjects critiques dans le scriptage facile de python (voir cet article pour un exemple ). Je me souviens de la frustration d'essayer de comprendre l'héritage, les méthodes et les propriétés; dilemmes comme j'ai X qui est en quelque sorte lié à Y ... alors comment puis-je passer de X à Y.Method ()?
La réponse est de regarder les CoClasses qui implémentent l'interface (voir le texte complet ici ) .. pour un exemple de base, si je veux voir si une couche a une requête de définition, et si oui, qu'est-ce que c'est:
En C #:
Au lieu de
ctype
(qui est prédominant dans VB), les utilisations de C #()
ouas
pour le casting, par exemple,IObject x = (IObject)y;
sont (fondamentalement) les mêmes que cellesIObject x = y as IObject;
qui seraientdim x as IObject = ctype(y,IObject)
dans VB.Je peux dire que j'ai besoin d'un IFeatureLayer pour accéder à IFeatureLayerDefinition parce que:
Et lorsque vous lisez le document d'aide pour IFeatureLayer, vous voyez:
Ce qui indique qu'il est sûr d'aller ILayer-> IFeatureLayer-> IFeatureLayerDef, à condition que l'ILayer soit du type FeatureLayer (ou l'une des autres CoClasses).
Alors qu'est-ce qui se passe avec les je et non les je? L'interface I signifie, c'est le bit qui fait le travail, sans un I est une CoClass (un type ), donc tout ce que vous voulez réellement utiliser doit commencer par un I et si vous en créez un nouveau ou vérifiez le type puis sautez le I. Une interface peut avoir plusieurs CoClasses et une CoClasse peut prendre en charge de nombreuses interfaces mais c'est l'interface qui fait le travail.
En python:
Cet exemple fait un peu plus que le C en ce qu'il trouve son chemin vers l'application actuelle, qui ne serait disponible que dans la fenêtre python ou un complément, si vous avez essayé de l'exécuter à partir de la ligne de commande, l'application est Null et le script serait alors planter avec une exception de référence nulle.
la source