Arcobjects em Python: atribua interface a objetos com geometria de recurso (forma)

10

Estou tentando usar o ArcObject em Python. Tenho um problema ao atribuir uma interface (ou seja, IZ.InterpolateZsBetween) ao meu objeto com dados de geometria, o código é:

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)

Por que isso não está funcionando? A saída é:

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

Então eu tentei:

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

E isso está funcionando. Mas como colocá-lo de volta e salvá-lo no meu recurso? Estou aprendendo Python e ArcObjects, portanto, seja compreensivo. Qualquer ajuda será apreciada.

Tomek
fonte
1
COM e Python não parece muito bonito, mas esta é a rota que fará com que você deseje. +1 por chegar tão longe tão rápido!
Ragi Yaser Burhum 4/11
Você pode melhorar um pouco com algumas funções auxiliares .
precisa saber é o seguinte
Aparentemente, o COM e o Python não combinam bem, mas eu estava pensando que o Python seria um bom lugar para começar minha aventura com a programação, pois parece bastante amigável. Depois de concluir esta tarefa, começarei a olhar para C # ou C ++. Muito obrigado pessoal.
Tomek

Respostas:

4

A IZinterface é implementada apenas nas classes Polygone Polyline, que você obtém das propriedades Shapeou ShapeCopyde um IFeature. Você não pode fazer o controle de qualidade entre interfaces que não são suportadas (implementadas ou herdadas) por um objeto. Use a documentação de um dos SDKs do ArcObjects para ver as interfaces que cada classe implementa. A leitura dos diagramas de modelos de objetos (listados em cada espaço de nome na ajuda, por exemplo ) também pode ser muito útil para ver os relacionamentos de herança / implementação entre as várias classes e interfaces.

Quanto ao seu fluxo de trabalho real, você precisará usar o método em Updatevez de Searchna sua classe de recurso para obter um cursor de atualização e, em seguida, definir a Shapepropriedade do recurso para o resultado do InterpolateZsBetweenmétodo e, finalmente, chamar IFeatureCursor.UpdateFeature(obrigado pela correção @Ragi )

blah238
fonte
2
Tudo está correto, exceto que você não deseja chamar IFeature :: Store usando um UpdateCursor (isso anula o propósito de usar um UpdateCursor). Você deseja chamar UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum