Блог Муратова про Revit MEP
7.48K subscribers
1.58K photos
93 videos
17 files
1.71K links
Вадим @Vadim_Rafi — раньше ОВэшник, теперь BIM-менеджер и препод. Блог про Ревит — muratovbim.pro

Чат для вопросов: @revitask

— Создаю семейства для Ревита.
— Обучаю моделировать разделы ОВ, ВК, ТМ.

Не размещаю рекламу.
Download Telegram
Речь в опросе про вот такие насосы.
Раньше здесь было производство, а теперь — фотостудия и остатки былых систем.
Кому надо вот такие пожарные штуки, забирайте. Разработка настолько элементарная, что даже статью писать не хочу, тут просто нечего рассказывать, всё очень обычно.

Скачать с бимлиба
Трубчатый радиатор своими руками недорого
Над каким проектом в Ревите вы работаете прямо сейчас?

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

Был запрос на работу с изоляцией — давайте посмотрим, как это можно сделать в Ревите с помощью Динамо и Ревит АПИ.

Снова будут муки Петона и втыкания в VS Code, но зато получится круто, если получится. Мне нужно подготовить обложку для эфира, так что пока ставьте реакты, придёте или будет в записи смотреть.

Начало минут через 10-15. Скину сюда ссылку.

❤️ — приду на онлайн, буду смотреть
🔥 — крутяк, но посмотрю в записи, щас дела
🤝 — это мне не интересно, не мой профиль
Код из стрима, выкладываю в этот пост, чтобы вы могли скопировать в Динамо в более старых Ревитах:

import clr

clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager as DM

from RevitServices.Transactions import TransactionManager as TM

from System import Guid

doc = DM.Instance.CurrentDBDocument

clr.AddReference('RevitNodes')
import Revit

def getInsulationHost(insulation): # получаем основу с изоляции

host_el_Id = insulation.HostElementId # получили айди хоста изоляции
host_el = doc.GetElement(host_el_Id) # получаем элемент по его айди

return host_el

zapas = IN[0]
param_area_fittings = IN[1]
param_area_set = IN[2]

duct_insulation = []

duct_insulation.extend(FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctInsulations).WhereElementIsNotElementType().ToElements()) # получаем всю изоляцию из активного проекта

duct_ins_host = []

for di in duct_insulation:
duct_ins_host.append(getInsulationHost(di))

TM.Instance.EnsureInTransaction(doc) # Открытие транзакции

for duct_insulation_instance, host in zip(duct_insulation, duct_ins_host):

if isinstance(host, MEPCurve):
di_area = duct_insulation_instance.get_Parameter(BuiltInParameter.RBS_CURVE_SURFACE_AREA).AsDouble() * 0.3048 * 0.3048 * zapas
duct_insulation_instance.LookupParameter(param_area_set).Set(di_area)

elif host.Category.BuiltInCategory == BuiltInCategory.OST_DuctFitting:
if host.LookupParameter(param_area_fittings):
di_area_fitting = host.LookupParameter(param_area_fittings).AsDouble() * 0.3048 * 0.3048 * zapas
duct_insulation_instance.LookupParameter(param_area_set).Set(di_area_fitting)

elif host.Category.BuiltInCategory == BuiltInCategory.OST_DuctAccessory:
host_connectors = host.MEPModel.ConnectorManager.Connectors
connector_list = list(host_connectors)
if len(connector_list) == 2:

first_con_origin = connector_list[0].Origin
second_con_origin = connector_list[1].Origin
con_distance = first_con_origin.DistanceTo(second_con_origin) * 304.8

if connector_list[0].Shape == ConnectorProfileType.Rectangular:
con_height = connector_list[0].Height * 0.3048
con_width = connector_list[0].Width * 0.3048

con_perimeter = 2 * (con_height + con_width)

section_area = con_perimeter * con_distance / 1000

duct_insulation_instance.LookupParameter(param_area_set).Set(section_area)

