====== Команды и меню ====== Для связи между функциями описанными внутри программной библиотеки и командами, доступными пользователю в программном комплексе [[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"**.