ArcMap / C # में विंडोज क्लिपबोर्ड से चयनित विशेषताएं / ज्यामिति कैसे प्राप्त करें?


14

मैं ArcMap 10 में एक कस्टम उपकरण है। वर्कफ़्लो निम्नलिखित है:

  • "आयत द्वारा चयन करें सुविधाएँ" उपकरण के साथ एक परत में सुविधाओं का चयन करें
  • STRG + c का उपयोग करके क्लिपबोर्ड में सुविधाओं की प्रतिलिपि बनाएँ
  • कस्टम टूल का चयन करें
  • टूल क्लिपबोर्ड की जांच करता है। क्लिपबोर्ड में कॉपी किए गए फ़ीचर को खोजने के मामले में वर्कफ़्लो बदल जाता है

मुझे http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html पर एक उदाहरण मिला जहां ड्रैग और ड्रॉप का उपयोग करके समान सामान लागू किया जाता है।

उदाहरण का पालन करना और उसका पालन करना और STRG + c का उपयोग करते हुए क्लिपबोर्ड में 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 ज्यामिति सूची" है (जिसमें से मुझे कोई जानकारी ऑनलाइन नहीं मिल सकती है)। तो मैं इस वस्तु को "अनपैक" कैसे कर सकता हूं? IFeatureSelection, IFeature, IGeometry अभ्यस्त काम करते हैं।

कोई विचार?


+1 अच्छा सवाल। गेटडाटा के लिए "ईएसआरआई ज्योमेट्री लिस्ट" को पारित करने के लिए आपने कैसे निर्धारित किया?
कर्क कुयकेंडल

@ Kirk Kkkendall i को क्लिपबोर्ड कह सकते हैं। डेटाडॉटऑबजेक्ट.गेटफॉर्म () जो मुझे उस प्रारूप की एक सूची देता है जिससे डेटा जुड़ा हुआ है। यदि मैं क्लिपबोर्ड में सुविधाओं की नकल करता हूं तो स्ट्रिंग परिणाम "ESRI ज्यामिति सूची" है।
प्रिज्मा।

यह देखते हुए कि क्लिपबोर्ड में विशेषताएं हैं, मुझे लगता है कि ESRI ज्यामिति सूची थोड़ी भ्रामक हो सकती है। एक फीचर में सिर्फ ज्यामिति की तुलना में बहुत अधिक है। मुझे आश्चर्य है कि यदि आप प्रत्येक ईएसआरआई विधानसभा में प्रत्येक इंटरफ़ेस के माध्यम से प्रतिबिंब और लूप का उपयोग कर सकते हैं। प्रत्येक इंटरफ़ेस के लिए, इसकी मार्गदर्शिका प्राप्त करें और देखें कि क्या LoadObject कुछ भी लौटाता है।
कर्क कुयकेंडल

मैंने सिस्टम, कार्टो, जियोमेट्री, जियोडेटाबेस और फ्रेमवर्क के सभी इंटरफेस के साथ परीक्षण किया और मुझे ऐसा इंटरफ़ेस नहीं मिला जो काम करता हो। शायद यह एक Microsoft इंटरफ़ेस है?
19or में Goldorak84

क्या किसी ने समाधान पाया? मैंने सिस्टम और जियोडैटेबेस इंटरफेस में भी कास्टिंग की कोशिश की, लेकिन बिना किसी भाग्य के।

जवाबों:


2

मैंने आपके टूल / वर्कफ़्लो के समान कुछ किया है। मैं यह भी पता नहीं लगा सका कि स्वचालित परत में कैसे कॉपी की गई सुविधाओं को उचित परत तक निर्देशित किया जाए। अपनी स्थिति के लिए मैंने एक संपादन सत्र में चयनित सुविधाओं को एक परत से दूसरी परत पर ले जाने के लिए ArcMap कमांड कॉपी और पेस्ट का उपयोग किया । उपयोगकर्ता को बस मैनुअल स्टेप निष्पादित करना और लक्ष्य परत को परिभाषित करना था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.