Estou trabalhando em um suplemento para o ArcMap 10.0 que adiciona uma barra de ferramentas ao ArcMap. Um OpenModelessDialogCommand
botão de comando ( ) nessa barra de ferramentas abre uma caixa de diálogo WinForms sem modelagem, na qual uma ferramenta ( MyTool
) pode ser ativada para, por exemplo, selecionar um recurso no mapa.
My Config.esriaddinx
contém estas declarações de comando e barra de ferramentas:
<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>
Estou tendo problemas com a ativação MyTool
do formulário. Tudo o que eu encontrei na internet são exemplos de código ao longo das linhas de:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
No entanto, isso aparentemente requer que MyTool
realmente apareça em uma barra de comandos (por exemplo, barra de ferramentas) do meu suplemento. Mas esse não é o caso. Então, eu tentei isso a seguir:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Eu até tentei adicionar um invisível AxToolbarControl
ao meu formulário e adicionar um botão por MyTool
lá; mas estou com problemas para conectar a barra de ferramentas (via SetBuddyControl
) ao mapa do documento aberto. Não quero que a ferramenta funcione separadamente AxMapControl
, quero que ela funcione diretamente com o mapa principal mostrado no ArcMap.
Pergunta:
Como ativo uma ferramenta personalizada que não é adicionada a nenhuma barra de ferramentas (ou outra barra de comandos)?
fonte
bug
parece que ainda não existe; sinta-se à vontade para editar as tags.Respostas:
Isso funcionou para mim usando o ArcGIS 10 SP1. Minha ferramenta personalizada não está em uma barra de ferramentas:
fonte
Eu nunca tentei isso, mas parece que deveria funcionar: No seu formulário sem modelo, existem duas variáveis de membro, a primeira (m_Tool) referenciando seu ITool e a segunda (m_Application) referenciando o IApplication. No construtor para seu formulário sem modelo, instancie o ITool e chame OnCreate , passando uma referência de IApplication.No formulário sem modelo, há um botão que, quando clicado, define m_Application. CurrentTool = m_Tool. Além disso, em vez de fazer uma caixa de diálogo sem modelo, eu recomendaria o uso de uma janela acoplável, talvez usando o WPF dentro dela .
Atualização Na tentativa de reparar a publicação desta resposta esfarrapada, tentei hackear algo juntos. Parece que você deve ser capaz de criar dinamicamente uma barra de ferramentas, ocultá-la, adicionar a ferramenta a ela (fazer com que um ICommandItem seja definido como CurrentTool) e excluir a barra de ferramentas sem que o usuário saiba que a ferramenta estava em uma barra de ferramentas. No entanto, ICommandBar.Dock e ICommandItem.Delete não parecem funcionar para barras de controle dinâmicas. IMHO isso é um bug.
fonte
Dock
nemDelete
funcione, mas é um bom começo. Pensarei mais sobre oDelete
assunto.CommandBars.Find
problema de repente se resolveu, por algum motivo desconhecido), mas estou dando essa resposta marcar, porque isso é provavelmente o que eu teria feito.Não sei por que você precisa adicionar a ferramenta em uma barra de ferramentas. Porque, trabalhei com algo semelhante e não encontrei necessidade de adicioná-lo na barra de ferramentas.
No meu caso, quando o usuário clica em um botão na janela acoplável, uma ferramenta é ativada. Para executar este trabalho, minha classe de ferramentas se parece com a seguinte:
Mantenha um campo estático do tipo de ferramenta na classe de ferramentas
Portanto, sempre que preciso instanciar essa ferramenta, eu a chamo da seguinte maneira:
Depois de trabalhar com a ferramenta, preciso sair da instância da ferramenta. Então eu chamo
SelectionTool.ExitToolInstance()
método.Este procedimento funciona bem para mim.
fonte
Geralmente resolvo isso fazendo o comando (OpenModelessDialogCommand no seu caso) também uma ferramenta (
ITool
). Ao clicar no comando, abro o formulário. Então eu também posso ativá-lo como uma ferramenta a qualquer momento.Se a ferramenta que você deseja ativar não for sua, você poderá retransmitir chamadas do seu ITool (implementado como acima) para a outra instância da ferramenta.
fonte
Se você tiver acesso ao objeto de mapa, muitas ferramentas poderão ser executadas fazendo uma chamada para o onCreate enviando, por exemplo, o objeto MapControl para conectá-lo ao mapa. Depois disso, é apenas para executar o método onClick.
Não trabalhe em todas as ferramentas ESRI, porque algumas precisam ser adicionadas a uma barra de ferramentas.
fonte
IMap
interfaceIMxDocument
, mas claramente isso não é o mesmo, é?MapControl
objeto (se realmente precisar de um)IApplication
ou qualquer outro objeto acessível a partir daí.IApplication
objeto paraOnCreate
- mas isso não é suficiente (pelo menos não para a minha ferramenta personalizada), porque a ferramenta não é ativadaOnCreate
e, portanto, não recebe nenhum evento de entrada.