Как пользоваться IAlignmentPluginInitializator?

Главная Форум Средства разработки Топоматик Robur Как пользоваться IAlignmentPluginInitializator?

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Автор
    Сообщения
  • #4731
    Илья
    Участник

    Здравствуйте! На основе абстрактного класса Topomatic.Alg.Plugins.AlignmentPlugin написал свой плагин для работы с RoadAlignment. Не получается разобраться, как организовать автоматическое подключение плагина к дороге при запуске Робура. Подходит интерфейс IAlignmentPluginInitializator с методом CreatePlugins из того же пространства имен, пробовал его реализовать и в классе плагина, и в классе модуля (который наследуется от PluginInitializator) — результата нет, модуль загружается, команды запускаются, но приходится «вручную» добавлять экземпляр плагина в RoadAlignment.Plugins. Аналогичная проблема и с созданием слоев, необходимых для плагина — есть интерфейс IAlignmentPluginLayersInitializator и метод CreateSectionLayers, но результат тот же — только добавление слоя «вручную». Помогите разобраться, как в модуле подключать плагины и добавлять слои? Заранее благодарен!

    #4732
    Support 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);
            }
        }
    

    Для наглядности прикрепляем пример плагина с таблицей смещений.

    Вложения:
    Вы должны войти для просмотра вложений.
    #4734
    Илья
    Участник

    Спасибо, все получилось! Благодарю за пример плагина, очень подробный

    #5482
    Илья
    Участник

    Еще раз здравствуйте! В продолжение темы: в руководстве разработчика про инициализацию модулей сказано, что «… в момент первой инициализации модуля, потом он будет сохранен и инициализация модуля будет вызываться по требованию.» Есть возможность сделать загрузку модуля автоматической при загрузке проекта, а не «по требованию»?

    #5483

    Добрый день! Нет, на текущий момент такой возможности нет. Под инициализацией по требованию подразумевается либо необходимость в какой-либо функции этого модуля, либо зависимость модуля от другого модуля. В частности для AlignmentPlugin если значение IsEmpty вернёт False, то будет загружен модуль реализующий требуемый IAlignmentPluginInitializator.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Для ответа в этой теме необходимо авторизоваться.