首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArcObjects和.AppRef:如何从IAppROT转到IMxDocument?

ArcObjects和.AppRef:如何从IAppROT转到IMxDocument?
EN

Stack Overflow用户
提问于 2010-10-29 23:55:44
回答 1查看 1.1K关注 0票数 2

我正在编写一个外部Python/comtype脚本(用PythonWin编写),它需要获得对当前ArcGIS 10.0 ArcMap会话的引用(通过ArcObjects COM)。因为脚本在应用程序边界之外,所以我通过AppROT (运行对象表)获取应用程序引用。下面的第一个代码片段是主Python驱动程序模块。其中有一个函数GetApp(),用于从AppROT获取应用程序引用。这段代码运行良好,并在单例AppRef对象上返回IApplication。这是有道理的,这就是ArcObjects参考似乎所表明的。现在,我的主要目标是获得一个IMxDocument。在主循环中,我成功地访问了IDocument,并且可以打印标题。但是,查询接口的下一行抛出了一个错误- NameError:没有定义名称'esriArcMapUI‘。错误总是出现,即使在关闭PythonWin并重新打开之后也是如此(在得出问题的结论之前,您总是希望尝试一下)。顺便说一句,第二个代码片段是QI的CType()函数,它在SignHelpers.py模块中定义并导入。所以,这里是我的问题:

(1) IDocument在哪个COM对象上?

(2)如何从我的IDocument到达目标IMxDocument?我需要先创建一个新的MxDocument对象吗?抱歉的。这里有两个问题。

(3)如果我不需要创建一个新的对象,那么我该如何做QI?

几年前,我在VB6中做了很多ArcObjects工作,所以显式的QI和名称空间现在给我带来了麻烦。一旦我可以获得IMxDocument,我就可以自由地回家了。如果任何人能在这方面给我帮助,我将不胜感激。

另外,我为下面代码的格式表示歉意。我不知道如何让Python代码正确格式化。缩进不起作用,一些Python代码被解释为格式化字符。

代码语言:javascript
复制
=== 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
EN

回答 1

Stack Overflow用户

发布于 2012-03-20 18:21:00

作用域错误(根据注释):

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4053609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档