Макрос — отметка верха и низа колонн

В Revit 2017 был расширен список элементов модели, у которых в спецификацию и марку может быть выведена высотная отметка их низа и верха. Но у колонн такой возможности нет.
Тем не менее, бывает задача указать отметку верха и низа колонны, например, на схеме расположения колонн.

Написал небольшой макрос для решения этой задачи.

Предварительно следует создать общие параметры проекта, тип данных — «Длина», по экземпляру, для категории «Несущие колонны»:

Общие параметры я использовал из файла общих параметров шаблона Weandrevit 2017.

Скопируйте код макроса и создайте макрос по инструкции.
В начале кода макроса укажите имена параметров, в которые будет записываться значение.

Результат:

Работает на любой версии Revit.
Приложение получает параметры «Базовый уровень» и «Смещение от уровня», а не сами точки геометрии, поэтому отметка может получиться некорректной, если, например, использовалось «Присоединение верха» колонны. Можно переписать макрос, чтобы он получал именно самую верхнюю и самую нижнюю точку геометрии, но пока так.

Пробный проект (Revit 2015):

Код макроса для копирования:

public void StartCalculateColumnElevation()
{
Document doc = this.ActiveUIDocument.Document;
string parameterBaseElevation = "Рзм.ОтметкаРасположения";
string parameterTopElevation = "Рзм.ОтметкаВерха";

List<Element> cols = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.ToElements()
.ToList();
int count = 0;
int errorCount = 0;

using(Transaction t = new Transaction(doc))
{
t.Start("Colums elevation");
foreach(Element col in cols)
{
try
{
ElementId baseLevelId = col.get_Parameter(BuiltInParameter.SCHEDULE_BASE_LEVEL_PARAM).AsElementId();
Level baseLevel = doc.GetElement(baseLevelId) as Level;
double baseLevelHeigth = baseLevel.Elevation;
double baseOffset = col.get_Parameter(BuiltInParameter.SCHEDULE_BASE_LEVEL_OFFSET_PARAM).AsDouble();
double baseElev = baseLevelHeigth + baseOffset;

ElementId topLevelId = col.get_Parameter(BuiltInParameter.SCHEDULE_TOP_LEVEL_PARAM).AsElementId();
Level topLevel = doc.GetElement(topLevelId) as Level;
double topLevelHeigth = topLevel.Elevation;
double topOffset = col.get_Parameter(BuiltInParameter.SCHEDULE_TOP_LEVEL_OFFSET_PARAM).AsDouble();
double topElev = topLevelHeigth + topOffset;

col.LookupParameter(parameterBaseElevation).Set(baseElev);
col.LookupParameter(parameterTopElevation).Set(topElev);
count++;
}
catch { errorCount++; }
}
t.Commit();
}

TaskDialog.Show("Отметки колонн""Обработано колонн: " + count + ", ошибок: " + errorCount);
}

Названия параметров можете поменять под свой проект.

UPD: также эту же задачу выполняет плагин «Определить отметки» из Bim-Starter.