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?