ArcMap / C # 'da Windows Panosundan seçilen Özellikler / Geometri nasıl alınır?


14

ArcMap 10'da özel bir aracım var. İş Akışı aşağıdaki gibidir:

  • "Dikdörtgene Göre Özellikleri Seç" aracıyla Katmandaki Özellikleri Seçme
  • STRG + c kullanarak Özellikleri Panoya Kopyalama
  • Özel aracı seçin
  • Araç Pano'yu kontrol eder. Pano'da kopyalanan bir Özellik bulunması durumunda İş Akışı değişir

Sürükle ve bırak yöntemiyle benzer şeylerin uygulandığı http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html'de bir örnek buldum .

Örneği takip etmek ve uyarlamak ve ArcMap'teki İçindekiler'deki katmanları STRG + c kullanarak panoya kopyalamaya çalışmak benim için çalışıyor:

//Get the Data from the Clipboard
IDataObject clipBoardDataObject = Clipboard.GetDataObject();

//The format of the object data is "ESRI Layers" (this can be checked using clipBoardDataObject.GetFormats();) 
MemoryStream geomStream = clipBoardDataObject.GetData("ESRI Layers") as MemoryStream;                
byte[] bytes = geomStream.ToArray();

IMemoryBlobStreamVariant memoryBlobStreamVariant = new MemoryBlobStreamClass();
memoryBlobStreamVariant.ImportFromVariant(bytes);
IMemoryBlobStream2 memoryBlobStream = memoryBlobStreamVariant as IMemoryBlobStream2;
IStream stream = memoryBlobStream as IStream;
IObjectStream objectStream = new ObjectStreamClass();
objectStream.Stream = stream;

byte pv;
uint cb = sizeof(int);
uint pcbRead;

objectStream.RemoteRead(out pv, cb, out pcbRead);
int count = Convert.ToInt32(pv);

//Guid you find in the ESRI ILayer Interface
Guid iLayerGuid = new Guid("34C20002-4D3C-11D0-92D8-00805F7C28B0");

for (int i = 0; i < count; i++)
{
  object o = objectStream.LoadObject(ref iLayerGuid, null);
  ILayer layer = o as ILayer;      
}

Nesneyi ILayer'a atabilirim, bu işe yarıyor!

Kopyalanan Özelliklerle aynı şeyi yapmaya çalışmak benim için işe yaramıyor, en azından ne yapacağımı gerçekten bilmiyorum.

//Get the Data from the Clipboard
IDataObject clipBoardDataObject = Clipboard.GetDataObject();

MemoryStream geomStream = clipBoardDataObject.GetData("ESRI Geometry List") as MemoryStream;                
byte[] bytes = geomStream.ToArray();

IMemoryBlobStreamVariant memoryBlobStreamVariant = new MemoryBlobStreamClass();
memoryBlobStreamVariant.ImportFromVariant(bytes);
IMemoryBlobStream2 memoryBlobStream = memoryBlobStreamVariant as IMemoryBlobStream2;
IStream stream = memoryBlobStream as IStream;
IObjectStream objectStream = new ObjectStreamClass();
objectStream.Stream = stream;

byte pv;
uint cb = sizeof(int);
uint pcbRead;

objectStream.RemoteRead(out pv, cb, out pcbRead);
int count = Convert.ToInt32(pv);

//What to do next? What object do I need to unpack to?

Burada nesne biçiminin "ESRI Geometri Listesi" olduğunu görüyorsunuz (bunlardan hiçbirini çevrimiçi olarak bulamıyorum). Peki bu nesneyi nasıl "açabilirim"? IFeatureSelection, IFeature, IGeometry çalışmaz.

Herhangi bir fikir?


+1 iyi soru. "ESRI Geometri Listesini" GetData'ya geçirmeniz gerektiğini nasıl belirlediniz?
Kirk Kuykendall

@Kirk Kuykendall, verilerin ilişkilendirildiği biçimin bir listesini veren clipBoardDataObject.GetFormats () öğesini çağırabilirim. İ panoya özellikleri kopyalamak durumunda dize sonucu "ESRI Geometri Listesi" dir.
prisma.ph

Pano özellikleri içerdiği göz önüne alındığında, ESRI Geometri Listesinin biraz yanıltıcı olabileceğini düşünüyorum. Bir özelliğin geometriden çok daha fazlası vardır. Her ESRI derlemesindeki her arabirimde yansıma ve döngü kullanıp kullanamayacağınızı merak ediyorum. Her arabirim için kılavuzunu alın ve LoadObject öğesinin bir şey döndürüp döndürmediğine bakın.
Kirk Kuykendall

System, Carto, Geometry, Geodatabase ve Frameworks'ten gelen tüm arayüzlerle test ettim ve çalışan bir arayüz bulamadım. Belki bir microsoft arayüzüdür?
Goldorak84

Birisi çözüm buldu mu? Ayrıca Sistem ve Geodatabase arayüzlerine döküm yapmayı denedim, ama hiç şansım yoktu.

Yanıtlar:


2

Aracınıza / iş akışınıza benzer bir şey yaptım. Ben de otomatik bir fasionda kopyalanan özellikleri uygun katmana nasıl yönlendireceğini anlayamadım. Durumumda , bir düzenleme oturumunda seçili özellikleri bir katmandan diğerine taşımak için ArcMap komutlarını Kopyala ve Yapıştır komutlarını kullandım . Kullanıcı sadece manuel adımı yürütmek ve hedef katmanı tanımlamak zorunda kaldı.

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.