Wie erhalte ich ausgewählte Features / Geometrie aus der Windows-Zwischenablage in ArcMap / C #?

14

Ich habe ein benutzerdefiniertes Tool in ArcMap 10. Der Workflow sieht folgendermaßen aus:

  • Wählen Sie Features in einer Ebene mit dem Werkzeug "Features nach Rechteck auswählen" aus
  • Kopieren Sie die Features mit STRG + c in die Zwischenablage
  • Wählen Sie das benutzerdefinierte Werkzeug
  • Das Tool überprüft die Zwischenablage. Wenn ein kopiertes Feature in der Zwischenablage gefunden wird, ändert sich der Workflow

Ich habe auf http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html ein Beispiel gefunden, in dem ähnliche Dinge per Drag & Drop implementiert werden.

Das Beispiel zu befolgen und anzupassen und zu versuchen, Layer im Inhaltsverzeichnis in ArcMap mit STRG + c in die Zwischenablage zu kopieren, funktioniert für mich:

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

Ich kann das Objekt an ILayer senden, das funktioniert!

Der Versuch, dasselbe mit kopierten Features zu erreichen, funktioniert bei mir nicht, zumindest weiß ich nicht wirklich, was ich tun soll.

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

Sie sehen hier, dass das Objektformat "ESRI Geometry List" ist (von der ich online keine Informationen finden kann). Wie kann ich dieses Objekt "auspacken"? IFeatureSelection, IFeature, IGeometry funktionieren nicht.

Irgendwelche Ideen?

prisma.ph
quelle
+1 gute Frage. Wie haben Sie festgestellt, dass Sie "ESRI Geometry List" an GetData übergeben müssen?
Kirk Kuykendall
@ Kirk Kuykendall Ich kann clipBoardDataObject.GetFormats () aufrufen, das mir eine Liste des Formats gibt, dem die Daten zugeordnet sind. Das Ergebnis der Zeichenfolge für den Fall, dass ich Features in die Zwischenablage kopiert habe, ist "ESRI Geometry List".
prisma.ph
Angesichts der Tatsache, dass die Zwischenablage Funktionen enthält, ist die ESRI-Geometrieliste möglicherweise etwas irreführend. Ein Feature hat viel mehr als nur Geometrie. Ich frage mich, ob Sie jede Schnittstelle in jeder ESRI-Assembly reflektieren und durchschleifen können. Rufen Sie für jede Schnittstelle die entsprechende Anleitung ab und prüfen Sie, ob LoadObject etwas zurückgibt.
Kirk Kuykendall
Ich habe mit allen Schnittstellen von System, Carto, Geometry, Geodatabase und Frameworks getestet und keine funktionierende Schnittstelle gefunden. Vielleicht ist es eine Microsoft-Schnittstelle?
Goldorak84
Hat jemand eine Lösung gefunden? Ich habe auch versucht, auf System- und Geodatabase-Interfaces umzustellen, aber ohne Glück.

Antworten:

2

Ich habe etwas Ähnliches wie Ihr Tool / Workflow gemacht. Ich konnte auch nicht herausfinden, wie in einer automatisierten Fasion kopierte Features auf die entsprechende Ebene geleitet werden. Für meine Situation habe ich die ArcMap-Befehle " Kopieren" und "Einfügen" verwendet, um ausgewählte Features in einer Editiersitzung von einem Layer auf einen anderen zu verschieben. Der Benutzer musste lediglich den manuellen Schritt ausführen und die Zielebene definieren.

artwork21
quelle