ArcMap AddIn 툴바에 추가하지 않고 양식에서 사용자 정의 ITool을 활성화 하시겠습니까?


11

ArcMap에 툴바를 추가하는 ArcMap 10.0의 추가 기능을 개발 중입니다. OpenModelessDialogCommand해당 도구 모음의 하나의 명령 ( ) 단추는 모덜리스 WinForms 대화 상자를 열고, MyTool예를 들어 맵에서 기능을 선택하기 위해 도구 ( )를 활성화 할 수 있습니다.

My Config.esriaddinx에는 다음 명령 및 도구 모음 선언이 포함되어 있습니다.

<Commands>
  <!-- this is the command that opens the modeless WinForms form, from where
       MyTool is available: -->
  <Button id="OpenModelessFormCommand" ... />
  <!-- MyTool is not directly referenced in any toolbar defined in this file: -->
  <Tool id="MyTool" class="MyTool" ... />
</Commands>
<Toolbars>
  <Toolbar ...>
    <Items>
      <Button refID="OpenModelessFormCommand" />
    </Items>
  </Toolbar>
</Toolbars>

내가 문제가 MyTool있는 것은 양식에서 활성화 하는 것입니다. 인터넷에서 찾은 것은 다음과 같은 코드 샘플입니다.

// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
 // activate MyTool: 
ArcMap.Application.CurrentTool = myTool;

그러나 이것은 분명히 MyTool내 추가 기능의 명령 모음 (예 : 도구 모음)에 실제로 나타나야합니다 . 그러나 그렇지 않습니다. 그래서 다음에 이것을 시도했습니다.

ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool;  // Type mismatch! An ICommandItem is expected.

나는 심지어 AxToolbarControl폼에 보이지 않는 것을 추가하고 MyTool거기에 버튼을 추가하는 것을 보았습니다 . 하지만 툴바를 통해 SetBuddyControl열린 문서의지도 에 연결하는 방법에 문제 가 있습니다. 도구가 별도의 기능 AxMapControl으로 작동하고 싶지 않고 ArcMap에 표시된 기본 맵과 직접 작동하기를 원합니다.

질문 :
툴바 (또는 다른 명령 모음)에 추가되지 않은 사용자 정의 도구를 활성화하려면 어떻게해야합니까?


커맨드 바가 광고 된대로 작동하면 내 대답이 효과가 있다고 생각되면 질문에 "버그"태그를 추가하십시오. 공공 장소에서 더러운 세탁물을 보여주는 것은 종종 공급 업체가 버그를 해결하는 좋은 동기입니다.
Kirk Kuykendall

@Kirk, 저는 그렇게하려고했지만 할 수 없었습니다. 여기에 새로운 태그를 만들만큼 충분한 순위 bug가없고 아직 존재하지 않는 것 같습니다. 태그를 직접 수정하십시오.
stakx

답변:


7

이것은 ArcGIS 10 SP1을 사용하여 나를 위해 일했습니다. 내 사용자 정의 도구가 도구 모음에 없습니다 :

    Dim UIDCls As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
    ' id property of menu from Config.esriaddinx document
    UIDCls.Value = "ClassLibraryAddin_MyTool"
    Dim document As ESRI.ArcGIS.Framework.IDocument = My.ArcMap.Document
    Dim commandItem As ESRI.ArcGIS.Framework.ICommandItem = TryCast(document.CommandBars.Find(UIDCls), ESRI.ArcGIS.Framework.ICommandItem)
    If commandItem Is Nothing Then
        Exit Sub
    End If
    My.ArcMap.Application.CurrentTool = commandItem

1
+1 이것이 효과가 있다면, 이것은 내가 게시 한 답변보다 간단합니다. 나는 그것을 시도했지만 SP1을 설치 한 것이 확실하기 때문에 아마도 그것이 요인이었습니다.
Kirk Kuykendall

