ArcMap / C#でWindowsクリップボードから選択したフィーチャ/ジオメトリを取得する方法


14

ArcMap 10にはカスタムツールがあります。ワークフローは次のとおりです。

  • 「長方形でフィーチャを選択」ツールを使用してレイヤー内のフィーチャを選択します
  • STRG + cを使用して機能をクリップボードにコピーします
  • カスタムツールを選択します
  • ツールはクリップボードをチェックします。クリップボードでコピーされたフィーチャーを見つける場合、ワークフローが変更されます

http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.htmlで、ドラッグアンドドロップを使用して同様の機能が実装されている例を見つけました。

この例に従って、適応し、STRC + cを使用してArcMapのTOC内のレイヤーをクリップボードにコピーしようとしています。

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

オブジェクトをILayerにキャストできます。これは機能しています!

コピーされた機能で同じことを達成しようとしても、私にとってはうまくいきません。少なくとも、どうすればいいかわかりません。

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

ここで、オブジェクト形式が「ESRI Geometry List」であることがわかります(オンラインで情報を見つけることができません)。それでは、このオブジェクトをどのように「アンパック」できますか?IFeatureSelection、IFeature、IGeometryは機能しません。

何か案は?


良い質問+1。「ESRI Geometry List」をGetDataに渡す必要があるとどのように判断しましたか?
カーククイケンドール

@Kirk Kuykendall私はデータが関連付けられている形式のリストを提供するclipBoardDataObject.GetFormats()を呼び出すことができます。フィーチャをクリップボードにコピーした場合の文字列の結果は「ESRI Geometry List」です。
-prisma.ph

クリップボードに機能が含まれていることを考えると、ESRI Geometry Listは少し誤解を招くかもしれません。フィーチャには、ジオメトリだけではありません。リフレクションを使用して、各ESRIアセンブリの各インターフェイスをループできると思います。各インターフェイスについて、そのGUIDを取得し、LoadObjectが何かを返すかどうかを確認します。
カーククイケンドール

System、Carto、Geometry、Geodatabase、Frameworksのすべてのインターフェイスでテストしましたが、機能するインターフェイスが見つかりませんでした。たぶんそれはマイクロソフトのインターフェースですか?
Goldorak84

誰かが解決策を見つけましたか?また、システムインターフェイスとジオデータベースインターフェイスにキャストしようとしましたが、運はありませんでした。

回答:


2

あなたのツール/ワークフローに似た何かをしました。私も、自動化された機能で、コピーされたフィーチャを適切なレイヤーにダイレクトする方法を理解できませんでした。私の状況では、ArcMapコマンドのコピーと貼り付けを使用して、編集セッション中に選択したフィーチャをあるレイヤーから別のレイヤーに移動しました。ユーザーは手動ステップを実行し、ターゲットレイヤーを定義する必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.