2

我正在编写一个外部 Python/comtypes 脚本(在 PythonWin 中),它需要获取对当前 ArcGIS 10.0 ArcMap 会话的引用(通过 ArcObjects COM)。因为脚本在应用程序边界之外,所以我通过 AppROT(运行对象表)获取应用程序引用。下面的第一个代码片段是主要的 Python 驱动程序模块。其中有一个 GetApp() 函数,用于从 AppROT 中获取应用程序引用。此代码工作正常,并在单例 AppRef 对象上返回 IApplication。有道理,这就是 ArcObjects 参考似乎表明的。现在,我的主要目标是获得一个 IMxDocument。在主循环中,我成功获得了一个 IDocument 并可以打印标题。但是,下一行查询接口会引发错误 - 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
4

1 回答 1

0

范围错误(根据评论):

定义 esriArcMapUI 命名空间所需的import comtypes.gen.esriArcMapUI as esriArcMapUI语句在 GetApp() 函数中运行,因此命名空间是函数的本地。

于 2012-03-20T10:20:59.647 回答