Фильтр для триггера глоб.параметра

Автор Тема: Фильтр для триггера глоб.параметра  (Прочитано 4752 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Как будет выглядеть фильтр для триггера,

( UpdaterRegistry.AddTrigger(updater_.GetUpdaterId(), Filter, Element.GetChangeTypeParameter(глобальный_параметр)

если требуется отследить изменение значения глобального параметра (не получается применить ElementCategoryFilter , так как у глобального параметра судя по всему нет BuiltInCategory)

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Попробуйте так

Код - C# [Выбрать]
  1. var filter = new ElementClassFilter(typeof(GlobalParameter));

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Пробовал, но триггер просит именно ElementCategoryFilter

Пробовал через коллекцию, но что-то не реагирует


Отмечено как Решение enot 29-08-2018, 14:56:15

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Цитировать
но триггер просит именно ElementCategoryFilter

не верю, updater-ы использую давно и плотно с совершенно разными фильтрами.

Метод Execute команды:
Код - C# [Выбрать]
  1. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2. {
  3.         var uiapp = commandData.Application;
  4.         var uidoc = uiapp.ActiveUIDocument;
  5.         var doc = uidoc.Document;
  6.  
  7.         var updater = new GlobalParameterUpdater(uiapp.ActiveAddInId);
  8.  
  9.         if (!UpdaterRegistry.IsUpdaterRegistered(updater.GetUpdaterId(), doc))
  10.                 UpdaterRegistry.RegisterUpdater(updater, doc, true);
  11.  
  12.         UpdaterRegistry.RemoveDocumentTriggers(updater.GetUpdaterId(), doc);
  13.  
  14.         var filter = new ElementClassFilter(typeof(GlobalParameter));
  15.  
  16.         UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), doc, filter, Element.GetChangeTypeAny());
  17.        
  18.         return Result.Succeeded;
  19. }

Сам Updater:
Код - C# [Выбрать]
  1. public class GlobalParameterUpdater : IUpdater
  2. {
  3.         private readonly UpdaterId updaterId;
  4.  
  5.         public GlobalParameterUpdater(AddInId addInId)
  6.         {
  7.                 updaterId = new UpdaterId(addInId, new Guid("c0608952-11a0-49ee-bd3f-55434a6decfd"));
  8.         }
  9.  
  10.         public void Execute(UpdaterData data)
  11.         {
  12.                 var doc = data.GetDocument();
  13.  
  14.                 var globalParameter = data
  15.                         .GetModifiedElementIds()
  16.                         .Select(doc.GetElement)
  17.                         .Cast<GlobalParameter>();
  18.  
  19.                 foreach (var parameter in globalParameter)
  20.                         TaskDialog.Show("dev", $"{parameter.Name}: affected {parameter.GetAffectedElements().Count} elements");
  21.         }
  22.  
  23.         public UpdaterId GetUpdaterId() => updaterId;
  24.  
  25.         public ChangePriority GetChangePriority() => ChangePriority.Annotations;
  26.  
  27.         public string GetUpdaterName()
  28.         {
  29.                 return nameof(GlobalParameterUpdater);
  30.         }
  31.  
  32.         public string GetAdditionalInformation()
  33.         {
  34.                 return "Test";
  35.         }
  36. }
  37.  

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
метод  data.GetModifiedElementIds()
 получает все Id элементов (содержащих параметры) -
или
все Id элементов и Id самих параметров ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Посмотрите код и все вопросы отпадут

1)
Код - C# [Выбрать]
  1. var filter = new ElementClassFilter(typeof(GlobalParameter));
2)
Код - C# [Выбрать]
  1. var globalParameter = data
  2.                         .GetModifiedElementIds()
  3.                         .Select(doc.GetElement)
  4.                         .Cast<GlobalParameter>();

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Все получилось. Спасибо

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Все-таки хотелось бы уточнить,
data.GetModifiedElementIds() - это Id всех измененных элементов или только Id измененных элементов определенных в Filter (в триггере)