Найти в Дзене
Тонкости Renga

Часть 5. Скрипт для подсчета объектов

Мы уже умеем открывать проекты Renga, сохранять их, теперь научимся работать с объектами в проекте. Начнем с простой задачи – посчитать количество объектов в проекте. Конечно, вы можете это сделать и с помощью спецификации. Но наша задача это просто пример, который вы можете использовать как базу для своих скриптов. И, что важнее, все задачи работы с проектом так или иначе связаны с доступом к объектам в нем. Например, чтобы добавить свойство объекта или записать в него значение, вы сначала должны найти сам объект. Для того, чтобы показать работу скрипта создадим проект с несколькими различными объектами: стенами, балками, колоннами и т.п., которые и посчитаем скриптом. Вы, конечно, можете создать свой проект, чтобы понять работу скрипта. Готовый проект можно скачать здесь: https://disk.yandex.ru/d/cJG-eXi4nHZqgw Приступим к формированию скрипта. Для открытия файла проекта используем часть скрипта из предыдущих статей. Для удобства работы со скриптом добавим возможность его открытия д

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

Конечно, вы можете это сделать и с помощью спецификации. Но наша задача это просто пример, который вы можете использовать как базу для своих скриптов. И, что важнее, все задачи работы с проектом так или иначе связаны с доступом к объектам в нем. Например, чтобы добавить свойство объекта или записать в него значение, вы сначала должны найти сам объект. Для того, чтобы показать работу скрипта создадим проект с несколькими различными объектами: стенами, балками, колоннами и т.п., которые и посчитаем скриптом. Вы, конечно, можете создать свой проект, чтобы понять работу скрипта. Готовый проект можно скачать здесь: https://disk.yandex.ru/d/cJG-eXi4nHZqgw

Приступим к формированию скрипта. Для открытия файла проекта используем часть скрипта из предыдущих статей. Для удобства работы со скриптом добавим возможность его открытия диалоговым окном Windows и, чтобы не забыть, сразу добавим закрытие проекта и программы:

Сам скрипт будет состоять из нескольких строк работы с проектом и моделью в нем. Запрашиваем модель, содержащуюся в проекте: $Model3D = $project.model; Далее получаем список объектов в модели: $ModelObjs = $project.model.GetObjects();

Чтобы просуммировать количество, создадим столько переменных, сколько типов объектов мы хотим просуммировать и обнулим их:

$CntWalls = 0; $CntColumns = 0; $CntRooms = 0; $CntDoors = 0; $CntWindows = 0; $CntBeams = 0; $CntFloors = 0; $CntRamps = 0; $CntStairs = 0;
CntWallFoundation =0; $CntIsolatedFoundation =0;

Суммируем количество стен, колонн, помещений, дверей, окон, балок, перекрытий, пандусов, лестниц, ленточных фундаментов, столбчатых фундаментов.

Следующим шагом мы проходим по списку и, определяя тип объекта, суммируем количество в зависимости от типа. Чтобы определить типы объекта, откроем справку API Renga и найдем там страницу с типами объектов: https://help.rengabim.com/api/group___object_types.html

На этой странице вы найдете уникальные идентификаторы (GUID) типов объектов в Renga. Например, идентификатор (GUID) уровня {c3ce17ff-6f28-411f-b18d-74fe957b2ba8}. Найти его не сложно, если вы знаете английский язык. Константа, содержащая этот идентификатор называется Renga::ObjectTypes::Level. Именно эти идентификаторы мы используем для определения типа объекта.

Чтобы пройти по списку объектов, используем стандартный цикл for:

for ($i = 0; $i -lt $ModelObjs.Count(); $i++)

Внутри тела цикла получаем следующий по списку объект: $object = $ModelObjs.GetByIndex($i);

Далее, определяем, что это за объект, сравнивая свойство объекта ObjectTypeS с одним из требуемых идентификаторов.

Например,

if ($object.ObjectTypeS -eq "{4329112A-6B65-48D9-9DA8-ABF1F8F36327}")

В данном выражении свойство объекта $object.ObjectTypeS возвращает строку уникального идентификатора его типа. Мы сравниваем его со строкой "{4329112A-6B65-48D9-9DA8-ABF1F8F36327}", которая в справке описана как идентификатор стен. Если они совпадают (оператор -eq означает равенство значений), то мы прибавляем количество стен в переменной $CntWalls. Если же нет, просто переходим к следующему сравнению. И так до тех пор, пока не проверим все требуемые нам типы объектов.

После того, как все объекты будут проверены и просуммированы выбранные нами типы, по окончании цикла выводим полученное количество объектов на экран:

Write-Host "Стен: " $CntWalls;

Write-Host "Колонн: " $CntColumns;

Write-Host "Балок: " $CntBeams;

Write-Host "Перекрытий: " $CntFloors;

Write-Host "Помещений: " $CntRooms;

Write-Host "Дверей: " $CntDoors;

Write-Host "Окон: " $CntWindows;

Write-Host "Лестниц: " $CntStairs;

Write-Host "Пандусов: " $CntRamps;

Write-Host "Ленточных фундаментов: " $CntWallFoundation;

Write-Host "Столбчатых фундаментов: " $CntIsolatedFoundation;

После чего закрываем проект и программу Renga

$result =$renga_app.CloseProject($true);

{$renga_app.Quit()}

К сожалению Дзен больше не дает возможности оформлять код из Gihub Gist непосредственно в статье, поэтому полный текст скрипта вы можете посмотреть непосредственно там: https://gist.github.com/NicetiesRenga/77205b2fa476ce1f2559a4cd5d1dedcc

Скрипт подсчета объектов в Renga.ps1

Вы также можете скачать скрипт с яндекс-диска по ссылке https://disk.yandex.ru/d/7erSNmFk2KcHVw

Последний шаг – запускаем скрипт и убеждаемся в его работоспособности.

-2

Файл проекта и полный текст скрипта можно скачать здесь: https://disk.yandex.ru/d/EqqxKaAhGd8_dA

Примечание.

Под количеством стен понимается количество отрезков стен. Т.е. если вы сделаете стену из нескольких кусочков, то внешне это будет одна стена, но количество стен увеличится, т.к. для Renga это будут отдельные объекты-стены. Аналогичная ситуация будет с ленточными фундаментами, балками, перекрытиями и т.п. Помните об этом, когда захотите посчитать количество объектов в проекте.

Видео, демонстрирующее создание описанных выше скриптов
https://dzen.ru/video/watch/6458f966d5b76e387a541783