Bagaimana cara mendapatkan Fitur / Geometri dari Windows Clipboard di ArcMap / C #?

14

Saya memiliki alat khusus di ArcMap 10. Alur kerjanya adalah sebagai berikut:

  • Pilih Fitur dalam Layer dengan alat "Select Features by Rectangle"
  • Salin Fitur ke Clipboard menggunakan STRG + c
  • Pilih alat kustom
  • Alat memeriksa Papan Klip. Jika menemukan Fitur yang disalin di Clipboard, Workflow akan berubah

Saya menemukan contoh di http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html di mana hal serupa diimplementasikan menggunakan seret dan lepas.

Mengikuti dan mengadaptasi contoh dan mencoba menyalin lapisan di TOC di ArcMap ke clipboard menggunakan STRG + c bekerja untuk saya:

//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;      
}

Saya dapat melemparkan objek ke ILayer, ini berfungsi!

Mencoba mencapai hal yang sama dengan Fitur yang disalin tidak berfungsi untuk saya, setidaknya saya tidak benar-benar tahu harus berbuat apa.

//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?

Anda lihat di sini bahwa format objek adalah "Daftar Geometri ESRI" (yang saya tidak dapat menemukan informasi online). Jadi bagaimana saya bisa "membongkar" objek ini? Pemilihan IFeature, IFeature, IGeometry tidak akan berfungsi.

Ada Ide?

prisma.ph
sumber
+1 pertanyaan bagus. Bagaimana Anda menentukan Anda harus lulus "ESRI Geometry List" ke GetData?
Kirk Kuykendall
@Kirk Kuykendall saya bisa memanggil clipBoardDataObject.GetFormats () yang memberi saya daftar format yang terkait dengan data. Hasil string jika saya menyalin fitur ke clipboard adalah "ESRI Geometry List".
prisma.ph
Mengingat clipboard itu berisi fitur, saya pikir ESRI Geometry List mungkin agak menyesatkan. Sebuah fitur memiliki lebih dari sekadar geometri. Saya ingin tahu apakah Anda dapat menggunakan refleksi dan loop melalui setiap antarmuka di setiap perakitan ESRI. Untuk setiap antarmuka, dapatkan panduannya dan lihat apakah LoadObject mengembalikan sesuatu.
Kirk Kuykendall
Saya menguji dengan semua antarmuka dari System, Carto, Geometry, Geodatabase dan Frameworks dan saya tidak menemukan antarmuka yang berfungsi. Mungkin itu antarmuka microsoft?
Goldorak84
Adakah yang menemukan solusi? Saya juga mencoba casting ke System dan Geodatabase interface, tetapi tidak berhasil.

Jawaban:

2

Saya telah melakukan sesuatu yang mirip dengan alat / alur kerja Anda. Saya juga tidak tahu bagaimana dalam fasi otomatis untuk mengarahkan fitur yang disalin ke lapisan yang sesuai. Untuk situasi saya, saya menggunakan perintah ArcMap Salin dan Tempel untuk memindahkan fitur yang dipilih dari satu lapisan ke lapisan lainnya saat dalam sesi edit. Pengguna hanya perlu menjalankan langkah manual dan menentukan layer target.

artwork21
sumber