Arcobjects в Python: назначить интерфейс для объектов с геометрией объекта (формы)

10

Я пытаюсь использовать 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, поэтому, пожалуйста, будьте понятны. Любая помощь будет оценена.

Томек
источник
1
COM и Python выглядят не очень красиво, но это тот путь, который даст вам то, что вы хотите. +1 за то, что так быстро!
Раги Язер Бурхум
Вы можете сделать это с помощью некоторых вспомогательных функций .
blah238
Очевидно, что COM и Python не очень хорошо сочетаются друг с другом, но я подумал, что Python будет хорошим местом для начала моего приключения с программированием, поскольку оно кажется довольно удобным для пользователя. Как только я выполню эту задачу, я начну смотреть на C # или C ++. Большое спасибо, ребята.
Томек

Ответы:

4

IZИнтерфейс реализован только на Polygonи Polylineклассах, которые вы получаете от тех Shapeили ShapeCopyсвойств одного IFeature. Вы не можете использовать QI между интерфейсами, которые не поддерживаются (не реализуются или не наследуются) объектом. Используйте документацию для одного из ArcObjects SDK, чтобы увидеть интерфейсы, которые реализует каждый класс. Чтение диаграмм объектной модели (перечисленных под каждым пространством имен в справке, пример ) также может быть очень полезным, чтобы увидеть отношения наследования / реализации между различными классами и интерфейсами.

Что касается вашего фактического рабочего процесса, вам нужно будет использовать метод Updateвместо в Searchвашем классе пространственных объектов, чтобы получить курсор обновления , а затем установить Shapeсвойство объекта равным результату InterpolateZsBetweenметода и, наконец, вызвать его IFeatureCursor.UpdateFeature(спасибо за исправление @Ragi ).

blah238
источник
2
Все правильно, за исключением того, что вы не хотите вызывать IFeature :: Store с помощью UpdateCursor (это противоречит цели использования UpdateCursor). Вместо этого вы хотите вызвать UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Раги Язер Бурхум