Arcobjects in Python: assegna l'interfaccia agli oggetti con geometria caratteristica (forma)


10

Sto cercando di usare ArcObject in Python. Ho problemi con l'assegnazione di un'interfaccia (cioè IZ.InterpolateZsB Between) al mio oggetto con i dati della geometria, il codice è:

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)

Perché questo non funziona? L'output è:

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

Quindi ho provato:

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

E questo sta funzionando. Ma come ripristinarlo e salvarlo nella mia funzione? Sto imparando Python e ArcObjects, quindi per favore sii comprensivo. Qualsiasi aiuto sarà apprezzato.


1
COM e Python non sembrano molto belli, ma questa è la strada che ti porterà quello che vuoi. +1 per arrivare così in fretta!
Ragi Yaser Burhum,

Puoi risolverlo un po 'con alcune funzioni di aiuto .
blah238,

A quanto pare COM e Python non vanno bene in coppia, ma stavo pensando che Python sarebbe stato il posto giusto per iniziare la mia avventura con la programmazione in quanto sembra abbastanza facile da usare. Una volta completato questo compito, inizierò a guardare C # o C ++. Grazie mille ragazzi.
Tomek,

Risposte:


4

L' IZinterfaccia è implementata solo sulle classi Polygone Polyline, che si ottengono dalle proprietà Shapeo ShapeCopydi un IFeature. Non è possibile eseguire il QI tra interfacce non supportate (implementate o ereditate) da un oggetto. Utilizzare la documentazione di uno degli SDK ArcObjects per visualizzare le interfacce implementate da ciascuna classe. La lettura dei diagrammi dei modelli di oggetti (elencati sotto ogni spazio dei nomi nella guida, esempio ) può anche essere molto utile per vedere le relazioni di ereditarietà / implementazione tra le varie classi e interfacce.

Per quanto riguarda il tuo flusso di lavoro effettivo, dovrai utilizzare il metodo Updateanziché il Searchmetodo sulla tua classe di caratteristiche per ottenere un cursore di aggiornamento , quindi impostare la Shapeproprietà della funzione sul risultato del InterpolateZsBetweenmetodo e infine chiamare IFeatureCursor.UpdateFeature(grazie per la correzione @Ragi ).


2
Tutto è corretto, tranne che non si desidera chiamare IFeature :: Store utilizzando un UpdateCursor (vanifica lo scopo di utilizzare un UpdateCursor). Si desidera chiamare invece UpdateFeature. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.