Ich arbeite an einem Add-In für ArcMap 10.0, das ArcMap eine Symbolleiste hinzufügt. Eine Befehlsschaltfläche ( OpenModelessDialogCommand
) in dieser Symbolleiste öffnet ein modellloses WinForms-Dialogfeld, in dem ein tool ( MyTool
) aktiviert werden kann, um z. B. ein Feature auf der Karte auszuwählen.
My Config.esriaddinx
enthält die folgenden Befehls- und Symbolleistendeklarationen:
<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>
Ich habe Probleme damit, MyTool
das Formular zu aktivieren . Alles, was ich im Internet gefunden habe, sind Codebeispiele wie:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Dies erfordert jedoch anscheinend, dass MyTool
tatsächlich in einer Befehlsleiste (z. B. Symbolleiste) meines Add-Ins angezeigt wird. Das ist aber nicht der Fall. Also habe ich das als nächstes versucht:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Ich habe sogar versucht AxToolbarControl
, meinem Formular ein Unsichtbares hinzuzufügen und dort eine Schaltfläche hinzuzufügen MyTool
. Aber dann habe ich Probleme beim Verbinden dieser Symbolleiste (über SetBuddyControl
) mit der Karte des geöffneten Dokuments. Ich möchte nicht, dass das Tool in einer separaten Funktion funktioniert AxMapControl
. Ich möchte, dass es direkt mit der in ArcMap angezeigten Hauptkarte funktioniert.
Frage:
Wie aktiviere ich ein benutzerdefiniertes Werkzeug, das keiner Symbolleiste (oder einer anderen Befehlsleiste) hinzugefügt wurde?
quelle
bug
scheint noch nicht zu existieren; Bitte zögern Sie nicht, die Tags selbst zu bearbeiten.Antworten:
Dies funktionierte bei mir mit ArcGIS 10 SP1. Mein benutzerdefiniertes Tool befindet sich nicht in einer Symbolleiste:
quelle
Ich habe dies noch nie versucht, aber es scheint, als sollte es funktionieren: In Ihrem modelllosen Formular haben Sie zwei Mitgliedsvariablen, die erste (m_Tool), die auf Ihr ITool verweist, und die zweite (m_Application), die auf die IApplication verweist. Lassen Sie es im Konstruktor für Ihr modellloses Formular das ITool instanziieren und OnCreate aufrufen , indem Sie eine IApplication-Referenz übergeben.In Ihrem modelllosen Formular befindet sich eine Schaltfläche, die beim Klicken m_Application festlegt. CurrentTool = m_Tool. Anstatt ein modellloses Dialogfeld zu erstellen, würde ich außerdem empfehlen, ein andockbares Fenster zu verwenden, in dem möglicherweise WPF verwendet wird .
Update Bei dem Versuch, diese lahme Antwort zu büßen, habe ich versucht, etwas zusammen zu hacken. Anscheinend sollten Sie in der Lage sein, eine Symbolleiste dynamisch zu erstellen, auszublenden, das Werkzeug hinzuzufügen (ein ICommandItem auf CurrentTool zu setzen) und dann die Symbolleiste zu löschen, ohne dass der Benutzer jemals weiß, dass sich das Werkzeug in einer Symbolleiste befindet. ICommandBar.Dock und ICommandItem.Delete scheinen jedoch nicht für dynamische Toobars zu funktionieren. IMHO ist das ein Fehler.
quelle
Dock
nochDelete
arbeiten, aber es ist ein guter Anfang. Ich werde dasDelete
Thema weiter untersuchen, denke ich.CommandBars.Find
Problem hat sich aus einem unbekannten Grund plötzlich von selbst gelöst), aber ich gebe dieser Antwort das Häkchen Markieren Sie, weil dies wahrscheinlich das ist, was ich getan hätte.Ich weiß nicht, warum Sie das Werkzeug in eine Symbolleiste einfügen müssen. Weil ich mit einer ähnlichen Sache gearbeitet habe und keine Notwendigkeit gefunden habe, sie in der Symbolleiste hinzuzufügen.
In meinem Fall wird ein Tool aktiviert, wenn der Benutzer auf eine Schaltfläche im andockbaren Fenster klickt. Um diese Arbeit auszuführen, sieht meine Werkzeugklasse folgendermaßen aus:
Behalten Sie ein statisches Feld des Werkzeugtyps in der Werkzeugklasse bei
Wenn ich dieses Tool instanziieren muss, rufe ich es folgendermaßen auf:
Nachdem ich mit dem Tool gearbeitet habe, muss ich die Tool-Instanz beenden. Also rufe ich
SelectionTool.ExitToolInstance()
Methode auf.Dieses Verfahren funktioniert gut für mich.
quelle
Normalerweise löse ich das, indem ich den Befehl (in Ihrem Fall OpenModelessDialogCommand) auch zu einem Tool (
ITool
) mache . Wenn ich auf den Befehl klicke, öffne ich das Formular. Dann kann ich es auch jederzeit als Tool aktivieren.Wenn das Tool, das Sie aktivieren möchten, nicht Ihr eigenes ist, können Sie Aufrufe von Ihrem ITool (wie oben implementiert) an die andere Tool-Instanz weiterleiten.
quelle
Wenn Sie Zugriff auf das Kartenobjekt haben, können viele Tools ausgeführt werden, indem Sie onCreate aufrufen und beispielsweise das MapControl-Objekt senden, um es mit der Karte zu verbinden. Danach muss nur noch die onClick-Methode ausgeführt werden.
Arbeiten Sie nicht mit allen ESRI-Tools, da einige zu einer Symbolleiste hinzugefügt werden müssen.
quelle
IMap
SchnittstelleIMxDocument
, aber klar, das ist nicht dasselbe, oder?MapControl
Objekt (wenn ich überhaupt eines brauche) durchIApplication
oder ein von dort erreichbares Objekt bekommen könnte.IApplication
Objekt an übergeben würdenOnCreate
- aber das reicht nicht aus (zumindest nicht für mein benutzerdefiniertes Tool), da das Tool nicht von aktiviert wirdOnCreate
und daher keine Eingabeereignisse empfängt.