Làm cách nào để có được các Tính năng / Hình học được chọn từ Windows Clipboard trong ArcMap / C #?


14

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?


+1 câu hỏi hay. Làm thế nào bạn xác định bạn cần chuyển "Danh sách hình học ESRI" cho GetData?
Kirk Kuykendall

@Kirk Kuykendall tôi có thể gọi clipBoardDataObject.GetFormats () cung cấp cho tôi danh sách định dạng mà dữ liệu được liên kết. Kết quả chuỗi trong trường hợp tôi đã sao chép các tính năng vào bảng tạm là "Danh sách hình học ESRI".
prisma.ph

Cho rằng bảng tạm chứa các tính năng, tôi nghĩ Danh sách hình học ESRI có thể hơi sai lệch. Một tính năng có nhiều hơn chỉ là hình học. Tôi tự hỏi nếu bạn có thể sử dụng sự phản chiếu và lặp qua từng giao diện trong mỗi cụm ESRI. Đối với mỗi giao diện, hãy lấy hướng dẫn của nó và xem nếu LoadObject trả về bất cứ điều gì.
Kirk Kuykendall

Tôi đã thử nghiệm với tất cả các giao diện từ System, Carto, Geometry, Geodatabase và Frameworks và tôi không tìm thấy giao diện nào hoạt động. Có lẽ đó là một giao diện microsoft?
Goldorak84

Có ai tìm thấy giải pháp? Tôi cũng đã thử chuyển sang giao diện Hệ thống và Cơ sở dữ liệu địa lý, nhưng không gặp may.

Câu trả lời:


2

Tôi đã làm một cái gì đó tương tự như công cụ / quy trình làm việc của bạn. Tôi cũng không thể tìm ra làm thế nào trong một sự kết hợp tự động với các tính năng được sao chép trực tiếp vào lớp thích hợp. Đối với tình huống của tôi, tôi đã sử dụng các lệnh ArcMap Sao chép và Dán để di chuyển các tính năng được chọn từ lớp này sang lớp khác trong khi trong phiên chỉnh sửa. Người dùng chỉ cần thực hiện bước thủ công và xác định lớp đích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.