ArcMap 10에 사용자 정의 도구가 있습니다. 워크 플로우는 다음과 같습니다.
- "사각형으로 피쳐 선택"도구를 사용하여 레이어에서 피쳐를 선택하십시오.
- STRG + c를 사용하여 기능을 클립 보드에 복사
- 맞춤 도구를 선택하십시오.
- 이 도구는 클립 보드를 확인합니다. 클립 보드에서 복사 된 피처를 찾은 경우 워크 플로우가 변경됩니다
드래그 앤 드롭을 사용하여 유사한 것들이 구현되는 http://kiwigis.blogspot.com/2011/07/how-to-create-drop-target-for-layers-in.html 에서 예제를 찾았습니다 .
STRG + 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
@ Kirk Kuykendall 데이터와 관련된 형식의 목록을 제공하는 clipBoardDataObject.GetFormats ()를 호출 할 수 있습니다. 피처를 클립 보드에 복사 한 경우의 문자열 결과는 "ESRI Geometry List"입니다.
—
prisma.ph 2013 년
클립 보드에 기능이 포함되어 있다고 생각하면 ESRI Geometry List가 약간 오도 될 수 있다고 생각합니다. 지형지 물에는 형상 만있는 것이 아닙니다. 각 ESRI 어셈블리의 각 인터페이스를 통해 반사 및 루프를 사용할 수 있는지 궁금합니다. 각 인터페이스에 대해 guid를 가져 와서 LoadObject가 무엇을 반환하는지 확인하십시오.
—
Kirk Kuykendall
System, Carto, Geometry, Geodatabase 및 Frameworks의 모든 인터페이스로 테스트했지만 작동하는 인터페이스를 찾지 못했습니다. 아마도 Microsoft 인터페이스일까요?
—
Goldorak84