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