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.
arcobjects
python
Tomek
źródło
źródło
Odpowiedzi:
IZ
Interfejs jest realizowane tylko naPolygon
iPolyline
klas, które można uzyskać zShape
lubShapeCopy
właściwości powierzchniIFeature
. 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
Update
zamiastSearch
w swojej klasie elementów, aby uzyskać kursor aktualizacji , a następnie ustawićShape
właściwość funkcji na wynikInterpolateZsBetween
metody i na końcu wywołaćIFeatureCursor.UpdateFeature
(dzięki za korektę @Ragi ).źródło