elif connector_list[0].Shape == ConnectorProfileType.Round:
con_diameter = connector_list[0].Radius * 0.3048 * 2
con_perimeter = 3.14159 * con_diameter
section_area = con_perimeter * con_distance / 1000

duct_insulation_instance.LookupParameter(param_area_set).Set(section_area)

TM.Instance.TransactionTaskDone() # Закрытие транзакции

OUT = duct_insulation, duct_ins_host
Выкладываю скрипт в Динамо, он для Ревита 2023.

Если нужно то же самое в Ревитах помладше, то создайте новый скрипт в нужной версии Динамо, воссоздайте ноды, как в этом скрипте, и вставьте этот код в Питон скрипт.

Он должен работать с системами воздуховодов в шаблонах АДСК. С трубами работать тоже будет, но обрабатывать будет только прямые участки, для труб код нужно дополнять.

Условия работы в системе вентиляции:

1. Обрабатываются прямые и гибкие воздуховоды, фитинги воздуховодов и арматура воздуховодов.

2. Фитинги воздуховодов обрабатываются через параметр экземпляра семейства ADSK_Размер_Площадь. В нём должна внутри семейства считаться площадь детали. Скрипт просто скопирует её, также, как это делает сейчас апдейтер в шаблоне.

3. Чем код отличается, так это возможность обрабатывать канальную арматуру воздуховодов. То есть только ту арматуру, у которой две точки подключения, ни меньше, ни больше.

Скрипт берёт размер соединителя, берёт расстояние между соединителя, получаем периметр по размеру соединителя и длину между соединителями. Перемножаем — получаем упрощённую площадь арматуры.

Например, в сети стоит клапан длиной 100 мм, сечением 300х200 мм. Периметр будет 2 * (300 + 200) = 1 метр. Длина между соединителями — 0.1 м. Произведение даём нам площадь 0.1 м², её пишем в изоляцию. Само собой, что у реального изделия форма будет отличаться от просто куска воздуховода, но у тех же фильтров и клапанов, если не брать в расчёт привод и площадку под него, форма довольна близка к форме обычного воздуховода.

В итоге получаем хоть какой-то приблизительный расчёт, это лучше, чем ничего.

Также есть возможность накинуть запас, можно им тоже поиграться, чтобы подстраховать свои расчёты площади.

Кому пригодится — приятной работы. Если будут ошибки, то сорян, не повезло. Отдельное спасибо Паше Алтынникову 🫶 за напутствия в питонировании этого скрипта.
Привет. Спишь?
🙂 Привет, ревитчики!

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

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

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

А если разрабатываете, то это вам пища для размышлений, как делать семейства лучше и удобнее для пользователя.

Читаем, качаем: https://muratovbim.pro/blog/razrabotka-bim-modelej-balansirovochnoj-armatury-ridan/
Please open Telegram to view this post
VIEW IN TELEGRAM
#BIMdigest 096 — Вызовы
— вызовы модульного строительства на примере 4 компаний и подходов;
— переход Autodesk от файлов к облавной базе данных;
— требования к ПО для строительной отрасли будущего;
— Autodesk, проектирование и углеродный след;
— AI для архитекторов;
— 5 алгоритмов для апскейла изображений с ComfyUI;
— Revit 2025.2: что нового;
— плагин для создания отделки по помещениям;
— скрипт для работы и изоляцией воздуховодов;
— варианты CDE и правила работы с данными.
Вопрос к вам есть, ребята.

Если нарисовать букву Р и Т, то это ок, но при отключении тонких линий они превратятся в чёрное пятно.

Ещё есть вариант ввести цветовую индикацию. Например для термометра сделать кружок наполовину синий, наполовину красный. Для манометра сделать кружок черный или ещё какого-то цвета.

Или вообще не нужно ничего делать, всегда можно включить низкую детализация и по УГО разобраться. Или как?