Come ottenere funzionalità / geometria selezionate dagli Appunti di Windows in ArcMap / C #?


14

Ho uno strumento personalizzato in ArcMap 10. Il flusso di lavoro è il seguente:

  • Seleziona Funzionalità in un livello con lo strumento "Seleziona funzionalità per rettangolo"
  • Copia le funzionalità negli Appunti usando STRG + c
  • Seleziona lo strumento personalizzato
  • Lo strumento controlla gli Appunti. In caso di ricerca di una funzione copiata negli Appunti, il flusso di lavoro cambia

Ho trovato un esempio su http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html dove sono implementate cose simili usando il drag and drop.

Seguire e adattare l'esempio e provare a copiare i livelli nel sommario negli ArcMap negli Appunti usando STRG + c funziona per me:

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

Posso lanciare l'oggetto su ILayer, questo funziona!

Cercare di ottenere lo stesso risultato con le funzioni copiate non funziona per me, almeno non so davvero cosa fare.

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

Vedete qui che il formato dell'oggetto è "Elenco Geometria ESRI" (di cui non trovo alcuna informazione online). Quindi, come posso "decomprimere" questo oggetto? IFeatureSelection, IFeature, IGeometry non funzioneranno.

Qualche idea?


+1 buona domanda. Come hai stabilito che dovevi passare "Elenco Geometria ESRI" a GetData?
Kirk Kuykendall,

@Kirk Kuykendall posso chiamare clipBoardDataObject.GetFormats () che mi dà un elenco del formato a cui sono associati i dati. Il risultato della stringa nel caso in cui ho copiato le funzionalità negli Appunti è "Elenco geometria ESRI".
prisma.ph

Dato che gli Appunti contengono funzionalità, penso che ESRI Geometry List potrebbe essere un po 'fuorviante. Una funzione ha molto più della semplice geometria. Mi chiedo se si possa usare la riflessione e scorrere attraverso ciascuna interfaccia in ciascun assieme ESRI. Per ogni interfaccia, ottieni la sua guida e vedi se LoadObject restituisce qualcosa.
Kirk Kuykendall,

Ho provato con tutte le interfacce di System, Carto, Geometry, Geodatabase e Frameworks e non ho trovato un'interfaccia che funzionasse. Forse è un'interfaccia di Microsoft?
Goldorak84

Qualcuno ha trovato una soluzione? Ho anche provato a trasmettere interfacce di sistema e geodatabase, ma senza fortuna.

Risposte:


2

Ho fatto qualcosa di simile al tuo strumento / flusso di lavoro. Anch'io non sono riuscito a capire come in una moda automatizzata dirigere le funzioni copiate sul livello appropriato. Per la mia situazione ho usato i comandi ArcMap Copia e incolla per spostare le funzioni selezionate da un livello a un altro durante una sessione di modifica. L'utente doveva solo eseguire il passaggio manuale e definire il livello target.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.