我是 OOP 的新手,并试图在 Python 中使用 COM 对象(arcobjects)。程序与 GIS 相关,但我在 GIS.SE 上没有得到任何答案,所以我在这里问。下面是我的一段代码。我被困在收到 iFrameElement 的最后。ESRI 将其描述为抽象类的成员/接口,它本身不能创建对象。我需要将其中包含的信息传递给其 CoClass(MapFrame)中的对象。
任何建议如何做到这一点?
另外,我在哪里可以找到 Python 中对象的命名约定?有 p, i 作为前缀,我不确定它们来自哪里。
from comtypes.client import CreateObject, GetModule
import arcpy
def CType(obj, interface):
"""Casts obj to interface and returns comtypes POINTER or None"""
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None
def NewObj(MyClass, MyInterface):
"""Creates a new comtypes POINTER object where\n\
MyClass is the class to be instantiated,\n\
MyInterface is the interface to be assigned"""
from comtypes.client import CreateObject
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
return None
esriCarto = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriCarto.olb")
esriCartoUI = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriCartoUI.olb")
esriMapUI = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriArcMapUI.olb")
esriFrame = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriFramework.olb")
arcpy.SetProduct('Arcinfo')
pApp = NewObj(esriFrame.AppROT, esriFrame.IAppROT).Item(0)
pDoc = pApp.Document
pMxDoc = CType(pDoc, esriMapUI.IMxDocument)
pLayout = pMxDoc.PageLayout
pGraphContLayout = CType(pLayout, esriCarto.IGraphicsContainer)
iFrameElement = pGraphContLayout.FindFrame(pMxDoc.ActiveView.FocusMap)
据我了解,iFrameElement 是一个抽象类的接口,我需要从中继承 MapFrame 对象的属性(指针)。我怎么做?如何使用 IMapGrids 接口获取对象?有什么建议么?