Je travaille sur un complément pour ArcMap 10.0 qui ajoute une barre d'outils à ArcMap. Un OpenModelessDialogCommand
bouton de commande ( ) de cette barre d'outils ouvre une boîte de dialogue WinForms non modale, à partir de laquelle un outil ( MyTool
) peut être activé afin par exemple de sélectionner une entité sur la carte.
My Config.esriaddinx
contient ces déclarations de commandes et de barres d'outils:
<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>
Ce qui me pose problème, c'est l'activation MyTool
dans le formulaire. Tout ce que j'ai trouvé sur Internet, ce sont des exemples de code du type:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Cependant, cela nécessite apparemment que MyTool
s'affiche réellement dans une barre de commandes (par exemple la barre d'outils) de mon complément. Mais ce n'est pas le cas. J'ai donc essayé ceci ensuite:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
J'ai même cherché à ajouter un invisible AxToolbarControl
à mon formulaire et à y ajouter un bouton MyTool
; mais je rencontre des problèmes sur la façon de connecter cette barre d'outils (via SetBuddyControl
) à la carte du document ouvert. Je ne veux pas que l'outil fonctionne dans un environnement distinct AxMapControl
, je veux qu'il fonctionne directement avec la carte principale affichée dans ArcMap.
Question:
Comment puis-je activer un outil personnalisé qui n'est ajouté à aucune barre d'outils (ou à une autre barre de commandes, d'ailleurs)?
la source
bug
ne semble pas encore exister; n'hésitez pas à modifier les balises vous-même.Réponses:
Cela a fonctionné pour moi en utilisant ArcGIS 10 SP1. Mon outil personnalisé n'est pas sur une barre d'outils:
la source
Je n'ai jamais essayé cela, mais il semble que cela devrait fonctionner: dans votre formulaire non modal, deux variables membres, la première (m_Tool) référençant votre ITool et la seconde (m_Application) référençant l'IApplication. Dans le constructeur de votre formulaire non modal, faites-le instancier ITool et appelez OnCreate , en passant une référence IApplication.Sur votre formulaire non modal, vous avez un bouton qui, lorsque vous cliquez dessus, définit m_Application. CurrentTool = m_Tool. De plus, au lieu de faire une boîte de dialogue non modale, je recommanderais d'utiliser une fenêtre ancrable, peut-être en utilisant WPF .
Mise à jour Dans une tentative d'expier pour publier cette réponse boiteuse, j'ai essayé de pirater quelque chose ensemble. Il semble que vous devriez pouvoir créer dynamiquement une barre d'outils, la cacher, y ajouter l'outil (obtenir un ICommandItem à définir sur CurrentTool), puis supprimer la barre d'outils sans que l'utilisateur sache que l'outil était sur une barre d'outils. Cependant, ICommandBar.Dock et ICommandItem.Delete ne semblent pas fonctionner pour les barres d'outils dynamiques. À mon humble avis, c'est un bug.
la source
Dock
niDelete
travail, mais il est un bon début. Je vais approfondir laDelete
question, je pense.CommandBars.Find
problème s'est soudainement résolu, pour une raison inconnue), mais je coche cette réponse marque parce que c'est probablement ce que j'aurais fait.Je ne sais pas pourquoi avez-vous besoin d'ajouter l'outil dans une barre d'outils. Parce que j'ai travaillé avec quelque chose de similaire et je n'ai trouvé aucun besoin de l'ajouter dans la barre d'outils.
Dans mon cas, lorsque l'utilisateur clique sur un bouton de la fenêtre ancrable, un outil s'active. Pour effectuer ce travail, ma classe d'outils ressemble à ceci:
Conserver un champ statique de type d'outil dans la classe d'outils
Donc, chaque fois que j'ai besoin d'instancier cet outil, je l'appelle de la manière suivante:
Après avoir travaillé avec l'outil, je dois quitter l'instance d'outil. J'appelle donc
SelectionTool.ExitToolInstance()
méthode.Cette procédure fonctionne bien pour moi.
la source
Je résous généralement ce problème en faisant de la commande (OpenModelessDialogCommand dans votre cas) également un outil (
ITool
). En cliquant sur la commande, j'ouvre le formulaire. Ensuite, je peux également l'activer en tant qu'outil à tout moment.Si l'outil que vous souhaitez activer n'est pas le vôtre, vous pouvez relayer les appels de votre ITool (implémenté comme ci-dessus) vers l'autre instance d'outil.
la source
Si vous avez accès à l'objet carte, de nombreux outils peuvent être exécutés en appelant onCreate en envoyant par exemple l'objet MapControl pour le connecter à la carte. Après cela, il suffit d'exécuter la méthode onClick.
Ne fonctionne pas sur tous les outils ESRI car certains doivent être ajoutés à une barre d'outils.
la source
IMap
interfaceIMxDocument
, mais ce n'est clairement pas la même chose, n'est-ce pas?MapControl
objet (si j'en ai réellement besoin)IApplication
ou tout objet accessible à partir de là.IApplication
objet àOnCreate
- mais cela ne suffit pas (du moins pas pour mon outil personnalisé), car l'outil n'est pas activé parOnCreate
, et ne recevra donc aucun événement d'entrée.