วิธีการเลือกคุณสมบัติ / เรขาคณิตจากคลิปบอร์ดของ Windows ใน ArcMap / C #


14

ฉันมีเครื่องมือที่กำหนดเองใน ArcMap 10 กระบวนการทำงานดังต่อไปนี้:

  • เลือกคุณสมบัติในเลเยอร์ด้วยเครื่องมือ "เลือกคุณสมบัติตามสี่เหลี่ยมผืนผ้า"
  • คัดลอกฟีเจอร์ไปยังคลิปบอร์ดโดยใช้ STRG + c
  • เลือกเครื่องมือที่กำหนดเอง
  • เครื่องมือตรวจสอบคลิปบอร์ด ในกรณีที่ค้นหาฟีเจอร์ที่คัดลอกในคลิปบอร์ด Workflow จะเปลี่ยนไป

ฉันพบตัวอย่างในhttp://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.htmlซึ่งมีการใช้งานสิ่งที่คล้ายกันโดยใช้การลากและวาง

การติดตามและปรับตัวอย่างและพยายามคัดลอกเลเยอร์ใน TOC ใน ArcMap ไปยังคลิปบอร์ดโดยใช้ STRG + c ทำงานให้ฉัน:

//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" (ซึ่งฉันไม่สามารถหาข้อมูลออนไลน์ได้) ดังนั้นฉันจะ "แกะกล่อง" วัตถุนี้ได้อย่างไร IFeatureSelection, IFeature, IGeometry ไม่ทำงาน

ความคิดใด ๆ


+1 คำถามที่ดี คุณทราบได้อย่างไรว่าคุณต้องการส่งผ่าน "รายการเรขาคณิต ESRI" ไปยัง GetData
Kirk Kuykendall

@ Kirk Kuykendall ฉันสามารถโทรหา clipBoardDataObject.GetFormats () ซึ่งจะให้รายการรูปแบบที่ข้อมูลเกี่ยวข้องกับฉัน ผลลัพธ์สตริงในกรณีที่ฉันคัดลอกคุณสมบัติไปยังคลิปบอร์ดคือ "รายการเรขาคณิต ESRI"
prisma.ph

เนื่องจากคลิปบอร์ดมีคุณลักษณะฉันคิดว่ารายการเรขาคณิต ESRI อาจทำให้เข้าใจผิดเล็กน้อย คุณสมบัติมีมากกว่าเรขาคณิต ฉันสงสัยว่าคุณสามารถใช้การสะท้อนและการวนซ้ำในแต่ละอินเตอร์เฟสในแต่ละชุดประกอบ ESRI ได้หรือไม่ สำหรับแต่ละอินเตอร์เฟสรับ guid และดูว่า LoadObject ส่งคืนอะไรหรือไม่
Kirk Kuykendall

ฉันทดสอบกับอินเทอร์เฟซทั้งหมดจากระบบ, Carto, เรขาคณิต, Geodatabase และ Frameworks และฉันไม่พบอินเทอร์เฟซที่ใช้งานได้ อาจจะเป็นอินเตอร์เฟสของ Microsoft หรือ
Goldorak84

ไม่มีใครพบวิธีแก้ปัญหา? ฉันยังลองส่งไปยังอินเทอร์เฟซ System และ Geodatabase แต่ก็ไม่มีโชค

คำตอบ:


2

ฉันได้ทำสิ่งที่คล้ายกับเครื่องมือ / เวิร์กโฟลว์ของคุณ ฉันก็ไม่สามารถหาวิธีในแฟชั่นอัตโนมัติเพื่อคัดลอกคุณสมบัติโดยตรงไปยังชั้นที่เหมาะสม สำหรับสถานการณ์ของฉันฉันใช้คำสั่ง ArcMapคัดลอกและวางเพื่อย้ายคุณลักษณะที่เลือกจากชั้นหนึ่งไปอีกชั้นหนึ่งในขณะที่อยู่ในเซสชันแก้ไข ผู้ใช้เพียงแค่ต้องดำเนินการขั้นตอนด้วยตนเองและกำหนดเลเยอร์เป้าหมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.