Python'daki Arcobjects: özellik (şekil) geometrisine sahip nesnelere arayüz atayın


10

Python ArcObject kullanmaya çalışıyorum. Geometri verileri ile nesneme bir arabirim (yani IZ.InterpolateZsBetween) atama ile ilgili sorun var, kod:

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)

Neden çalışmıyor? Çıktı:

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

Bu yüzden denedim:

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

Ve bu işe yarıyor. Ama nasıl geri yapıştırabilir ve benim özelliğime kaydedebilirim? Python ve ArcObjects öğreniyorum, bu yüzden lütfen anlayın. Herhangi bir yardım takdir edilecektir.


1
COM ve Python çok hoş görünmüyor, ancak bu size istediğinizi sağlayacak yoldur. Bu kadar hızlı almak için +1!
Ragi Yaser Burhum


Görünüşe göre COM ve Python çift olarak iyi gitmiyor, ancak Python'un oldukça kullanıcı dostu göründüğü için maceraya programlama ile başlamak için iyi bir yer olacağını düşünüyordum. Bu görevi tamamladıktan sonra, C # veya C ++ 'a bakmaya başlayacağım. Çok teşekkürler çocuklar.
Tomek

Yanıtlar:


4

IZArayüzü yalnızca uygulanan Polygonve Polylinearalarından elde sınıfları, Shapeya da ShapeCopybir özellikleri IFeature. Bir nesne tarafından desteklenmeyen (uygulanmayan veya devralınan) arabirimler arasında QI olamaz. Her sınıfın uyguladığı arabirimleri görmek için ArcObjects SDK'larından birinin belgelerini kullanın . Nesne Modeli Diyagramları Okuma (yardım, her ad altında listelenen örnek ) aynı zamanda çeşitli sınıflar ve arayüzler arasındaki miras / uygulama ilişkileri görmek için çok yararlı olabilir.

Gerçek iş akışınıza gelince, bir güncelleme imleci elde etmek için özellik sınıfınızdaki yöntem Updateyerine kullanmanız ve daha sonra özelliğin özelliğini yöntemin sonucuna ayarlamanız ve son olarak çağırmanız gerekir (@Ragi düzeltmesi için teşekkürler) ).SearchShapeInterpolateZsBetweenIFeatureCursor.UpdateFeature


2
Bir UpdateCursor kullanarak IFeature :: Store'u çağırmak istememeniz dışında her şey doğrudur (bir UpdateCursor kullanma amacını yener). Bunun yerine UpdateFeature'ı çağırmak istiyorsunuz. help.arcgis.com/tr/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.