У ArcMap 10. у мене є спеціальний інструмент: Workflow такий:
- Виберіть "Особливості" на шарі за допомогою інструмента "Вибрати функції за допомогою прямокутника"
- Скопіюйте функції у буфер обміну за допомогою STRG + c
- Виберіть спеціальний інструмент
- Інструмент перевіряє буфер обміну. У разі пошуку скопійованої функції у буфері обміну робочий процес змінюється
Я знайшов приклад на http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html, де подібні речі реалізовані за допомогою перетягування.
Дотримуючись і адаптуючи приклад та намагаючись скопіювати шари в TOC в ArcMap до буфера обміну за допомогою STRG + c, працює для мене:
//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;
}
Я можу кинути об’єкт на ILayer, це працює!
Спроба домогтися того ж із скопійованими функціями для мене не працює, принаймні я не знаю, що робити.
//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?
Ви бачите тут, що формат об'єкта - це "Список геометрії ESRI" (про який я не можу знайти будь-яку інформацію в Інтернеті). То як я можу "розпакувати" цей об'єкт? IFeatureSelection, IFeature, IGeometry звичайні роботи.
Будь-які ідеї?