私は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インターフェイスでオブジェクトを取得するにはどうすればよいですか?助言がありますか?