Tengo una herramienta personalizada en ArcMap 10. El flujo de trabajo es el siguiente:
- Seleccione características en una capa con la herramienta "Seleccionar características por rectángulo"
- Copie las características en el Portapapeles usando STRG + c
- Seleccione la herramienta personalizada
- La herramienta verifica el Portapapeles. En caso de encontrar una característica copiada en el Portapapeles, el flujo de trabajo cambia
Encontré un ejemplo en http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html donde se implementan cosas similares usando arrastrar y soltar.
Seguir y adaptar el ejemplo e intentar copiar capas en la tabla de contenido en ArcMap al portapapeles usando STRG + c está funcionando para mí:
//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;
}
Puedo lanzar el objeto a ILayer, ¡esto está funcionando!
Intentar lograr lo mismo con las características copiadas no me funciona, al menos no sé qué hacer.
//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?
Aquí puede ver que el formato del objeto es "Lista de geometría ESRI" (de la cual no puedo encontrar ninguna información en línea). Entonces, ¿cómo puedo "descomprimir" este objeto? IFeatureSelection, IFeature, IGeometry no funcionarán.
¿Algunas ideas?