J'ai un outil personnalisé dans ArcMap 10. Le workflow est le suivant:
- Sélectionner des entités dans un calque avec l'outil "Sélectionner des entités par rectangle"
- Copiez les fonctionnalités dans le presse-papiers à l'aide de STRG + c
- Sélectionnez l'outil personnalisé
- L'outil vérifie le Presse-papiers. En cas de recherche d'une fonction copiée dans le presse-papiers, le workflow change
J'ai trouvé un exemple sur http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html où des choses similaires sont implémentées par glisser-déposer.
Suivre et adapter l'exemple et essayer de copier des couches de la table des matières dans ArcMap dans le presse-papiers à l'aide de STRG + c fonctionne pour moi:
//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;
}
Je peux lancer l'objet sur ILayer, cela fonctionne!
Essayer de faire la même chose avec les fonctionnalités copiées ne fonctionne pas pour moi, au moins je ne sais pas vraiment quoi faire.
//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?
Vous voyez ici que le format de l'objet est "ESRI Geometry List" (dont je ne trouve aucune information en ligne). Alors, comment puis-je "déballer" cet objet? IFeatureSelection, IFeature, IGeometry ne fonctionnera pas.
Des idées?
la source
Réponses:
J'ai fait quelque chose de similaire à votre outil / workflow. Moi aussi, je ne pouvais pas comprendre comment, dans un mode automatisé, diriger les entités copiées vers la couche appropriée. Pour ma situation, j'ai utilisé les commandes ArcMap Copier et Coller pour déplacer les entités sélectionnées d'une couche à une autre lors d'une session d'édition. L'utilisateur devait simplement exécuter l'étape manuelle et définir la couche cible.
la source