¿Cómo obtener funciones / geometría seleccionadas del portapapeles de Windows en ArcMap / C #?

14

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?

prisma.ph
fuente
+1 buena pregunta. ¿Cómo determinó que necesitaba pasar la "Lista de geometría de ESRI" a GetData?
Kirk Kuykendall
@Kirk Kuykendall puedo llamar a clipBoardDataObject.GetFormats () que me da una lista del formato con el que están asociados los datos. El resultado de la cadena en caso de que copie características en el portapapeles es "Lista de geometría ESRI".
prisma.ph
Dado que el portapapeles contiene características, creo que ESRI Geometry List podría ser un poco engañoso. Una característica tiene mucho más que solo geometría. Me pregunto si podría usar la reflexión y recorrer cada interfaz en cada ensamblaje de ESRI. Para cada interfaz, obtenga su guid y vea si LoadObject devuelve algo.
Kirk Kuykendall
Probé con todas las interfaces de System, Carto, Geometry, Geodatabase y Frameworks y no encontré una interfaz que funcionara. Tal vez es una interfaz de microsoft?
Goldorak84
¿Alguien encontró la solución? También intenté transmitir a las interfaces del sistema y la geodatabase, pero sin suerte.

Respuestas:

2

He hecho algo similar a su herramienta / flujo de trabajo. Tampoco pude entender cómo en un fasion automatizado dirigir las funciones copiadas a la capa adecuada. Para mi situación, utilicé los comandos ArcMap Copiar y Pegar para mover entidades seleccionadas de una capa a otra mientras estaba en una sesión de edición. El usuario solo tenía que ejecutar el paso manual y definir la capa de destino.

artwork21
fuente