Estoy tratando de usar ArcObject en Python. Tengo problemas para asignar una interfaz (es decir, IZ.InterpolateZsBetween) a mi objeto con datos de geometría, el código es:
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 qué esto no funciona? El resultado es:
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))
Entonces intenté:
pShape = pFeat.ShapeCopy
pIZ = pShape.QueryInterface(esriGeometry.IZ2)
pShape.InterpolateZsBetween(0, 0, 0, 4)
Y esto está funcionando. Pero, ¿cómo pegarlo y guardarlo en mi función? Estoy aprendiendo Python y ArcObjects, así que por favor sé comprensivo. Cualquier ayuda será apreciada.
arcobjects
python
Tomek
fuente
fuente

Respuestas:
La
IZinterfaz se implementa solo en las clasesPolygonyPolyline, que se obtienen de las propiedadesShapeoShapeCopyde unIFeature. No puede QI entre interfaces que no son compatibles (implementadas o heredadas) por un objeto. Use la documentación de uno de los SDK de ArcObjects para ver las interfaces que implementa cada clase. Leer los diagramas del modelo de objetos (enumerados debajo de cada espacio de nombres en la ayuda, por ejemplo ) también puede ser muy útil para ver las relaciones de herencia / implementación entre las diversas clases e interfaces.En cuanto a su flujo de trabajo real, deberá usar el método en
Updatelugar deSearchmétodo en su clase de entidad para obtener un cursor de actualización , y luego establecer laShapepropiedad de la característica en el resultado delInterpolateZsBetweenmétodo y finalmente llamarIFeatureCursor.UpdateFeature(gracias por la corrección @Ragi )fuente