Arcobjects en Python: asigne interfaz a objetos con geometría de entidad (forma)

10

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.

Tomek
fuente
1
COM y Python no se ven muy bonitos, pero esta es la ruta que te dará lo que quieres. ¡+1 por llegar tan rápido!
Ragi Yaser Burhum
Puedes mejorarlo un poco con algunas funciones de ayuda .
blah238
Aparentemente, COM y Python no van bien en pareja, pero estaba pensando que Python sería un buen lugar para comenzar mi aventura con la programación, ya que parece bastante fácil de usar. Una vez que realice esta tarea, comenzaré a mirar C # o C ++. Muchas gracias chicos.
Tomek

Respuestas:

4

La IZinterfaz se implementa solo en las clases Polygony Polyline, que se obtienen de las propiedades Shapeo ShapeCopyde un IFeature. 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 de Searchmétodo en su clase de entidad para obtener un cursor de actualización , y luego establecer la Shapepropiedad de la característica en el resultado del InterpolateZsBetweenmétodo y finalmente llamar IFeatureCursor.UpdateFeature(gracias por la corrección @Ragi )

blah238
fuente
2
Todo es correcto, excepto que no desea llamar a IFeature :: Store usando un UpdateCursor (anula el propósito de usar un UpdateCursor). En su lugar, desea llamar a UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum el