Як отримати вибрані функції / геометрію з буфера обміну Windows в ArcMap / C #?


14

У 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 звичайні роботи.

Будь-які ідеї?


+1 хороше запитання. Як ви визначили, що вам потрібно передати "Список геометрії ESRI" в GetData?
Кірк Куйкендалл

@Kirk Kuykendall я можу зателефонувати clipBoardDataObject.GetFormats (), який дає мені список формату, з яким пов’язані дані. Результатом рядка у випадку, якщо я скопіював функції в буфер обміну, є "Список геометрії ESRI".
призма.ph

Зважаючи на те, що буфер обміну містить функції, я думаю, що список геометрії ESRI може бути трохи оманливим. Особливість має набагато більше, ніж просто геометрія. Цікаво, чи могли ви використовувати відображення та циклічність через кожен інтерфейс у кожному складі ESRI. Для кожного інтерфейсу знайдіть його орієнтир і подивіться, чи LoadObject повертає що-небудь.
Кірк Куйкендалл

Я перевірив усі інтерфейси System, Carto, Geometry, Geodatabase і Frameworks, і не знайшов інтерфейс, який працював. Може це інтерфейс мікрософт?
Goldorak84

Хтось знайшов рішення? Я також спробував робити кастинг на інтерфейси System та Geodatabase, але без жодної удачі.

Відповіді:


2

Я зробив щось подібне до вашого інструменту / робочого процесу. Я теж не міг зрозуміти, як в автоматизованому файлі направити скопійовані функції на відповідний шар. Для моєї ситуації я використовував команди ArcMap Copy and Paste для переміщення вибраних функцій з одного шару в інший під час сеансу редагування. Користувачеві просто потрібно було виконати крок вручну та визначити цільовий рівень.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.