Найти в Дзене

Создание листов и работа с видовыми экранами

Оглавление

Всем привет. Сегодня расскажу, как создавать листы, размещать на них видовые экраны, и менять местоположение видовых экранов. Поехали!

Создание листа

Для создания полноценного листа нам нужно будет разместить на нём основную надпись после создания. Именно её от нас потребует статический метод Create класса ViewSheet:

Для определения основной надписи мы вспомним про FilteredElementCollector. Вызовем его вот так:

var titleBlock = new FilteredElementCollector(RevitAPI.Document)
.OfCategory(BuiltInCategory.OST_TitleBlocks)
.WhereElementIsElementType().First(symbol => symbol.Name == "Необходимое имя");

Подробнее о LINQ я писал тут.

Создаём лист (не забывая открыть транзакцию):

var sheet = ViewSheet.Create(titleBlock.Document, titleBlock.Id);

Отлично, первая часть задачи выполнена! Не забывайте, что листы должны иметь уникальные номера, будьте аккуратны при назначении новых номеров через код.

Добавление видовых экранов

Тут тоже ничего сложного, точно такой же статический метод Create, только у класса Viewport:

-2

Передаём документ, новосозданный лист, Id требуемого к размещению вида и точку. А в какую точку размещать?
Тут есть 3 варианта:
1. Подобрать конкретную точку для вашего ВЭ методом пожбора, несколько раз запустив приложение в отладке

2. С помощью того же коллектора найти на листе экземпляр основной надписи, взять её BoundingBox, найти его центр, и положить в центр

Очевидно, что эти методы подойдут только тогда, когда у нас один видовой экран на листе. Но что делать, если мы хотим разместить много видовых экранов?

В общем случае, задача не имеет решения. Да и сами понимаете, конфигураций видовых экранов может быть множество, и выравнивать их между собой можно разными способами. Поэтому я расскажу только о том, как получить все видовые экраны листа, и вычислить их размеры на листе, а вот алгоритм для их расстановки уже придумывайте сами (и делитесь в комменты ссылками на гитхаб).

Получаем все видовые экраны листа: GetAllViewPorts
Далее начинается веселье: нельзя так просто взять и получить размеры экрана или задать ему координату угла. Мы можем получить координату центра:
GetBoxCenter, и получить Outline, представляющий по сути прямоугольник на листе: GetBoxOutline. Далее, используя свойства Min и Max этого Outline, мы можем получить его ширину (координата X) и высоту (координата Y). Координата Z значения не имеет.

Что делать дальше? Варианты разные:
1. Поместить первый ВЭ в левый верхний угол, остальные смещать в сторону от его края на половину ширины (когда все одной высоты)
2. Если знаем высоту экрана, что у нас получится 2 или 3 ряда, то можем в каждом ряду смещать на координату X, пока не достигнем края основной надписи, затем идти в другой ряд.

В общем, вам всё равно придётся придумывать свой алгоритм. Как в старой притче: я написал, как сделать удочку, а рыбу вы ловите сами.

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

-3