Балансировка трубопроводов в системе отопления

Главная Форумы Задать вопрос Балансировка трубопроводов в системе отопления

Просмотр 15 сообщений - с 1 по 15 (из 21 всего)
  • Автор
    Сообщения
  • #9570 Score: 0
    Виталий
    Участник

    Описание проблемы:

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

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

    Проектируя систему отопления для маленького дома и имея от 10 до 20 приборов у меня будет 10-20 ветвей это не займет много времени выбирая элементы каждой ветви вручную и скрипт найдет суммарное гидравлическое сопротивление, далее настройка клапана и так далее.

    Но есть и многоэтажные дома где таких ветвей будет сотни. Вручную выбирать каждую не актуально.

    Сам вопрос:

    (пользоваться Dynamo только начал многое не знаю)

    Кто может подсказать каким путем, командами в Dynamo или с помощью Python Script что бы скрипт выбирал все элементы (трубы отводы тройники и т д) принадлежащие одной ветви в автоматической режиме. То-есть все элементы от начала системы отопления пройдя через один прибор отопления и до конца системы отопления.

    #9572 Score: 0
    ИваСерж
    Хранитель
    134 pts

    А есть желание разобраться не в Динамо, а в АПИ?
    Собрать все элементы одной системе просто.
    Для начала программирования под Ревит нужно установить полезнейший плагин RevitLookup.
    C помощью Лукап посмотреть элемент, понять как работает “объект”, пораскрывать зависимости объекта…
    Пожалуйста, выложите куда-нибудь ваш пример проекта, поставте Лукап. Дальше помогу, если вопросы будут правильные.

    #9577 Score: 0
    Виталий
    Участник

    Спасибо за ответ!!!!

    Да есть желание разобраться в АПИ. Уже который день смотрю видео ничего не понятно откуда берутся эти команды типа PG_IDENTITY_DATA. Установил плагин RevitLookup я так понял с его помощью можно просмотреть все доступные свойства элемента и скопировать команды под АПИ.

    вот ссылки на простенький файл примера https://yadi.sk/d/cIrwcZQmEL-0ig

    вторая ссылка на программу в динамо  https://yadi.sk/d/TMP0HGnnnp_7BA

     

    #9578 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Ну вот как пример.
    Решения могут быть более элегантными.
    Разберись хотябы с кодом, который я написал, потом будешь его дорабатывать со временем.

    https://pastebin.com/fqzcgcpj

    #9581 Score: 1
    Андрей
    Участник
    2 pts

    Плохо понимаю в проектировании сетей в Ревите, но для Dynamo, необходимо, чтобы был параметр с одинаковым названием. Например, все элементы, принадлежащие одной ветке, должны иметь одинаковые значения одного и того же параметра, например “ветка 1”. Тогда Вы легко их отберете по этому признаку. Таким образом, все элементы Вашей системы должны иметь один и тот же параметр, который будет признаком для выбора в Dynamo.

    Вообще, по Вашей специальности есть хорошие курсы https://stepik.org/course/51850/promo. Проходил другие курсы этих авторов, помогает хорошо, даже очень

    #9586 Score: 0
    Виталий
    Участник

    Ваш код скачал. Но придется долго разбираться пока много что не понятно.

    Например  import clr – импортируем библиотеку clr в пайтон

    ОUT = dir(clr) – и в этой библиотеке еще 42 под элемента такие как  AddReference и т д – Попробую найти что это

    Как немного разберусь напишу, а то дальше мне смыла куда – то двигаться нет

     

     

    #9587 Score: 0
    ИваСерж
    Хранитель
    134 pts

    Не надо тебе понимать для скриптов что такое цлр.
    Зри в корень, а ты сразу по мелочам.
    Я не комментировал ветку импортов с 1 по 14 строчки.
    Это почти стандартные импорты, которые должны быть в каждом коде.

    Для себя надо понимать, что цлр нужен только для того, чтоб
    можно было подключать внешние библиотеки.
    Мы используем только один метод clr.AddReference.
    Все остальное без надобности.

    Ещё вопросы?

    #9588 Score: 0
    Андрей
    Участник
    2 pts

    *****Ещё вопросы?***** Подскажите, пожалуйста, а для чего мы

    #Переводим список из языка Питон в список  .Net

    typed_list = List[BuiltInCategory](cat_list)

    В чем суть? (я понимаю, что мы это делаем для работы фильтра, но не понимаю сути – в каких случаях это делается и для чего)

    #9589 Score: 1
    ИваСерж
    Хранитель
    134 pts

    Вопрос мне очень понравился. Уже ближе к сути.
    Есть понимание чем чистый 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)

    Теперь “Когда это делается?”.
    Я делаю это тогда, когда типы, которые создаются в чистом питоне, не могут быть динамически
    преобразованны в необходимый для метода тип, и, при этом, компилятор выдает ошибку.
    В нашем случае будет написана, с первого взгляда, бредовая ошибка))
    “Ожидал получить Список, а получил Список” – когда я первый раз получил такую ошибку, у меня жутко подгорело!
    А надо читать так: Ожидал получить Список из дотНета, а получил питоновский Список.

    #9592 Score: 0
    Андрей
    Участник
    2 pts
    1. Понял, что это частный случай строгой типизации в языке, в котором строгой типизации нет. А как можно было бы узнать, что метод ElementMulticategoryFilter использует именно типизириванный список данных?
      Посмотрел Revit API  https://www.revitapidocs.com/2018.1/8d2774eb-3c47-5c3d-2866-8d4ab7408d2d.htm   вроде ничего не сказано. Видимо, я что-то не то смотрю.

    2.Кстати, а разве может быть решение еще элегантней?

    Если у Вас еще есть желание и время отвечать на вопросы.

    #9593 Score: 0
    ИваСерж
    Хранитель
    134 pts

    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/

    #9594 Score: 0
    Андрей
    Участник
    2 pts

    Спасибо

    #9597 Score: 0
    Виталий
    Участник

    Разобрался но есть вопросы по некоторым строчкам

    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”

     

    #9598 Score: 0
    ИваСерж
    Хранитель
    134 pts

    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() более ресурсоемкий. Цикл же считается более читабельным.

    #9600 Score: 0
    Андрей
    Участник
    2 pts

    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, да и возможностей больше. Вот хочу пойти на курсы, должны скоро открыться.

Просмотр 15 сообщений - с 1 по 15 (из 21 всего)
  • Для ответа в этой теме необходимо авторизоваться.