¿Cómo obtener las Características / Geometría seleccionadas desde el Portapapeles de Windows en ArcMap / C #?

14

Tengo una herramienta personalizada en ArcMap 10. El flujo de trabajo es el siguiente:

  • Seleccionar entidades en una capa con la herramienta "Seleccionar entidades por rectángulo"
  • Copie las características en el Portapapeles utilizando STRG + c
  • Seleccione la herramienta personalizada
  • La herramienta comprueba el Portapapeles. En caso de encontrar una característica copiada en el Portapapeles, el flujo de trabajo cambia

Encontré un ejemplo en enlace donde se implementan cosas similares mediante arrastrar y soltar.

Seguir y adaptar el ejemplo e intentar copiar capas en la TDC en ArcMap al portapapeles usando STRG + c funciona 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 Funciones 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í se ve que el formato del objeto es "Lista de geometría ESRI" (del cual no puedo encontrar información en línea). Entonces, ¿cómo puedo "desempaquetar" este objeto? IFeatureSelection, IFeature, IGeometry no funciona.

¿Alguna idea?

    
pregunta prisma.ph 30.05.2012 - 17:06

1 respuesta

2

He hecho algo similar a su herramienta / flujo de trabajo. Yo tampoco pude descubrir cómo en una invasión automatizada dirigir directamente las funciones copiadas a la capa apropiada. Para mi situación, utilicé Comandos de ArcMap Copiar y pegar en mueva las entidades seleccionadas de una capa a otra mientras se encuentra en una sesión de edición. El usuario solo tenía que ejecutar el paso manual y definir la capa de destino.

    
respondido por el artwork21 23.01.2013 - 17:48

Lea otras preguntas en las etiquetas