Estoy trabajando en un complemento para ArcMap 10.0 que agrega una barra de herramientas a ArcMap. Un OpenModelessDialogCommand
botón de comando ( ) en esa barra de herramientas abre un cuadro de diálogo WinForms sin modo, desde el cual MyTool
se puede activar una herramienta ( ) para, por ejemplo, seleccionar una función en el mapa.
My Config.esriaddinx
contiene estas declaraciones de comandos y barras de herramientas:
<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>
Lo que tengo problemas es activar MyTool
en el formulario. Todo lo que he encontrado en Internet son ejemplos de código a lo largo de las líneas de:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Sin embargo, esto aparentemente requiere que MyTool
realmente aparezca en una barra de comandos (por ejemplo, barra de herramientas) de mi complemento. Pero ese no es el caso. Entonces, probé esto a continuación:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Incluso he buscado agregar un invisible AxToolbarControl
a mi formulario y agregar un botón para MyTool
allí; pero luego me encuentro con problemas sobre cómo conectar esa barra de herramientas (vía SetBuddyControl
) al mapa del documento abierto. No quiero que la herramienta funcione por separado AxMapControl
, quiero que funcione directamente con el mapa principal que se muestra en ArcMap.
Pregunta:
¿Cómo activo una herramienta personalizada que no se agrega a ninguna barra de herramientas (u otra barra de comandos, para el caso)?
fuente
bug
parece que todavía no existe; por favor, siéntase libre de editar las etiquetas usted mismo.Respuestas:
Esto funcionó para mí usando ArcGIS 10 SP1. Mi herramienta personalizada no está en una barra de herramientas:
fuente
Nunca he intentado esto, pero parece que debería funcionar: en su forma no modal, tenga dos variables miembro, la primera (m_Tool) haciendo referencia a su ITool y la segunda (m_Application) haciendo referencia a la aplicación IA. En el constructor de su forma no modal, haga que cree una instancia de ITool y llame a OnCreate , pasando una referencia de aplicación IA.En su forma sin modo, tenga un botón que, cuando se hace clic, establece m_Application. CurrentTool = m_Tool. Además, en lugar de hacer un diálogo sin modo, recomendaría usar una ventana acoplable, quizás usando WPF dentro de ella .
Actualización En un intento de expiar por publicar esta respuesta tonta, he intentado piratear algo juntos. Parece que debería poder crear dinámicamente una barra de herramientas, ocultarla, agregarle la herramienta (obtener un ICommandItem para configurar CurrentTool) y luego eliminar la barra de herramientas sin que el usuario sepa que la herramienta estaba en una barra de herramientas. Sin embargo, ICommandBar.Dock e ICommandItem.Delete no parecen funcionar para las barras dinámicas. En mi humilde opinión esto es un error.
fuente
Dock
niDelete
funcione, pero es un buen comienzo. Seguiré investigando elDelete
tema, creo.CommandBars.Find
problema se resolvió de repente, por alguna razón desconocida), pero le doy a esta respuesta la señal marca porque esto es probablemente lo que habría hecho.No sé por qué necesita agregar la herramienta en una barra de herramientas. Porque, he trabajado con algo similar y no he encontrado la necesidad de agregarlo en la barra de herramientas.
En mi caso, cuando el usuario hace clic en un botón en la ventana acoplable, se activa una herramienta. Para realizar este trabajo, mi clase de herramienta tiene el siguiente aspecto:
Mantenga un campo estático de tipo de herramienta en la clase de herramienta
Entonces, cada vez que necesito crear una instancia de esta herramienta, la llamo de la siguiente manera:
Después de trabajar con la herramienta, necesito salir de la instancia de la herramienta. Entonces llamo
SelectionTool.ExitToolInstance()
método.Este procedimiento funciona bien para mí.
fuente
Por lo general, resuelvo esto haciendo que el comando (OpenModelessDialogCommand en su caso) también sea una herramienta (
ITool
). Al hacer clic en el comando, abro el formulario. Entonces también puedo activarlo como herramienta en cualquier momento.Si la herramienta que desea activar no es la suya, puede retransmitir llamadas desde su ITool (implementado como se indicó anteriormente) a la otra instancia de la herramienta.
fuente
Si tiene acceso al objeto de mapa, se pueden ejecutar muchas herramientas llamando a onCreate enviando, por ejemplo, el objeto MapControl para conectarlo al mapa. Después de eso es solo para ejecutar el método onClick.
No trabaje en todas las herramientas de ESRI porque algunas deben agregarse a una barra de herramientas.
fuente
IMap
interfazIMxDocument
, pero claramente eso no es lo mismo, ¿verdad?MapControl
atravesar un objeto (si es que realmente necesito uno)IApplication
o cualquier objeto accesible desde allí.IApplication
objetoOnCreate
, pero eso no es suficiente (al menos no para mi herramienta personalizada), porque la herramienta no se activaOnCreate
y, por lo tanto, no recibirá ningún evento de entrada.