我正在编写一个外部Python / comtypes脚本(在PythonWin中),需要获取对当前ArcGIS 10.0 ArcMap会话的引用(通过ArcObjects COM)。因为脚本在应用程序边界之外,所以我通过AppROT(运行对象表)获取应用程序引用。下面的第一个代码片段是主要的Python驱动程序模块。它是一个GetApp()函数,用于从AppROT中获取应用程序引用。此代码工作正常,并在单例AppRef对象上返回IApplication。有道理,这就是ArcObjects引用似乎表明的内容。现在,我的主要目标是获得IMxDocument。在主循环中,我成功访问了IDocument并可以打印标题。但是,下一行是查询接口,会抛出错误 - NameError:name'esriArcMapUI'未定义。即使在关闭PythonWin并重新打开之后(在您断定有问题之前总是想要尝试),错误也会一直发生。 [顺便说一下,第二个代码片段是QI的CType()函数,在SignHelpers.py模块中定义并从中导入。]所以,这是我的问题:
(1)什么COM对象是IDocument?
(2)如何从我的IDocument到预期的IMxDocument?我需要先创建一个新的MxDocument对象吗? [抱歉。那里有两个问题。]
(3)如果我不必创建新对象,那么我该如何进行QI?
几年前我在VB6中做了很多ArcObjects的工作,所以显式的QI和命名空间正在向我施加压力。一旦我能够获得IMxDocument,我将免费回家。我很感激任何人都可以帮助我。
另外,我为下面代码的格式化道歉。我无法弄清楚如何使Python代码正确格式化。缩进不起作用,并且某些Python代码被解释为格式化字符。
=== code: main py module ===
import sys, os
sys.path.append('C:\GISdata\E_drive\AirportData\ATL\Scripts')
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
答案 0 :(得分:0)
范围错误(根据评论):
定义esriArcMapUI命名空间所需的import comtypes.gen.esriArcMapUI as esriArcMapUI
语句正在GetApp()函数中运行,因此命名空间是函数的本地。