Python의 ArcObjects : 형상 (모양) 형상을 가진 객체에 인터페이스 할당


10

Python에서 ArcObject를 사용하려고합니다. 지오메트리 데이터로 객체에 인터페이스 (예 : IZ.InterpolateZsBetween)를 할당하는 데 문제가 있습니다. 코드는 다음과 같습니다.

from Comtypes.client import CreateObject, GetModule
import arcgisscripting

gp = arcgisscripting.create(9.3)
gp.setproduct("ArcInfo")

esriSystem = GetModule("C:/Program Files (x86)/ArcGIS/com/esriSystem.olb")
esriGeometry = GetModule("C:/Program Files (x86)/ArcGIS/com/esriGeometry.olb")
esriDataSourcesGDB = GetModule("C:/Program Files (x86)/ArcGIS/com/esriDataSourcesGDB.olb")
esriGeoDatabase = GetModule("C:/Program Files (x86)/ArcGIS/com/esriGeoDatabase.olb")

sPath ="c:/temp/test.gdb"
pWSF = CreateObject(esriDataSourcesGDB.FileGDBWorkspaceFactory,\
                    interface=esriGeoDatabase.IWorkspaceFactory)
pWS = pWSF.OpenFromFile(sPath, 0)
pFWS = pWS.QueryInterface(esriGeoDatabase.IFeatureWorkspace)
pFClass = pFWS.OpenFeatureClass("test_z")
pFCursor = pFClass.Search(None, True)
pFeat = pFCursor.NextFeature()
pIZ = pFeat.QueryInferface(esriGeometry.IZ2)

왜 이것이 작동하지 않습니까? 출력은 다음과 같습니다.

 Traceback (most recent call last):
  File "<pyshell#175>", line 1, in <module>
    pIZ = pFeat.QueryInterface(esriGeometry.IZ2)
   File "C:\Python25\lib\site-packages\comtypes\__init__.py", line 1078, in QueryInterface
 self.__com_QueryInterface(byref(iid), byref(p))
 COMError: (-2147467262, 'Taki interfejs nie jest obs\xb3ugiwany.', (None, None, None, 0, 
 None))

그래서 나는 시도했다 :

pShape = pFeat.ShapeCopy
pIZ = pShape.QueryInterface(esriGeometry.IZ2)
pShape.InterpolateZsBetween(0, 0, 0, 4)

그리고 이것은 효과가 있습니다. 그러나 그것을 다시 붙이고 내 기능에 저장하는 방법은 무엇입니까? 저는 Python과 ArcObjects를 배우고 있으므로 이해하십시오. 도움을 주시면 감사하겠습니다.


1
COM과 Python은 예쁘지 않지만 이것이 원하는 것을 얻을 수있는 경로입니다. 이것을 너무 빨리 얻기위한 +1!
Ragi Yaser Burhum

당신은 약간의 도우미 기능으로 그것을 예쁘게 꾸밀 수 있습니다 .
blah238

분명히 COM과 Python은 잘 어울리지 않지만 Python은 사용자 친화적 인 것처럼 프로그래밍으로 모험을 시작하기에 좋은 장소라고 생각했습니다. 이 작업을 완료하면 C # 또는 C ++를 살펴보기 시작합니다. 많은 분들 감사합니다.
Tomek

답변:


4

IZ인터페이스 만에 구현 Polygon하고 Polyline당신이에서 얻을 수 클래스, Shape또는 ShapeCopy의 속성 IFeature. 개체가 지원하지 않는 (구현되거나 상속 된) 인터페이스간에 QI를 수행 할 수 없습니다. ArcObjects SDK 중 하나의 설명서를 사용하여 각 클래스가 구현하는 인터페이스를 확인하십시오. 개체 모델 다이어그램 읽기 (도움, 각 네임 스페이스 아래에 나열된 예를하는 것은 ) 또한 다양한 클래스와 인터페이스 사이의 상속 / 구현 관계를 보는 것은 매우 도움이 될 수 있습니다.

실제 워크 플로우의 경우 기능 클래스에서 메소드 Update대신 Search메소드를 사용하여 업데이트 커서 를 얻은 다음 Shape기능의 특성을 InterpolateZsBetween메소드 의 결과로 설정 하고 마지막으로 호출합니다 IFeatureCursor.UpdateFeature(@Ragi 수정에 대한 감사합니다) ).


2
UpdateCursor를 사용하여 IFeature :: Store를 호출하지 않으려는 경우를 제외하고는 모두 정확합니다 (UpdateCursor 사용 목적을 무효화 함). 대신 UpdateFeature를 호출하려고합니다. help.arcgis.com/ko/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.