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.
arcobjects
python
Tomek
fonte
fonte
Respostas:
A
IZ
interface é implementada apenas nas classesPolygon
ePolyline
, que você obtém das propriedadesShape
ouShapeCopy
de umIFeature
. 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
Update
vez deSearch
na sua classe de recurso para obter um cursor de atualização e, em seguida, definir aShape
propriedade do recurso para o resultado doInterpolateZsBetween
método e, finalmente, chamarIFeatureCursor.UpdateFeature
(obrigado pela correção @Ragi )fonte