====== Команды и меню ======
Для связи между функциями описанными внутри программной библиотеки и командами, доступными пользователю в программном комплексе [[http://www.topomatic.ru|Топоматик Робур]] используется следующая схема.
* Функции модуля, доступные для вызова в качестве команд помечаются атрибутом "cmd"
* Внутри файла [[developers:references:core.plugin|.plugin]] в секции [[developers:references:core.plugin:actions|actions]] описываются параметры команды
Функции помеченные атрибутом "cmd" доступны для вызова внутри самых разных параметров файла [[developers:references:core.plugin|.plugin]] с использованием системного вызова $(<имя команды>). Например в значениях для секции [[developers:references:core.plugin:variables|variables]].
После этого полученную команду можно использовать, например в секции [[developers:references:core.plugin:menubars|menubars]], тогда она появится в главном меню. Аналогичным образом можно добавить команду в контекстное меню, на панель инструментов и ленту - просто прописав её в соответствующей секции файла [[developers:references:core.plugin|.plugin]].
Создайте и настройте новый [[developers:tutorial:module|модуль]] для подключения к программному комплексу [[http://www.topomatic.ru|Топоматик Робур]].
В теле программного модуля объявите две команды, и декорируйте их атрибутом "cmd".
partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator
{
[cmd("test_cmd")]
public void ShowPrms(string prms)
{
MessageDlg.Show(prms);
}
[cmd("test_flags_cmd")]
public bool IsVisible(string prms)
{
return !prms.Equals("Выключить");
}
}
Задача команды "test_cmd" при вызове вывести на экран параметр, который в неё приходит, а команды "test_flags_cmd" определить, соответствует ли параметр слову "Выключить".
Если Вам необходимо вызвать какую-либо команду из другого модуля, то можно воспользоваться методом Execute из свойства Plugins синглтона ApplicationHost.Current. Например ApplicationHost.Current.Plugins.Execute("test_cmd", new object[] { "Параметр" }) вызовет команду "test_cmd" с параметром "Параметр"
Теперь необходимо сформировать наш файл [[developers:references:core.plugin|.plugin]]. Заполните его следующим образом.
{
"assemblies": {
"tutorial2": {
"assembly": "tutorial2.dll, tutorial2.ModulePluginHost"
}
},
"actions": {
"id_test_cmd1": {
"cmd": "test_cmd \"Параметр внутри команды\"",
"title": "Параметр внутри команды 1"
},
"id_test_cmd2": {
"cmd": "test_cmd \"%0\"",
"title": "Параметр снаружи из меню"
},
"id_test_cmd3": {
"cmd": "test_cmd \"%0\"",
"title": "Выключенный элемент",
"flags": "$(if, $(test_flags_cmd,Скрыть), 0, 1)"
}
},
"menubars": {
"rbproj": {
"items": [
{
"id": "test_menu",
"title": "Примеры"
}
]
},
"rbproj.test_menu": {
"items": [
"id_test_cmd1",
"id_test_cmd2 \"Параметр из меню\"",
"id_test_cmd3"
]
}
}
}
В секции [[developers:references:core.plugin:actions|actions]] мы описали три наших команды и все три связали с одной функцией из модуля, объявленой при помощи атрибута "cmd".
{
...
"actions": {
"id_test_cmd1": {
"cmd": "test_cmd \"Параметр внутри команды\"",
"title": "Параметр внутри команды 1"
},
"id_test_cmd2": {
"cmd": "test_cmd \"%0\"",
"title": "Параметр снаружи из меню"
},
"id_test_cmd3": {
"cmd": "test_cmd \"%0\"",
"title": "Выключенный элемент",
"flags": "$(if, $(test_flags_cmd,Выключить), 0, 1)"
}
}
...
}
Отличие состоит в том, что команда "id_test_cmd1" передает в нашу функцию параметр самостоятельно, команда "id_test_cmd2" получает этот параметр снаружи, а команда id_test_cmd2 отображается как выключенная, потому что мы используем нашу функцию "test_flags_cmd" для установки флагов этой команды.
В секции [[developers:references:core.plugin:menubars|menubars]] мы для стандартного проекта [[http://www.topomatic.ru|Топоматик Робур]] в главном меню определяем пункт Примеры, в котором описываем положение наших команд из секции actions.
{
...
"menubars": {
"rbproj": {
"items": [
{
"id": "test_menu",
"title": "Примеры"
}
]
},
"rbproj.test_menu": {
"items": [
"id_test_cmd1",
"id_test_cmd2 \"Параметр из меню\"",
"id_test_cmd3"
]
}
}
...
}
Для этого мы объявляем секцию "rbproj" - которая определяет что меню будет использоваться для проектов [[http://www.topomatic.ru|Топоматик Робур]] и в её элементах описываем меню с ключом "test_menu". После этого объявляем секцию "rbproj.test_menu" и в ней размещаем наши команды из секции [[developers:references:core.plugin:actions|actions]]. При этом для команды "id_test_cmd2" в качестве параметра передаем строчку "Параметр из меню".
Результатом запуска проекта будет появления в главном меню пункта "Примеры", с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом.
{{ :developers:tutorial:cmdattribute:tutorial2_menu.png?direct&400 |}}
[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial2"**.