Я пытаюсь использовать ArcObject в Python. У меня есть проблема с назначением интерфейса (т.е. 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, поэтому, пожалуйста, будьте понятны. Любая помощь будет оценена.
arcobjects
python
Томек
источник
источник
Ответы:
IZ
Интерфейс реализован только наPolygon
иPolyline
классах, которые вы получаете от техShape
илиShapeCopy
свойств одногоIFeature
. Вы не можете использовать QI между интерфейсами, которые не поддерживаются (не реализуются или не наследуются) объектом. Используйте документацию для одного из ArcObjects SDK, чтобы увидеть интерфейсы, которые реализует каждый класс. Чтение диаграмм объектной модели (перечисленных под каждым пространством имен в справке, пример ) также может быть очень полезным, чтобы увидеть отношения наследования / реализации между различными классами и интерфейсами.Что касается вашего фактического рабочего процесса, вам нужно будет использовать метод
Update
вместо вSearch
вашем классе пространственных объектов, чтобы получить курсор обновления , а затем установитьShape
свойство объекта равным результатуInterpolateZsBetween
метода и, наконец, вызвать егоIFeatureCursor.UpdateFeature
(спасибо за исправление @Ragi ).источник