Pracuję nad dodatkiem do ArcMap 10.0, który dodaje pasek narzędzi do ArcMap. Jeden OpenModelessDialogCommand
przycisk polecenia ( ) na tym pasku narzędzi otwiera niemodalne okno dialogowe WinForm, w którym MyTool
można aktywować narzędzie ( ) w celu np. Wybrania elementu na mapie.
My Config.esriaddinx
zawiera następujące deklaracje poleceń i pasków narzędzi:
<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>
Mam problem z aktywacją MyTool
w formularzu. Wszystko, co znalazłem w Internecie, to próbki kodu w stylu:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Jednak najwyraźniej wymaga to, aby MyTool
faktycznie pojawił się na pasku poleceń (np. Pasku narzędzi) mojego dodatku. Ale tak nie jest. Wypróbowałem to następnie:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Nawet zastanawiałem się nad dodaniem niewidzialnego AxToolbarControl
do mojego formularza i dodaniem do niego przycisku MyTool
; ale potem mam problemy z podłączeniem tego paska narzędzi (poprzez SetBuddyControl
) do mapy otwartego dokumentu. Nie chcę, aby narzędzie działało osobno AxMapControl
, chcę, aby działało bezpośrednio z główną mapą pokazaną w ArcMap.
Pytanie:
Jak aktywować niestandardowe narzędzie, które nie zostało dodane do żadnego paska narzędzi (lub innego paska poleceń, jeśli o to chodzi)?
źródło
bug
wydaje się, że jeszcze nie istnieje; możesz samodzielnie edytować tagi.Odpowiedzi:
To działało dla mnie przy użyciu ArcGIS 10 SP1. Moje niestandardowe narzędzie nie znajduje się na pasku narzędzi:
źródło
Nigdy tego nie próbowałem, ale wydaje się, że powinno to działać: w twojej niemodalnej formie mają dwie zmienne składowe, pierwsza (m_Tool) odwołuje się do Twojego ITool, a druga (m_Application) odwołuje się do IApplication. W konstruktorze formularza bez formy poproś go o utworzenie instancji ITool i wywołanie OnCreate , przekazując odwołanie do aplikacji IApplication.W formularzu bez wzoru znajduje się przycisk, który po kliknięciu ustawia m_Application. CurrentTool = m_Tool. Ponadto, zamiast robić niemodalne okno dialogowe, zaleciłbym użycie dokowalnego okna, być może przy użyciu WPF w nim .
Aktualizacja Próbując odpokutować za opublikowanie tej kiepskiej odpowiedzi, próbowałem zhakować coś razem. Wygląda na to, że powinieneś być w stanie dynamicznie utworzyć pasek narzędzi, ukryć go, dodać do niego narzędzie (ustawienie ICommandItem na wartość CurrentTool), a następnie usunąć pasek narzędzi bez wiedzy użytkownika, że narzędzie było na pasku narzędzi. Jednak ICommandBar.Dock i ICommandItem.Delete nie działają w przypadku dynamicznych paska narzędzi. IMHO to błąd.
źródło
Dock
nieDelete
działają, ale to dobry początek. Myślę, że przyjrzę się temuDelete
zagadnieniu dalej.CommandBars.Find
problem nagle rozwiązał się z niewiadomego powodu), ale daję odpowiedź tak znak, bo to prawdopodobnie zrobiłbym.Nie wiem, dlaczego musisz dodać to narzędzie na pasku narzędzi. Ponieważ pracowałem z podobną rzeczą i nie muszę dodawać jej na pasku narzędzi.
W moim przypadku, gdy użytkownik kliknie przycisk w oknie dokowalnym, narzędzie aktywuje się. Aby wykonać tę pracę, moja klasa narzędzi wygląda następująco:
Zachowaj statyczne pole typu narzędzia w klasie narzędzi
Dlatego za każdym razem, gdy muszę utworzyć instancję tego narzędzia, nazywam to w następujący sposób:
Po pracy z narzędziem muszę wyjść z instancji narzędzia. Więc wywołuję
SelectionTool.ExitToolInstance()
metodę.Ta procedura działa dla mnie dobrze.
źródło
Zwykle rozwiązuję to, czyniąc polecenie (w twoim przypadku OpenModelessDialogCommand) również narzędziem (
ITool
). Po kliknięciu polecenia otwieram formularz. Następnie mogę aktywować go jako narzędzie w dowolnym momencie.Jeśli narzędzie, które chcesz aktywować, nie jest twoje, możesz przekazywać połączenia z Twojego IToola (zaimplementowanego jak wyżej) do innego wystąpienia narzędzia.
źródło
Jeśli masz dostęp do obiektu mapy, wiele narzędzi można uruchomić, wywołując funkcję onCreate, wysyłając na przykład obiekt MapControl w celu podłączenia go do mapy. Następnie wystarczy uruchomić metodę onClick.
Nie działa na wszystkich narzędziach ESRI, ponieważ niektóre wymagają dodania do paska narzędzi.
źródło
IMap
interfejsIMxDocument
, ale najwyraźniej to nie to samo, prawda?MapControl
przedmiot (jeśli w ogóle go potrzebuję)IApplication
lub jakikolwiek obiekt stamtąd dostępny.IApplication
obiektOnCreate
- ale to nie wystarczy (przynajmniej nie w przypadku mojego niestandardowego narzędzia), ponieważ narzędzie nie jest aktywowane przezOnCreate
, a zatem nie odbiera żadnych zdarzeń wejściowych.