Tôi có một công cụ tùy chỉnh trong ArcMap 10. Quy trình làm việc như sau:
- Chọn tính năng trong một lớp bằng công cụ "Chọn tính năng theo hình chữ nhật"
- Sao chép các tính năng vào Clipboard bằng STRG + c
- Chọn công cụ tùy chỉnh
- Công cụ kiểm tra Clipboard. Trong trường hợp tìm thấy một Tính năng được sao chép trong Clipboard, quy trình làm việc sẽ thay đổi
Tôi đã tìm thấy một ví dụ trên http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html nơi thực hiện các công cụ tương tự bằng cách kéo và thả.
Theo dõi và điều chỉnh ví dụ và cố gắng sao chép các lớp trong TOC trong ArcMap vào bảng tạm bằng cách sử dụng STRG + c đang hoạt động với tôi:
//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;
}
Tôi có thể truyền đối tượng cho ILayer, điều này đang hoạt động!
Cố gắng đạt được điều tương tự với các Tính năng được sao chép không hiệu quả với tôi, ít nhất tôi không thực sự biết phải làm gì.
//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?
Bạn thấy ở đây định dạng đối tượng là "Danh sách hình học ESRI" (trong đó tôi không thể tìm thấy bất kỳ thông tin trực tuyến nào). Vậy làm thế nào tôi có thể "giải nén" đối tượng này? IFeatureSelection, IFeature, IGeometry sẽ không hoạt động.
Bất kỳ ý tưởng?