Найти в Дзене

Создание размеров в Revit API. Дополнение (часть 2)

Оглавление

Часть 1

Эта статья — продолжение и развитие первой статьи про расстановку размеров. Как оказалось, в некоторых случаях я был неправ, и следование тексту статьи могло бы привести вас к неверному результату.

Исходные данные

Предположим, у нас есть некоторое семейство, которое нам нужно образмерить. Допустим, это имитатор раскладки арматурных стержней. Для всех уровней детализации мы нарисовали для него отдельной категорией линии границы. Мы получаем их через свойство Geometry, откидываем всё лишнее, берём их референсы, пытаемся создать размеры, и получаем... ничего. При этом код выполняется полностью, размеры создаются, мы можем поймать их Id, выделить по Id, но мы не можем из увидеть. В чём же проблема? И что делать?

Причина

На самом деле, я так до конца и не понял, в чём причина. Самое интересное, что руками на тех же линиях создать размеры мы можем, мы можем выделить через код вновь созданный размер и убедиться, что его величина правильная, но мы не можем его увидеть. Поэтому причин я не знаю.

Здесь я оставил код, который создаёт невидимые размеры: https://gist.github.com/SergeyNefyodov/71986a886d1b7f212eedf700ce036c65

А здесь семейство, на котором они строятся (ну, или не строятся):

необразмериваемое.rfa

Можете сами проверить, попробовать найти причину и написать её в комментарии

Решение

Как мне кажется, правилом хорошего тона является образмеривание опорных плоскостей в семействе, а также назначение им (опорным плоскостям) требуемого значения параметра ("Связь"). Поступим здесь также: левой опорной плоскости назначим связь "по левому краю", а правой, по правому.

А далее получим Reference через метод GetReferences класса FamilyInstance.

Поскольку мы добавили связи к плоскостям, то можно уверенно написать так:

array.Insert(instance.GetReferences(FamilyInstanceReferenceType.Left)[0], array.Size);
array.Insert(instance.GetReferences(FamilyInstanceReferenceType.Right)[0], array.Size);

Такой код отлично сработает.

Через методы класса FamilyInstance можно находить Reference также и по имени. Можно находить и просто слабые связи (WeakReference), обычно линии модели имеют их, и привязываться к ним.

Код, который выставляет для такого размеры, я выложил здесь. https://gist.github.com/SergeyNefyodov/8a33f7c3288710f56404510abf3cd70d

Размерную линию я правда так и ищу через геометрию, но это уже совсем другая история.

Как добавить себе код из макроса читайте здесь.

И не забывайте подписываться на мой телеграм-канал. До новых встреч!