Jak uzyskać wybrane funkcje / geometrię ze schowka Windows w ArcMap / C #?

14

Mam niestandardowe narzędzie w ArcMap 10. Przepływ pracy jest następujący:

  • Wybierz elementy w warstwie za pomocą narzędzia „Wybierz elementy według prostokąta”
  • Skopiuj funkcje do schowka za pomocą STRG + c
  • Wybierz narzędzie niestandardowe
  • Narzędzie sprawdza Schowek. W przypadku znalezienia skopiowanej funkcji w schowku zmienia się przepływ pracy

Znalazłem przykład na http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html, gdzie podobne rzeczy są wdrażane za pomocą przeciągania i upuszczania.

Śledzenie i dostosowanie przykładu oraz próba skopiowania warstw ze spisu treści w ArcMap do schowka za pomocą STRG + c działa dla mnie:

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

Mogę rzucić obiekt na ILayer, to działa!

Próbowanie osiągnięcia tego samego za pomocą skopiowanych funkcji nie działa dla mnie, a przynajmniej tak naprawdę nie wiem, co robić.

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

Widzisz tutaj, że formatem obiektu jest „Lista geometrii ESRI” (o której nie mogę znaleźć żadnych informacji online). Jak więc mogę „rozpakować” ten obiekt? IFeatureSelection, IFeature, IGeometry nie będzie działać.

Jakieś pomysły?

prisma.ph
źródło
+1 dobre pytanie. Jak ustaliłeś, że musisz przekazać „listę geometrii ESRI” do GetData?
Kirk Kuykendall
@Kirk Kuykendall mogę wywołać clipBoardDataObject.GetFormats (), który daje mi listę formatu, z którym dane są powiązane. Wynikiem ciągu w przypadku, gdy skopiowałem obiekty do schowka, jest „Lista geometrii ESRI”.
prisma.ph
Biorąc pod uwagę, że schowek zawiera funkcje, myślę, że lista geometrii ESRI może być nieco myląca. Cecha ma znacznie więcej niż tylko geometrię. Zastanawiam się, czy można użyć odbicia i pętli przez każdy interfejs w każdym zestawie ESRI. Dla każdego interfejsu pobierz jego identyfikator i sprawdź, czy LoadObject cokolwiek zwraca.
Kirk Kuykendall
Testowałem ze wszystkimi interfejsami z Systemu, Carto, Geometrii, Geobazy i Frameworków i nie znalazłem interfejsu, który działałby. Może to jest interfejs Microsoft?
Goldorak84,
Czy ktoś znalazł rozwiązanie? Próbowałem także przesyłać do interfejsów System i Geodatabase, ale bez powodzenia.

Odpowiedzi:

2

Zrobiłem coś podobnego do twojego narzędzia / przepływu pracy. Ja też nie mogłem wymyślić, jak w zautomatyzowanej fascynacji przekierować funkcje do odpowiedniej warstwy. W mojej sytuacji użyłem poleceń ArcMap Kopiuj i Wklej, aby przenieść wybrane elementy z jednej warstwy na drugą podczas sesji edycji. Użytkownik musiał po prostu wykonać krok ręczny i zdefiniować warstwę docelową.

grafika 21
źródło