2

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

4

1 に答える 1

2

IFrameElement はインターフェイスであるため、それ自体のインスタンスを作成することはできません。このインターフェイスは、MapFrame を含むさまざまなクラスによって実装されます。これは、(基本的に) これらのオブジェクトのインスタンスが IFrameElement のように「動作」することを意味します。したがって、IGraphicsContainer.FindFrame() から IFrameElement を取得した場合、オブジェクトの実際の型を調べなくても、IFrameElement を必要とする別のものにそれを渡すことができます。

ESRI のコードではインターフェイスが頻繁に使用されているため、OOP でのインターフェイスの意味を確認することをお勧めします

命名規則について - 変数に名前を付けるための厳格なルールはありません。

コードを見ると、p は個別の型を持つオブジェクトを参照し、i はインターフェイスによってのみ定義されたオブジェクトを参照します。ただし、参照しているインターフェイスと同じ名前で変数を呼び出すことは (小文字の 'i' を除く)、不適切な方法であり、混乱を招く可能性があります。(IMO)

編集: 最後の質問に答えるには(申し訳ありませんが、最初は見逃していました):

pGraphContLayout.FindFrame() が MapFrame 型のオブジェクトを返す場合 (それが返される保証はありません)、単純に IMapGrid にキャストできるはずです。

pGraphContLayout = CType(pLayout, esriCarto.IGraphicsContainer)
pFrame = pGraphContLayout.FindFrame(pMxDoc.ActiveView.FocusMap)
pGrids = CType(pFrame, IMapGrids)

インターフェイスの目的を果たしているように見える Python の抽象基本クラスに混乱しているように思えます...? このスレッドは役に立ちます: Python の抽象クラスとインターフェイスの違い

于 2012-08-30T07:36:41.860 に答える