Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: enot от 29-08-2018, 11:51:37

Название: Фильтр для триггера глоб.параметра
Отправлено: enot от 29-08-2018, 11:51:37
Как будет выглядеть фильтр для триггера,

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

если требуется отследить изменение значения глобального параметра (не получается применить ElementCategoryFilter , так как у глобального параметра судя по всему нет BuiltInCategory)
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: Александр Игнатович от 29-08-2018, 12:04:14
Попробуйте так

Код - C# [Выбрать]
  1. var filter = new ElementClassFilter(typeof(GlobalParameter));
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: enot от 29-08-2018, 12:29:19
Пробовал, но триггер просит именно ElementCategoryFilter

Пробовал через коллекцию, но что-то не реагирует
(https://s33.postimg.cc/461l6xzx7/Trigger_Global.png) (https://postimg.cc/image/461l6xzx7/)
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: Александр Игнатович от 29-08-2018, 13:24:17
Цитировать
но триггер просит именно 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.  
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: enot от 29-08-2018, 14:32:59
метод  data.GetModifiedElementIds()
 получает все Id элементов (содержащих параметры) -
или
все Id элементов и Id самих параметров ?
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: Александр Игнатович от 29-08-2018, 14:35:11
Посмотрите код и все вопросы отпадут

1)
Код - C# [Выбрать]
  1. var filter = new ElementClassFilter(typeof(GlobalParameter));
2)
Код - C# [Выбрать]
  1. var globalParameter = data
  2.                         .GetModifiedElementIds()
  3.                         .Select(doc.GetElement)
  4.                         .Cast<GlobalParameter>();
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: enot от 29-08-2018, 14:56:00
Все получилось. Спасибо
Название: Re: Фильтр для триггера глоб.параметра
Отправлено: enot от 29-08-2018, 15:36:11
Все-таки хотелось бы уточнить,
data.GetModifiedElementIds() - это Id всех измененных элементов или только Id измененных элементов определенных в Filter (в триггере)