Arcobjects in Python: przypisuj interfejs do obiektów o geometrii elementu (kształtu)

10

Próbuję użyć ArcObject w Pythonie. Mam problem z przypisaniem interfejsu (tj. IZ.InterpolateZsBetween) do mojego obiektu z danymi geometrycznymi, kod to:

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)

Dlaczego to nie działa? Dane wyjściowe to:

 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))

Więc próbowałem:

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

I to działa. Ale jak go przykleić i zapisać w mojej funkcji? Uczę się Pythona i ArcObjects, więc prosimy o wyrozumiałość. Każda pomoc będzie mile widziana.

Tomek
źródło
1
COM i Python nie wyglądają ładnie, ale jest to trasa, która zapewni Ci to, czego chcesz. +1 za szybkie dotarcie tak daleko!
Ragi Yaser Burhum,
Możesz to trochę poprawić dzięki niektórym funkcjom pomocniczym .
blah238,
Najwyraźniej COM i Python nie pasują do siebie, ale myślałem, że Python będzie dobrym miejscem do rozpoczęcia mojej przygody z programowaniem, ponieważ wydaje się dość przyjazny dla użytkownika. Kiedy wykonam to zadanie, zacznę patrzeć na C # lub C ++. Wielkie dzięki chłopaki.
Tomek

Odpowiedzi:

4

IZInterfejs jest realizowane tylko na Polygoni Polylineklas, które można uzyskać z Shapelub ShapeCopywłaściwości powierzchni IFeature. Nie można QI między interfejsami, które nie są obsługiwane (implementowane lub dziedziczone) przez obiekt. Skorzystaj z dokumentacji jednego z zestawów ArcObjects SDK, aby zobaczyć interfejsy implementowane przez każdą klasę. Czytanie diagramów modeli obiektowych (wymienionych pod każdą przestrzenią nazw w pomocy, przykład ) może być również bardzo pomocne, aby zobaczyć relacje dziedziczenia / implementacji między różnymi klasami i interfejsami.

Jeśli chodzi o rzeczywisty przepływ pracy, musisz użyć metody Updatezamiast Searchw swojej klasie elementów, aby uzyskać kursor aktualizacji , a następnie ustawić Shapewłaściwość funkcji na wynik InterpolateZsBetweenmetody i na końcu wywołać IFeatureCursor.UpdateFeature(dzięki za korektę @Ragi ).

blah238
źródło
2
Wszystko jest poprawne, z wyjątkiem tego, że nie chcesz wywoływać IFeature :: Store za pomocą UpdateCursor (to przeczy celowi użycia UpdateCursor). Zamiast tego chcesz wywołać funkcję UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum