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?
quelle
Antworten:
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.
quelle