2012-08-30 4 views
2

저는 OOP을 처음 사용하고 Python에서 COM 객체 (arcobjects)를 사용하려고합니다. 프로그램은 GIS와 관련되어 있지만 GIS.SE에 대한 답변을 얻지 못했습니다. 그래서 여기에서 묻습니다. 아래 코드는 제 코드입니다. 나는 iFrameElement를받는 끝에 붙어 있습니다. ESRI는이를 추상적 클래스의 멤버/인터페이스로 기술하며 객체 자체는 만들 수 없습니다. CoClass (MapFrame)의 객체에 포함 된 정보를 전달해야합니다.Python의 COM 객체 (arcobjects)

제안 방법

또한 파이썬에서 객체에 대한 이름 규칙을 찾을 수 있습니까? 접두어로 p가 있는데 어디에서 왔는지 모르겠습니다.

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 인터페이스로 어떻게 객체에 접근 할 수 있습니까? 어떤 제안?

답변

2

IFrameElement는 인터페이스이므로 인스턴스 자체를 만들 수 없습니다. 이 인터페이스는 MapFrame을 포함하여 various classes에 의해 구현됩니다.이 의미는 (기본 용어로) 해당 개체의 인스턴스가 IFrameElement처럼 작동한다는 것을 의미합니다. 따라서 IGraphicsContainer.FindFrame()에서 IFrameElement를 가져온 경우 IFrameElement를 기대하는 다른 객체로 전달할 수 있습니다.이 객체의 실제 유형이 무엇인지 알 필요가 없습니다.

ESRI의 코드가 을 사용하기 때문에 OOP에서 인터페이스의 의미를 읽어 보시기 바랍니다.

이름 짓기에 - 변수 이름을 지키는 데있어 빠른 규칙이 없습니다.

코드에서 보듯이 p는 고유 한 유형의 객체를 나타내며 i는 인터페이스에서만 정의 된 객체를 나타냅니다. 하지만 참고로, 참조하는 인터페이스와 동일한 이름으로 변수를 호출하는 것은 (소문자 'i'제외) 나쁜 일을하는 것이고, 혼란을 가져올 것입니다. (IMO)

편집 : (죄송합니다, 제가 원래 놓친) 이 당신의 마지막 질문에 대답하려면 :

pGraphContLayout.FindFrame는() 형식의 개체 MapFrame를 반환 (그리고 그 보장이없는 경우) 당신은 IMapGrids에 걸쳐 간단히 캐스팅 할 수 있어야 않습니다 : 그것은 당신 같은 소리

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

는 인터페이스의 목적을 제공하는 것 파이썬의 추상 기본 클래스, 혼동하기 할 수있다 ...? 이 스레드는 유용합니다 : Difference between abstract class and interface in Python

+0

위의 내 질문에 따라 모든 것을 동의합니다. 초급자로서 제 질문은이 정보를 어떻게 전달합니까 (마카니즘, 코드 라인을 볼 필요가 있음)입니다. 나는 새로운 MapFrame 객체 (pMapFrame = NewObj (esriCarto.MapFrame, esriCarto.IMapFrame))를 만드는 방법을 알고 있지만 IFrameElement로부터 정보를 상속받는 방법을 알고있다. 대부분의 예제는 VB 나 C# 또는 C++에 있으며, 구체적으로 어떻게하는지 설명하지는 않는다. – Tomek

+0

@Tomek : 원래의 답변을 업데이트했습니다. MapFrame 유형의 객체가 있고 IFrameElement의 메서드를 사용하려면 thisFE = CType (pMapFrame, IFrameElement)을 호출하면됩니다. – Juffy

+0

감사합니다. 그게 전부입니다. 증서에 조금 혼란스러워했습니다. 다시 한번 감사드립니다. – Tomek

관련 문제