lbross의 대답은 저에게 많은 도움이되었습니다. 나중에 ArcGis 스 니펫 파인더에서 거의 동일한 해결책을 찾았습니다.
dpalmetz

평판이 충분하지 않기 때문에 투표하거나 의견을 추가 할 수 없지만 ArcGIS 10.2에서는 lbross의 답변이 효과적입니다. 툴바없이 ITool을 생성하고 Windows 버튼에서 호출했습니다. Víctor
vaparicio

3

나는 이것을 시도한 적이 없지만 작동 해야하는 것처럼 보입니다. 모달리스 형식에는 두 가지 멤버 변수가 있습니다. 첫 번째 (m_Tool)는 ITool을 참조하고 두 번째 (m_Application)는 IApplication을 참조합니다. 모덜리스 양식의 생성자에서 ITool을 인스턴스화하고 ICreate 참조를 전달하여 OnCreate를 호출 하십시오.

모달리스 양식에는 클릭하면 m_Application을 설정하는 버튼이 있습니다. CurrentTool = m_ 도구. 또한 모덜리스 대화 상자 대신 WPF를 사용 하여 도킹 가능한 창을 사용하는 것이 좋습니다 .

업데이트 이 절름발이 답변을 게시를 속죄하기위한 시도로, 나는 뭔가 함께 해킹 시도했습니다. 툴바를 동적으로 생성하고 숨기고 툴을 추가하고 (ICommandItem을 CurrentTool로 설정) 툴바가 툴바에 있음을 사용자가 알지 못한 채 툴바를 삭제할 수 있어야합니다. 그러나 ICommandBar.Dock 및 ICommandItem.Delete는 동적 도구 모음에서 작동하지 않는 것 같습니다. IMHO 이것은 버그입니다.

protected override void OnClick()
{
    UID uid = new UIDClass();
    uid.Value = "Microsoft_ArcMapAddin1_Tool1";
    var bar = ArcMap.Application.Document.CommandBars.Create("mybar", esriCmdBarType.esriCmdBarTypeToolbar)
        as ICommandBar;

    // bug, dock doesn't work ...
    bar.Dock(esriDockFlags.esriDockHide);
    bar.Add(uid);

    var itm = bar.Find(uid);
    if (itm != null)
    {
        ArcMap.Application.CurrentTool = itm;
        // bug, delete doesn't work either
        ((ICommandItem)bar).Delete(); 
    }
}

1
CurrentTool 속성에는 ICommandItem이 필요하므로 작동하지 않습니다. ICommandItem 참조는 직접 작성할 수 없지만 ICommandBars를 통해서만 검색 할 수 있습니다.
Petr Krebs

currenttool에 대해서는 꽤 맞지만 ICommandbar.Add는 UID에서 ICommandItem을 만듭니다. 그러면 문제는 더 이상 필요하지 않은 (또는 최소한 숨기고) 명령 모음을 제거하는 방법이됩니다.
Kirk Kuykendall

와우, 업데이트에 작동 코드 예제를 추가해 주셔서 감사합니다. 그것은 일도 Dock아니고 부끄러운 Delete일이지만 좋은 출발입니다. 나는이 Delete문제를 더 조사 할 것이라고 생각한다.
stakx

정말 흥미로운 아이디어인데, 그 점에서 분명히 설명하려고 노력할 것입니다. Btw 나는 또한 당신이 묘사하는 행동이 버그라고 생각합니다.
Petr Krebs 1

나는 다른 솔루션을 사용하여 결국 다른 툴을 사용하여 쉽게 참조 할 수 있도록 툴을 싱글 톤으로 만들었습니다. CommandBars.Find문제는 갑자기 알려지지 않은 이유로 자체적으로 해결되었습니다. 아마도 내가 한 일이었을 것입니다.
stakx

3

툴바에 도구를 추가해야하는 이유를 모르겠습니다. 비슷한 작업을했는데 툴바에 추가 할 필요가 없습니다.

