Главная › Форум › Средства разработки Топоматик Robur › Как пользоваться IAlignmentPluginInitializator?
- В этой теме 4 ответа, 3 участника, последнее обновление 1 год, 9 месяцев назад сделано Гончаров Василий.
-
АвторСообщения
-
06.06.2022 в 11:14 #4731ИльяУчастник
Здравствуйте! На основе абстрактного класса Topomatic.Alg.Plugins.AlignmentPlugin написал свой плагин для работы с RoadAlignment. Не получается разобраться, как организовать автоматическое подключение плагина к дороге при запуске Робура. Подходит интерфейс IAlignmentPluginInitializator с методом CreatePlugins из того же пространства имен, пробовал его реализовать и в классе плагина, и в классе модуля (который наследуется от PluginInitializator) — результата нет, модуль загружается, команды запускаются, но приходится «вручную» добавлять экземпляр плагина в RoadAlignment.Plugins. Аналогичная проблема и с созданием слоев, необходимых для плагина — есть интерфейс IAlignmentPluginLayersInitializator и метод CreateSectionLayers, но результат тот же — только добавление слоя «вручную». Помогите разобраться, как в модуле подключать плагины и добавлять слои? Заранее благодарен!
10.06.2022 в 10:51 #4732Support EngineerУчастникЗдравствуйте!
Для инициализации плагина необходимо добавить команду, которая возвращает экземпляр интерфейса IAlignmentPluginInitializator и зарегистрировать таск для этой команды.
Регистрация таска происходит в классе наследнике от PluginHostInitializator. Сам таск представляет собой строку, в формате <идентификатор_плагина>:<имя_команды>.
Сделать это можно следующим образом:Для удобства определим константу для идентификатора плагина.
static class PluginConsts { // Имя плагина сохраняемого в подобъекте, должно быть уникальным в пределах подобъекта public const string PluginID = "SimpleAlignmentPlugin"; } class ExampleModule : PluginInitializator, IAlignmentPluginInitializator, IAlignmentPluginLayersInitializator { [cmd("init_example_plugin")] private IAlignmentPluginInitializator GetThis() { return this; } //После подключения плагина, добавление слоёв должно происходить автоматически. //Пример метода добавления слоя плана. Для профиля и поперечников public void CreatePlanLayers(Alignment alignment, AlgCompoundLayer compoundLayer) { if (alignment.Plugins.Contains(PluginConsts.PluginID)) { if (compoundLayer[PluginLayer.Guid] == null) compoundLayer.Add(new PluginLayer()); } } }
Далее необходимо перекрыть метод Initialize у наследника PluginHostInitializator, в котором нужно зарегистрировать таск с именем в формате <идентификатор_плагина>:<имя_команды>.
Здесь нам потребуется значение атрибута cmd описанного выше.public sealed class ExamplePluginHost : PluginHostInitializator { protected override Type[] GetTypes() { return new Type[] { typeof(ExampleModule) }; } public override void Initialize(PluginFactory factory) { base.Initialize(factory); var taskName = PluginConsts.PluginID + ":init_example_plugin"; factory.RegisterTask(AlgCoreTools.TASK_PLUGIN, taskName); } }
Для наглядности прикрепляем пример плагина с таблицей смещений.
Вложения:
Вы должны войти для просмотра вложений.11.06.2022 в 02:54 #4734ИльяУчастникСпасибо, все получилось! Благодарю за пример плагина, очень подробный
03.02.2023 в 02:46 #5482ИльяУчастникЕще раз здравствуйте! В продолжение темы: в руководстве разработчика про инициализацию модулей сказано, что «… в момент первой инициализации модуля, потом он будет сохранен и инициализация модуля будет вызываться по требованию.» Есть возможность сделать загрузку модуля автоматической при загрузке проекта, а не «по требованию»?
07.02.2023 в 17:44 #5483Гончаров ВасилийУчастникДобрый день! Нет, на текущий момент такой возможности нет. Под инициализацией по требованию подразумевается либо необходимость в какой-либо функции этого модуля, либо зависимость модуля от другого модуля. В частности для AlignmentPlugin если значение IsEmpty вернёт False, то будет загружен модуль реализующий требуемый IAlignmentPluginInitializator.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.