суббота, 14 октября 2017 г.

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

В 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);
        }

Комментариев нет:

Отправить комментарий