필자의 경우 사용자가 고정 가능한 창에서 버튼을 클릭하면 도구가 활성화됩니다. 이 작업을 수행하기 위해 툴 클래스는 다음과 같습니다.

  • 내 도구 ID는 "ArcMap_SelectionTool"입니다.
  • 내 툴 클래스 이름은 "SelectionTool"입니다.
  • 공구 클래스에서 공구 유형의 정적 필드 유지

    private static ICommandItem _selectionTool;
    private static SelectionTool _instance;
    public static SelectionTool Instance
    {
        get
        {
            if (_instance == null)
            {
                var selectionToolUID = new UID();
                selectionToolUID.Value = "ArcMap_SelectionTool";
                _selectionTool = ArcMap.Application.Document.CommandBars.Find(selectionToolUID, false, false);
                if (_selectionTool == null)
                {
                    MessageBox.Show("Selection tool is not found.");
                    return null;
                }
            }
            if (_selectionTool != null)
                ArcMap.Application.CurrentTool = _selectionTool;
            return _instance;
        }
    }
    
    public static void ExitToolInstance()
    {
        if (_instance != null)
            ArcMap.Application.CurrentTool = null;
    }
    
    public SelectionTool()
    {
        _instance = this;
    }
    
    protected override void OnMouseDown(MouseEventArgs arg)
    {
        if (arg.Button != MouseButtons.Left)
            return;
        //Do Work
    }

따라서이 도구를 인스턴스화해야 할 때마다 다음과 같이 호출합니다.

        var toolInstance = SelectionTool.Instance;

도구로 작업 한 후 도구 인스턴스를 종료해야합니다. 그래서 SelectionTool.ExitToolInstance()메소드를 호출 합니다.

이 절차는 저에게 잘 작동합니다.


1

나는 보통 명령 (귀하의 경우 OpenModelessDialogCommand)을 도구 ( ITool) 로 만들어 이것을 해결합니다 . 명령을 클릭하면 양식이 열립니다. 그런 다음 언제든지 도구로 활성화 할 수도 있습니다.

활성화하려는 도구가 자신의 도구가 아닌 경우 위와 같이 구현 된 ITool에서 다른 도구 인스턴스로 호출을 릴레이 할 수 있습니다.


0

지도 객체에 액세스 할 수있는 경우지도에 연결하기 위해 MapControl 객체와 같은 onCreate 전송을 호출하여 많은 도구를 실행할 수 있습니다. 그 후에는 onClick 메소드 만 실행하면됩니다.

tool.OnCreate(control.Object)
tool.OnClick()

일부는 툴바에 추가해야하므로 모든 ESRI 도구에서 작동하지 않습니다.


그런지도 객체에 대한 참조를 어떻게 얻습니까? 내가 얻을 수있는 것은 모두 IMap를 통한 인터페이스 IMxDocument이지만 분명히 동일하지는 않습니다.
stakx

편집 : 바탕 화면에서 그것은 후크 객체 인 IApplication입니다 : help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/…
MathiasWestin

미안, 나는 이것을 시도했다; 작동하지 않습니다. 여기서 문제는 도구가 생성되지만 활성화되지 않는다는 것입니다. 둘째, 나는 여전히 MapControl객체를 얻을 수있는 방법을 보지 못합니다 (실제로 필요하다면) IApplication.
stakx

설명서를 잘못 읽지 않으면 데스크탑 에서이 작업을 수행 할 때 IApplication을 OnCreate로 전달해야합니다. MapControl 객체를 보내면 엔진에서 작동합니다.
MathiasWestin

IApplication객체를 전달하는 것이 옳은 것처럼 보이지만 OnCreate도구는에 의해 활성화되지 않아 OnCreate입력 이벤트를 수신 하지 않기 때문에 충분하지 않습니다 (적어도 내 사용자 정의 도구에는 적합하지 않음) .
stakx 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.