/ / Python, ArcObjects et .AppRef: comment passer de IAppROT à IMxDocument? - python, com, arcobjects, queryinterface, comtypes

Python, ArcObjects et .AppRef: comment passer de IAppROT à IMxDocument? - python, com, arcobjects, queryinterface, comtypes

J'écris un script externe Python / comtypes(dans PythonWin) qui doit obtenir une référence à la session ArcMap ArcGIS 10.0 en cours (via le COM ArcObjects). Comme le script se trouve en dehors des limites de l'application, la référence de l'application est obtenue via AppROT (table d'objets en cours d'exécution). Le premier extrait de code ci-dessous est le module de pilote Python principal. Dans cette fonction, GetApp () récupère une référence d'application à partir d'AppROT. Ce code fonctionne correctement et renvoie IApplication sur l'objet singleton AppRef. Cela a du sens, et c’est ce que la référence ArcObjects semble indiquer. Maintenant, mon objectif principal est d’obtenir un document IMxDocument. Dans la boucle principale, je parviens à un document ID et je peux imprimer le titre. La ligne suivante, cependant, une interface de requête génère une erreur - NameError: le nom "esriArcMapUI" n'est pas défini. L'erreur se produit de manière constante, même après la fermeture de PythonWin et sa réouverture (que vous souhaitez toujours essayer avant de conclure à l'existence d'un problème). Le deuxième fragment de code est la fonction CType () pour QI, définie dans et importée du module SignHelpers.py.] Voici donc mes questions:

(1) Sur quel objet COM l'IDocument est-il?
(2) Comment puis-je passer de mon IDocument au document IMxDocument prévu? Dois-je d'abord créer un nouvel objet MxDocument? [Pardon. Deux questions ici.]
(3) Si je ne dois pas créer un nouvel objet, comment puis-je faire le QI?

J'ai beaucoup travaillé avec ArcObjects dans VB6Il y a des années, des QI et des espaces de noms explicites me mettent en place pour le moment. Une fois que je pourrai accéder à un document IMx, je serai libre de chez moi. J'apprécierais toute aide que quiconque pourrait me donner à cet égard.

De plus, je m'excuse pour le formatage du codeau dessous de. Je ne pouvais pas comprendre comment obtenir le code Python pour formater correctement. L’indentation ne fonctionne pas et une partie du code Python est interprétée comme une mise en forme de caractères.

=== code:  main py module ===

import sys, os
sys.path.append("C:GISdataE_driveAirportDataATLScripts")

import comtypes
from SignHelpers import *

def GetApp(app):
"""Get a hook into the current session of ArcMap; n
Execute GetDesktopModules() and GetStandaloneModules() first"""
print "GetApp called" #@@@
import comtypes.gen.esriFramework as esriFramework
import comtypes.gen.esriArcMapUI as esriArcMapUI
import comtypes.gen.esriCarto as esriCarto
pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
iCount = pAppROT.Count
print "appROT count = ", iCount  #@@@
if iCount == 0:
print "No ArcGIS application currently running.  Terminating ..."
return None
for i in range(iCount):
pApp = pAppROT.Item(i)  #returns IApplication on AppRef
if pApp.Name == app:
print "Application:  ", pApp.Name  #@@@
return pApp
print "No ArcMap session is running at this time."
return None


if __name__ == "__main__":
#Wrap needed ArcObjects type libraries (.olb)...

... code omitted ...

GetDesktopModules(dtOLB)    #These force comtypes to generate
GetStandaloneModules(saOLB) #the Python wrappers for .olb"s

#Connect to ArcMap
pApp = GetApp("ArcMap")

pDoc = pApp.Document  #IDocument on current Document object
print pDoc.Title
pMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)  #QI to IMxDocument on MxDocument

=== code for CType() ===
def CType(obj, interface):
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None

Réponses:

0 pour la réponse № 1

Erreur de cadrage (d'après les commentaires):

le import comtypes.gen.esriArcMapUI as esriArcMapUI L’instruction nécessaire pour définir l’espace de nom esriArcMapUI était en cours d’exécution dans la fonction GetApp (); l’espace de nom était donc local pour la fonction.