Балансировка трубопроводов в системе отопления
Главная › Форумы › Задать вопрос › Балансировка трубопроводов в системе отопления
- В этой теме 20 ответов, 4 участника, последнее обновление 3 года, 10 месяцев назад сделано Андрей.
-
АвторСообщения
-
ВиталийУчастник
Описание проблемы:
Программа Revit рассчитывает самую гидравлически нагруженную ветку и выдает сопротивление суммируя сопротивление при данном расходе, оставшиеся ветки их может быть сотни она не учитывает тем самым не балансирует. Задача гидравлического расчета уравнять сопротивления всех имеющихся ветвей в проекте при их расчетных расходах с самой нагруженной веткой (которую и рассчитывает программа Revit ), то-есть найти разницу между сопротивлением самой нагруженной веткой и остальными, и далее рассчитать настройку балансировочного клапана.
Для этого создал скрипт в Dynamo где можно вручную выбрать все элементы ветви и далее отсортировал только падения давления просуммировал их получил полное сопротивления любой ветви. Далее нахожу разницу между самой большой веткой и выбранной, рассчитываю настройку клапана (можно сделать для любого производителя)
Проектируя систему отопления для маленького дома и имея от 10 до 20 приборов у меня будет 10-20 ветвей это не займет много времени выбирая элементы каждой ветви вручную и скрипт найдет суммарное гидравлическое сопротивление, далее настройка клапана и так далее.
Но есть и многоэтажные дома где таких ветвей будет сотни. Вручную выбирать каждую не актуально.
Сам вопрос:
(пользоваться Dynamo только начал многое не знаю)
Кто может подсказать каким путем, командами в Dynamo или с помощью Python Script что бы скрипт выбирал все элементы (трубы отводы тройники и т д) принадлежащие одной ветви в автоматической режиме. То-есть все элементы от начала системы отопления пройдя через один прибор отопления и до конца системы отопления.
А есть желание разобраться не в Динамо, а в АПИ?
Собрать все элементы одной системе просто.
Для начала программирования под Ревит нужно установить полезнейший плагин RevitLookup.
C помощью Лукап посмотреть элемент, понять как работает “объект”, пораскрывать зависимости объекта…
Пожалуйста, выложите куда-нибудь ваш пример проекта, поставте Лукап. Дальше помогу, если вопросы будут правильные.ВиталийУчастникСпасибо за ответ!!!!
Да есть желание разобраться в АПИ. Уже который день смотрю видео ничего не понятно откуда берутся эти команды типа PG_IDENTITY_DATA. Установил плагин RevitLookup я так понял с его помощью можно просмотреть все доступные свойства элемента и скопировать команды под АПИ.
вот ссылки на простенький файл примера https://yadi.sk/d/cIrwcZQmEL-0ig
вторая ссылка на программу в динамо https://yadi.sk/d/TMP0HGnnnp_7BA
Ну вот как пример.
Решения могут быть более элегантными.
Разберись хотябы с кодом, который я написал, потом будешь его дорабатывать со временем.Плохо понимаю в проектировании сетей в Ревите, но для Dynamo, необходимо, чтобы был параметр с одинаковым названием. Например, все элементы, принадлежащие одной ветке, должны иметь одинаковые значения одного и того же параметра, например “ветка 1”. Тогда Вы легко их отберете по этому признаку. Таким образом, все элементы Вашей системы должны иметь один и тот же параметр, который будет признаком для выбора в Dynamo.
Вообще, по Вашей специальности есть хорошие курсы https://stepik.org/course/51850/promo. Проходил другие курсы этих авторов, помогает хорошо, даже очень
ВиталийУчастникВаш код скачал. Но придется долго разбираться пока много что не понятно.
Например import clr – импортируем библиотеку clr в пайтон
ОUT = dir(clr) – и в этой библиотеке еще 42 под элемента такие как AddReference и т д – Попробую найти что это
Как немного разберусь напишу, а то дальше мне смыла куда – то двигаться нет
Не надо тебе понимать для скриптов что такое цлр.
Зри в корень, а ты сразу по мелочам.
Я не комментировал ветку импортов с 1 по 14 строчки.
Это почти стандартные импорты, которые должны быть в каждом коде.Для себя надо понимать, что цлр нужен только для того, чтоб
можно было подключать внешние библиотеки.
Мы используем только один метод clr.AddReference.
Все остальное без надобности.Ещё вопросы?
*****Ещё вопросы?***** Подскажите, пожалуйста, а для чего мы
#Переводим список из языка Питон в список .Net
typed_list = List[BuiltInCategory](cat_list)
В чем суть? (я понимаю, что мы это делаем для работы фильтра, но не понимаю сути – в каких случаях это делается и для чего)
Вопрос мне очень понравился. Уже ближе к сути.
Есть понимание чем чистый Python отличаестя от IronPython?
А тажке IronPython от С#?Питон с динамической типизацией. Т.е. может на лету переводить, например, число 123 в строку “123”
соответсвенно в методы _часто_ можно запихивать практически все, что угодно, не заботясь о типе засовываемого.
Например в функцию len() можно без явного преобразования запихнуть строку и список.
Объявление переменных также не нужно.Си-Шарп требует явное объявление переменных для выделения необходимого количества памяти.
АйронПайтон – это смесь бульдога_с_носорогом. Язык, который с помощью синтаксиса чистого питона
может работать с системой .Net.Такое совмещение, к сожалению, не удалось без проблем.
Наш вопрос со списком и типизированным списком это частный случай проблемы.Оказалось, что список, созданный в питоне, не соответсвует строго типизированному списку в дотНет.
т.е. в питоне не будет ошибкой lst = [1, “123”, [1]] – список содержит любые данные.
Список же в дотНет основан на классе List<T>.
List<T> represents a strongly typed list of objects that can be accessed by index.При инициализации класса я должен явно указать что именно (какие именно типы) будут содержаться в List<T>.
При попытке создать фильтр, метод ElementMulticategoryFilter
ожидает, что я подам в него объект типа List<T> – жестко типизированный,
а не объект списка, созданный посредством чистого питона.Поэтому я и создаю статически типизированный список List<T> с явным указанием
того, что я хочу туда запихивать категории.typed_list = List[BuiltInCategory](cat_list)
Теперь “Когда это делается?”.
Я делаю это тогда, когда типы, которые создаются в чистом питоне, не могут быть динамически
преобразованны в необходимый для метода тип, и, при этом, компилятор выдает ошибку.
В нашем случае будет написана, с первого взгляда, бредовая ошибка))
“Ожидал получить Список, а получил Список” – когда я первый раз получил такую ошибку, у меня жутко подгорело!
А надо читать так: Ожидал получить Список из дотНета, а получил питоновский Список.- Понял, что это частный случай строгой типизации в языке, в котором строгой типизации нет. А как можно было бы узнать, что метод ElementMulticategoryFilter использует именно типизириванный список данных?
Посмотрел Revit API https://www.revitapidocs.com/2018.1/8d2774eb-3c47-5c3d-2866-8d4ab7408d2d.htm вроде ничего не сказано. Видимо, я что-то не то смотрю.
2.Кстати, а разве может быть решение еще элегантней?
Если у Вас еще есть желание и время отвечать на вопросы.
1. В Апи не туда сморел.
Ты смотрел информацию о классе.
У класса есть т.н. конструктор, который создает объекты класса.
https://www.revitapidocs.com/2018.1/e43a304a-6931-7492-441c-3cac428f2431.htmВ нем нас интересует вот такой конструктор:
public ElementMulticategoryFilter(
ICollection<BuiltInCategory> categories
)Как видно, в него мы должны подать объект ICollection<BuiltInCategory>.
И-коллекция (Итерабельная коллекция).
A класс List<T> унаследован из ICollection, а значит, обладает точно такими же свойствами, как и Коллекция, только расширен и дополнен другими методами. Например, к списку можно обращаться по индексу, да и вообще с ним удобней работать.
Т.е. в этот метод можно подавать любой объект, унаследованный от ИКоллекции. Я подал Лист, а так, кому как нравится))2. Улучщить можно скорость выполнения скрипта, если вместо генератора в 40 строке воспользоваться parameterValueProvider – методом АПИ. Тогда вся фильтрация будет проходить только в фильтр-коллекторе, что существенно увеличит скорость выбора элементов. При наличии в проекте всего 100 труб скорость сильно не изменится((
https://oxozle.com/2015/04/01/kollekcii-v-net-ienumerable-iqueryable-icollection-ilist/
Спасибо
ВиталийУчастникРазобрался но есть вопросы по некоторым строчкам
18. systemName = “Подача жидкости 1” – Создаем переменную systemName и записываем в нее строку “Подача жидкости 1”
29. cat_list = [BuiltInCategory.OST_PipeCurves, BuiltInCategory.OST_PipeFitting] – Создаем переменную cat_list и присваиваем в ей категории через запятую первая категория трубы вторая фитинги
32. typed_list = List[BuiltInCategory](cat_list) – читал Ваш ответ выше из списка питон переводим в список .Net. Форма записи непонятна зачем слово или команда List (пытался прочитать как есть получается что в категорию BuiltInCategory прикрепить этот список [BuiltInCategory.OST_PipeCurves, BuiltInCategory.OST_PipeFitting]
35. filter = ElementMulticategoryFilter(typed_list) – читал в командах АПИ – Фильтр, используемый для поиска элементов, категория которых соответствует любому из данного набора категорий. В ответах выше этот фильтр использует список .Net поэтому нужна строка 32.
36. elements = FilteredElementCollector(doc).WherePasses(filter)\
.WhereElementIsNotElementType().ToElements() – вообще не понял что это40. z = [i for i in elements if
i.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM).AsString() == systemName] – В переменную z записываем только те значения которые = Подача жидкости 1Я попробавал сделал последную строку вот так тоже работает
z=[]
for i in elements:
if i.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM).AsString() == systemName:
z.Add(i)OUT = z
Из элементов из списка elements отфильтровываем по параметру (RBS_SYSTEM_NAME_PARAM),AsString() превращаем в строку, которая должно равняться переменной systemName в которую записана строка “Подача жидкости 1”. В итоге в пустой список z=[] попадают z.Add(i) те элементы для которых условие соблюдается
На выход OUT = z ставим переменную z и получаем список труб и фитингов содержащих переменную “Подача жидкости 1”
29. Это не переменная, а список
32. List это метод, даже скорее конструктор класса, а ни какая не комманда. Этот метод из пространства имен библиотеки Systems. Импорт этого пространства имен см. 14.
О самом классе можно почитать тутhttps://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netframework-4.8
36. По поводу коллектора фильтров нужно читать блог Тамика. И не один раз. Иногда даже придется спрашивать, как лучще создать коллектор для своего случая. Понимание приходит постепенно.
https://thebuildingcoder.typepad.com/blog/2015/12/quick-slow-and-linq-element-filtering.html
40. Это предмет для холиваров. Я предпочитаю использовать генераторы, а не циклы.
Метод list.Append() более ресурсоемкий. Цикл же считается более читабельным.36. elements = FilteredElementCollector(doc).WherePasses(filter)\
.WhereElementIsNotElementType().ToElements() – вообще не понял что этоЯ не знаю python, но чем смогу – помогу.
https://www.revitapidocs.com/2019/263cf06b-98be-6f91-c4da-fb47d01688f3.htm
elements = FilteredElementCollector(doc). – это выбор элементов с помощью коллектора (фильтрэлементколлектор) в текущем документе (doc). см. коструктор https://www.revitapidocs.com/2019/0635f1e4-652a-7e42-15af-94f24c4d8e8d.htm
.WherePasses(filter) -с помощью одного из методов фильтрэлементколлектора WherePasses(filter) (здесь filter был создан заранее, по двум категориям (29. cat_list = [BuiltInCategory.OST_PipeCurves, BuiltInCategory.OST_PipeFitting] – категория труб и категория соединительных деталей трубопроводов) именно из этих двух категорий и выбираются элементы https://www.revitapidocs.com/2019/42d4eef3-55a1-2739-0ef8-6bc1d9fc2755.htm
.WhereElementIsNotElementType() – могут выводиться в список выбранных элементов одновременно и экземляры размещенные в проектере и типоразмеры (в один список) поэтому тут выбрано, что выбираем не типоразмеры, а только элементы (экземпляры размещенные в проекте)
.ToElements() в виде списка элементов
Класс FilteredElementCollector содержит в себе
наследование
конструктор
методы
свойства.
Мы определились с помощью какого класса будем выбирать элементы. Затем в конструкторе выбрали метод выбора в текущем документе. Затем выбрали метод использующий фильтр WherePasses(filter), который позволяет сделать выборку по нескольким категориям, а дальше уже как было описано выше.В python, мне кажется, все красивей, чем в Dynamo, да и возможностей больше. Вот хочу пойти на курсы, должны скоро открыться.
- Понял, что это частный случай строгой типизации в языке, в котором строгой типизации нет. А как можно было бы узнать, что метод ElementMulticategoryFilter использует именно типизириванный список данных?
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.