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