Comment obtenir des entités / géométrie sélectionnées à partir du presse-papiers Windows dans ArcMap / C #?

14

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?

prisma.ph
la source
+1 bonne question. Comment avez-vous déterminé que vous aviez besoin de passer la «Liste de géométrie ESRI» à GetData?
Kirk Kuykendall
@Kirk Kuykendall je peux appeler clipBoardDataObject.GetFormats () qui me donne une liste du format auquel les données sont associées. Le résultat de la chaîne au cas où j'aurais copié des entités dans le presse-papiers est "ESRI Geometry List".
prisma.ph
Étant donné que le presse-papiers contient des fonctionnalités, je pense que la liste de géométrie ESRI peut être un peu trompeuse. Une entité a bien plus qu'une simple géométrie. Je me demande si vous pourriez utiliser la réflexion et la boucle à travers chaque interface dans chaque assemblage ESRI. Pour chaque interface, obtenez son guide et voyez si LoadObject renvoie quelque chose.
Kirk Kuykendall
J'ai testé avec toutes les interfaces de System, Carto, Geometry, Geodatabase et Frameworks et je n'ai pas trouvé d'interface qui fonctionnait. C'est peut-être une interface Microsoft?
Goldorak84
Quelqu'un a-t-il trouvé une solution? J'ai également essayé de diffuser des contenus vers les interfaces système et géodatabase, mais sans aucune chance.

Réponses:

2

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.

oeuvre21
la source