Arcobjects in Python: Weisen Sie Objekten mit Feature- (Form-) Geometrie eine Schnittstelle zu

10

Ich versuche, ArcObject in Python zu verwenden. Ich habe Probleme beim Zuweisen einer Schnittstelle (dh IZ.InterpolateZsBetween) zu meinem Objekt mit Geometriedaten. Der Code lautet:

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)

Warum funktioniert das nicht? Die Ausgabe ist:

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

Also habe ich versucht:

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

Und das funktioniert. Aber wie kann ich es zurückkleben und in meiner Funktion speichern? Ich lerne Python und ArcObjects, bitte seien Sie verständlich. Jede Hilfe wird geschätzt.

Tomek
quelle
1
COM und Python sehen nicht sehr hübsch aus, aber dies ist die Route, auf der Sie das bekommen, was Sie wollen. +1 dafür, dass du so schnell so weit gekommen bist!
Ragi Yaser Burhum
Sie können es mit einigen Hilfsfunktionen ein wenig aufpeppen .
blah238
Offensichtlich passen COM und Python nicht gut zusammen, aber ich dachte, Python wäre ein guter Ort, um mein Abenteuer mit dem Programmieren zu beginnen, da es recht benutzerfreundlich erscheint. Sobald ich diese Aufgabe erledigt habe, werde ich mich mit C # oder C ++ befassen. Vielen Dank, Jungs.
Tomek

Antworten:

4

Die IZSchnittstelle ist nur für die Klassen Polygonund implementiert Polyline, die Sie aus den Eigenschaften Shapeoder ShapeCopyvon erhalten IFeature. Sie können keine QI zwischen Schnittstellen durchführen, die von einem Objekt nicht unterstützt (entweder implementiert oder geerbt) werden. Verwenden Sie die Dokumentation für eines der ArcObjects-SDKs , um die Schnittstellen anzuzeigen , die jede Klasse implementiert. Das Objektmodell Diagramme lesen (unter jedem Namensraum in der Hilfe aufgeführten Beispiel ) kann auch sehr hilfreich sein , die Vererbung / Umsetzung Beziehungen zwischen den verschiedenen Klassen und Schnittstellen zu sehen.

Für Ihren eigentlichen Workflow müssen Sie die Methode Updateanstelle von Searchin Ihrer Feature-Class verwenden, um einen Aktualisierungscursor zu erhalten. Anschließend müssen Sie die ShapeEigenschaft des Features auf das Ergebnis der InterpolateZsBetweenMethode setzen und schließlich aufrufen IFeatureCursor.UpdateFeature(danke für die Korrektur @Ragi) ).

blah238
quelle
2
Alles ist korrekt, außer dass Sie IFeature :: Store nicht mit einem UpdateCursor aufrufen möchten (dies macht den Zweck der Verwendung eines UpdateCursors zunichte). Sie möchten stattdessen UpdateFeature aufrufen. help.arcgis.com/de/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum