Аркобекти в 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 між інтерфейсами, які не підтримуються (ні реалізовані, ні успадковані) об'єктом. Використовуйте документацію для одного з SDK ArcObjects, щоб переглянути інтерфейси, які реалізує кожен клас. Читання діаграм об'єктних моделей (перелічених у кожному просторі імен у довідці, прикладі ) також може бути дуже корисним для перегляду відносин успадкування / реалізації між різними класами та інтерфейсами.

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


2
Все правильно, за винятком того, що ви не хочете викликати IFeature :: Store за допомогою UpdateCursor (це перешкоджає використанню UpdateCursor). Замість цього потрібно зателефонувати на UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.