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.
arcobjects
python
Tomek
la source
la source
Réponses:
L'
IZ
interface est implémentée uniquement sur les classesPolygon
etPolyline
, que vous obtenez à partir des propriétésShape
ouShapeCopy
d'unIFeature
. 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
Update
lieu deSearch
sur votre classe d'entités pour obtenir un curseur de mise à jour , puis définir laShape
propriété de la fonction sur le résultat de laInterpolateZsBetween
méthode et enfin appelerIFeatureCursor.UpdateFeature
(merci pour la correction @Ragi ).la source