Марка для «Арматуры по площади»

Всем привет! В видео про Армирование по площади я уже рассказывал про инструмент «Обозначение армирования по площади» и то, чем он удобен: устанавливается автоматически при создании, указывает «зону распределения», марка всегда приклеена к центральной точке:
Но есть большой минус: эта марка не может выводить позицию арматурного стержня! Впрочем, оно и понятно: одна зона армирования может состоять из разных стержней с разной позицией. Но там, где не хватает стандартного функционала — можно выкрутиться при помощи макроса! Что сейчас и сделаем.

Вообще, устанавливать обозначение с «Позицией» можно через инструмент «Аннотация для арматурных стержней«, но он тоже не всегда удобен: устанавливать нужно отдельно, марка не приклеивается к центральной точке, невозможно обозначить одной зоной несколько разных стержней и т.д.
Написал небольшой макрос для решения задачи.
Данный код получает марку арматурного стержня и записывает в «Армирование по площади». В случае, если в зоны входят стержни с разной маркой — они будут записаны через запятую. Аналогично обрабатывается «Арматура по траектории». Будет работать в любом шаблоне.
public void AreaRebarMarkStart()
{
    Document doc = this.ActiveUIDocument.Document;
    FilteredElementCollector areas = new FilteredElementCollector(doc)
        .OfClass(typeof(Autodesk.Revit.DB.Structure.AreaReinforcement))
        .WhereElementIsNotElementType();
    FilteredElementCollector paths = new FilteredElementCollector(doc)
        .OfClass(typeof(Autodesk.Revit.DB.Structure.PathReinforcement))
        .WhereElementIsNotElementType();
    List<Element> col = areas.Concat(paths).ToList();
    int count = 0;
    using(Transaction t = new Transaction(doc))
    {
        t.Start("Area rebar mark");
        foreach(Element elem in col)
        {
            HashSet<string> marks = new HashSet<string>();
            string rebarSystemMark = "";
            List<ElementId> rebarIds = null;
            Autodesk.Revit.DB.Structure.AreaReinforcement ar =
                elem as Autodesk.Revit.DB.Structure.AreaReinforcement;
            if(ar != null) 
                rebarIds = ar.GetRebarInSystemIds().ToList();
            Autodesk.Revit.DB.Structure.PathReinforcement pr = 
                elem as Autodesk.Revit.DB.Structure.PathReinforcement;
            if(pr != null) 
                rebarIds = pr.GetRebarInSystemIds().ToList();
            foreach(ElementId rebarId in rebarIds)
            {
                Element rebar = doc.GetElement(rebarId);
                string rebarMark = rebar.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).AsString();
                marks.Add(rebarMark);
            }
            List<string> marksList = marks.ToList();
            for(int i = 0; i< marks.Count; i++)
            {
                rebarSystemMark += marksList[i];
                if(i< marks.Count - 1) rebarSystemMark += ", ";
            }
            elem.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(rebarSystemMark);
            count++;
        }
        t.Commit();
    }
    TaskDialog.Show("Area rebar mark", "Обработано зон: " + count);
}
Если штука окажется полезной — запилю макрос, работающий «в фоне» и забивающий марку автоматически. Пишите, если интересно!
А вот и видео: