Я работаю над надстройкой для ArcMap 10.0, которая добавляет панель инструментов в ArcMap. Одна OpenModelessDialogCommand
кнопка command ( ) на этой панели инструментов открывает немодальное диалоговое окно WinForms, из которого MyTool
можно активировать инструмент ( ), например, для выбора объекта на карте.
My Config.esriaddinx
содержит следующие объявления команд и панелей инструментов:
<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>
У меня проблемы с активацией MyTool
в форме. Все, что я нашел в интернете, это примеры кода:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Тем не менее, это, очевидно, требует, чтобы на MyTool
самом деле появился в панели команд (например, панель инструментов) моей надстройки. Но это не так. Итак, я попробовал это дальше:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Я даже смотрел на добавление невидимой AxToolbarControl
формы и добавление кнопки для MyTool
нее; но затем у меня возникают проблемы с подключением этой панели инструментов (через SetBuddyControl
) к карте открытого документа. Я не хочу, чтобы инструмент функционировал отдельно AxMapControl
, я хочу, чтобы он работал напрямую с основной картой, показанной в ArcMap.
Вопрос:
Как активировать пользовательский инструмент, который не добавляется ни на одну панель инструментов (или в другую панель команд, в этом отношении)?
источник
bug
, похоже, его пока нет; пожалуйста, не стесняйтесь редактировать теги самостоятельно.Ответы:
Это работало для меня, используя ArcGIS 10 SP1. Мой пользовательский инструмент отсутствует на панели инструментов:
источник
Я никогда не пробовал этого, но, похоже, он должен работать: в вашей немодальной форме есть две переменные-члены: первая (m_Tool) ссылается на ваш ITool, а вторая (m_Application) ссылается на IApplication. В конструкторе для вашей немодальной формы сделайте так, чтобы он создал экземпляр ITool и вызвал OnCreate , передав ссылку на приложение IApplication.На вашей немодальной форме есть кнопка, которая при нажатии устанавливает m_Application. CurrentTool = m_Tool. Кроме того, вместо использования немодального диалога, я бы рекомендовал использовать закрепляемое окно, возможно, используя в нем WPF .
Обновление В попытке искоренить публикацию этого неубедительного ответа я попытался что-то взломать вместе. Похоже, вы должны иметь возможность динамически создавать панель инструментов, скрывать ее, добавлять к ней инструмент (получая ICommandItem для установки в CurrentTool), а затем удалять панель инструментов, даже если пользователь никогда не знал, что инструмент был на панели инструментов. Однако ICommandBar.Dock и ICommandItem.Delete, похоже, не работают для динамических тобаров. ИМХО это баг.
источник
Dock
ниDelete
работа, но это начало хорошее. Думаю, я займусь этимDelete
вопросом дальше.CommandBars.Find
проблема внезапно решилась сама по какой-то неизвестной причине), но я даю этот ответ галочкой Марк, потому что это, вероятно, то, что я бы сделал.Я не знаю, почему вам нужно добавить инструмент на панели инструментов. Потому что я работал с чем-то похожим, и мне не нужно добавлять его в панель инструментов.
В моем случае, когда пользователь нажимает кнопку в присоединяемом окне, инструмент активируется. Для выполнения этой работы мой класс инструментов выглядит следующим образом:
Сохраняйте статическое поле типа инструмента в классе инструмента
Поэтому, когда мне нужно создать экземпляр этого инструмента, я вызываю его следующим образом:
После работы с инструментом мне нужно выйти из экземпляра инструмента. Поэтому я называю
SelectionTool.ExitToolInstance()
метод.Эта процедура отлично работает для меня.
источник
Обычно я решаю эту проблему, делая команду (OpenModelessDialogCommand в вашем случае) также инструментом (
ITool
). Нажав на команду, я открываю форму. Тогда я также могу активировать его как инструмент в любой момент.Если инструмент, который вы хотите активировать, не является вашим собственным, вы можете переадресовывать вызовы с вашего ITool (реализовано, как описано выше) на другой экземпляр инструмента.
источник
Если у вас есть доступ к объекту карты, многие инструменты можно запустить, вызвав onCreate, отправив, например, объект MapControl, чтобы подключить его к карте. После этого нужно только запустить метод onClick.
Не работайте со всеми инструментами ESRI, потому что некоторые из них необходимо добавить на панель инструментов.
источник
IMap
через интерфейсIMxDocument
, но ясно, что это не то же самое, не так ли?MapControl
объект (если он мне вообще нужен)IApplication
или любой объект, до которого можно добраться.IApplication
объектOnCreate
- но этого недостаточно (по крайней мере, не для моего пользовательского инструмента), потому что инструмент не активируетсяOnCreate
и, следовательно, не будет получать никаких входных событий.