Arcobjects en Python: attribuer une interface aux objets avec une géométrie d'entité (forme)

10

J'essaie d'utiliser ArcObject en Python. J'ai un problème avec l'attribution d'une interface (ie IZ.InterpolateZsBetween) à mon objet avec des données de géométrie, le code est:

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)

Pourquoi ça ne marche pas? La sortie est:

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

J'ai donc essayé:

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

Et cela fonctionne. Mais comment le coller et l'enregistrer dans ma fonction? J'apprends Python et ArcObjects, alors soyez compréhensif. Toute aide serait appréciée.

Tomek
la source
1
COM et Python ne sont pas très jolis, mais c'est la route qui vous donnera ce que vous voulez. +1 pour aller si loin si vite!
Ragi Yaser Burhum
Vous pouvez le peaufiner un peu avec certaines fonctions d'assistance .
blah238
Apparemment COM et Python ne vont pas bien en paire, mais je pensais que Python serait un bon endroit pour commencer mon aventure avec la programmation car cela semble assez convivial. Une fois que j'aurai accompli cette tâche, je commencerai à regarder C # ou C ++. Merci beaucoup les gars.
Tomek

Réponses:

4

L' IZinterface est implémentée uniquement sur les classes Polygonet Polyline, que vous obtenez à partir des propriétés Shapeou ShapeCopyd'un IFeature. Vous ne pouvez pas effectuer d'interface utilisateur entre des interfaces qui ne sont pas prises en charge (implémentées ou héritées) par un objet. Utilisez la documentation de l'un des SDK ArcObjects pour voir les interfaces que chaque classe implémente. La lecture des diagrammes de modèle d'objet (répertoriés sous chaque espace de noms dans l'aide, exemple ) peut également être très utile pour voir les relations d'héritage / implémentation entre les différentes classes et interfaces.

Quant à votre flux de travail réel, vous devrez utiliser la méthode au Updatelieu de Searchsur votre classe d'entités pour obtenir un curseur de mise à jour , puis définir la Shapepropriété de la fonction sur le résultat de la InterpolateZsBetweenméthode et enfin appeler IFeatureCursor.UpdateFeature(merci pour la correction @Ragi ).

blah238
la source
2
Tout est correct, sauf que vous ne voulez pas appeler IFeature :: Store à l'aide d'un UpdateCursor (cela va à l'encontre de l'utilisation d'un UpdateCursor). Vous souhaitez appeler UpdateFeature à la place. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum