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

Но есть большой минус: эта марка не может выводить позицию арматурного стержня! Впрочем, оно и понятно: одна зона армирования может состоять из разных стержней с разной позицией. Но там, где не хватает стандартного функционала — можно выкрутиться при помощи макроса! Что сейчас и сделаем.
Вообще, устанавливать обозначение с «Позицией» можно через инструмент «Аннотация для арматурных стержней«, но он тоже не всегда удобен: устанавливать нужно отдельно, марка не приклеивается к центральной точке, невозможно обозначить одной зоной несколько разных стержней и т.д.
Написал небольшой макрос для решения задачи.
Данный код получает марку арматурного стержня и записывает в «Армирование по площади». В случае, если в зоны входят стержни с разной маркой — они будут записаны через запятую. Аналогично обрабатывается «Арматура по траектории». Будет работать в любом шаблоне.
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);
}
Если штука окажется полезной — запилю макрос, работающий «в фоне» и забивающий марку автоматически. Пишите, если интересно!
А вот и видео: