- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个外部 Python/comtypes 脚本(在 PythonWin 中),它需要获取对当前 ArcGIS 10.0 ArcMap session 的引用(通过 ArcObjects COM)。因为脚本在应用程序边界之外,所以我通过 AppROT(运行对象表)获取应用程序引用。下面的第一个代码片段是主要的 Python 驱动程序模块。其中有一个 GetApp() 函数,用于从 AppROT 获取应用程序引用。此代码工作正常,并在单例 AppRef 对象上返回 IApplication。有道理,这就是 ArcObjects 引用似乎表明的内容。现在,我的主要目标是获取 IMxDocument。在主循环中,我成功获得了 IDocument 并可以打印标题。但是,下一行是查询接口(interface),会引发错误 - NameError: name 'esriArcMapUI' is not defined。即使在关闭 PythonWin 并重新打开(您总是想在确定有问题之前尝试重新打开)之后,该错误也会持续发生。 [顺便说一句,第二个代码片段是 QI 的 CType() 函数,在 SignHelpers.py 模块中定义并从中导入。] 所以,这是我的问题:
(1)IDocument在什么COM对象上?
(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
最佳答案
范围错误(根据评论):
定义 esriArcMapUI 命名空间所需的 import comtypes.gen.esriArcMapUI as esriArcMapUI
语句正在 GetApp() 函数中运行,因此命名空间对于函数而言是本地的。
关于Python、ArcObjects 和 .AppRef : how to get from IAppROT to IMxDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053609/
我正在编写一个外部 Python/comtypes 脚本(在 PythonWin 中),它需要获取对当前 ArcGIS 10.0 ArcMap session 的引用(通过 ArcObjects CO
我是一名优秀的程序员,十分优秀!