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
IZ
interfaz se implementa solo en las clasesPolygon
yPolyline
, que se obtienen de las propiedadesShape
oShapeCopy
de 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
Update
lugar deSearch
método en su clase de entidad para obtener un cursor de actualización , y luego establecer laShape
propiedad de la característica en el resultado delInterpolateZsBetween
método y finalmente llamarIFeatureCursor.UpdateFeature
(gracias por la corrección @Ragi )fuente