ArcMap / C #의 Windows 클립 보드에서 선택한 기능 / 형상을 얻는 방법은 무엇입니까?


14

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

아무도 해결책을 찾았습니까? 또한 시스템 및 지오 데이터베이스 인터페이스로 캐스팅을 시도했지만 운이 없었습니다.

답변:


2

도구 / 워크 플로와 비슷한 작업을 수행했습니다. 나도 자동화 된 fasion에서 복사 된 기능을 적절한 레이어로 보내는 방법을 알 수 없었습니다. 제 상황 에서는 편집 세션에서 ArcMap 명령 Copy and Paste를 사용하여 선택한 피처를 한 레이어에서 다른 레이어로 옮겼습니다. 사용자는 수동 단계를 실행하고 대상 계층을 정의해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.