Как изменить траекторию электрических цепей в dynamo?

Главная Форумы Задать вопрос Как изменить траекторию электрических цепей в dynamo?

В этой теме 10 ответов, 3 участника, последнее обновление  Sche 3 нед., 6 дн. назад.

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Сообщения
  • #8499 Score: 0

    Sche
    Участник

    Добрый день,

    На просторах интернета нашел скрипт поиска кратчайшего пути между двумя устройствами по лоткам. Есть мысль с помощью dynamo сделать так, чтобы траектория эл.цепи автоматом прокладывалась по этому пути.

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

     

    #8509 Score: 0

    txt
    Модератор
    93 pts

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

    #8511 Score: 0

    Sche
    Участник

    Картинки, файл rvt и скрипт по поиску кратчайшего пути:

    https://cloud.mail.ru/public/LaHh/iNrw1ZC7F

     

    #8515 Score: 0

    ИваСерж
    Модератор
    96 pts

    У меня не получается открыть dyn – пишет, битый файл.
    Может проблема в dyf? Как его правильно установить?
    Я почитал код – серьезная работа с графами, которую я в свое время не осилил.
    Хотелось бы, чтоб заработало и у меня. Было бы интересно даже поблагодарить
    автора за такой суровый труд.

    А вот задать новый путь электрической системе проще простого.
    Надо получить список координат пути в виде XYZ (внимание, это не point!).
    Потом у электрической системы есть метод
    ElectricalSystem.SetCircuitPath(тут список из координат)
    Метод действительно рабочий и вы копали в правильном направлении.

    К сожалению, без питона не обойтись. Прошу помощи запустить это скрипт – обязательно напишу рабочий пример.

    #8516 Score: 0

    Sche
    Участник

    Скрипт брал отсюда https://forum.dynamobim.com/t/shortest-route/16360/14

    У меня он тоже с первого раза ругнулся, но потом запустился.

    Сохранил dyf как dyn. Поможет? Сложил туда же:

    https://cloud.mail.ru/public/LaHh/iNrw1ZC7F

    У меня как раз и проблема, как список points превратить в эти самые XYZ.

    #8518 Score: 0

    Sche
    Участник

    Всё, разобрался. Вроде строит цепи по лоткам. Буду тестить.

     

    #8519 Score: 0

    ИваСерж
    Модератор
    96 pts

    Спасибо, заработало.
    Столкнулся со следующими проблемами:
    1. Каким образом будете выбирать электрическую систему и лотоки?
    Я выбираю все лотки в проекте. И электрическую систему беру по элементу.
    Вопрос выбора исходных данных существеннен. Хотелось бы, чтобы, нажав кнопку, все пересчитало само. Такого уровня автоматизации достичь возможно. Выбор электрической системы по элементу также не всегда корректен: возможны ситуации, когда у элемента несколько электрических систем – например, приточная установка с тэнами. Вентилятор одним кабелем, а тэны, независимо от вентилятора, другими кабелями

    2. Путь просчитывается не полностью. Путь по лотку считает волшебная “нода”. А вот спуск с лотка кто будет рассчитывать?

    Я пока продолжаю работать. Но, вот черновик:
    https://www.dropbox.com/s/7ffmekdzdpqi1m1/01_ShortestPath_SI.dyn?dl=0

    Текущая задача – решить проблему №2. Это по сути, не проблема, просто задача, требующая времени. Буду решать на досуге.

    #8523 Score: 0

    txt
    Модератор
    93 pts

    по второй задаче,как вариант построения линий от одного элемента до горизонтального лотка
    import clr
    #грузим нужные библиотеки в том числе:
    from Autodesk.Revit.DB import SetComparisonResult, IntersectionResultArray
    CableTray=FilteredElementCollector(doc, doc.ActiveView.Id).OfCategory(BuiltInCategory.OST_CableTray).ToElements();
    #элемент
    el_pt = IN[0].Location
    cur_cable= [ x for x in CableTray if x.Location.Curve.Distance(XYZ(el_pt.X, el_pt.Y,el_pt.Z )/304.8) == min( [i.Location.Curve.Distance(XYZ(el_pt.X, el_pt.Y,el_pt.Z )/304.8) for i in CableTray]) ][0]
    dist=cur_cable.Location.Curve.Distance(XYZ(el_pt.X/304.8, el_pt.Y/304.8, cur_cable.Location.Curve.GetEndPoint(0).Z))
    curve_1 = Line.CreateBound(XYZ(el_pt.X, el_pt.Y, el_pt.Z)/304.8, XYZ(el_pt.X/304.8, el_pt.Y/304.8, cur_cable.Location.Curve.GetEndPoint(0).Z))
    pt_1 = XYZ(el_pt.X/304.8, el_pt.Y/304.8, cur_cable.Location.Curve.GetEndPoint(0).Z)
    plane_pt = Plane.CreateByOriginAndBasis(pt_1, XYZ.BasisX, XYZ.BasisY)
    result = clr.Reference[IntersectionResultArray]()
    ints = Arc.Create(plane_pt, dist , 0, 360).Intersect(cur_cable.Location.Curve, result)
    if ints == ints.Overlap:
    ints_pt= result.Item[0].XYZPoint
    curve_2 = Line.CreateBound(XYZ(pt_1.X, pt_1.Y, pt_1.Z), XYZ(ints_pt.X, ints_pt.Y, ints_pt.Z))
    OUT= el_pt, Point.Create(ints_pt).ToProtoType() , Point.Create(pt_1).ToProtoType(), cur_cable.Location.Curve.ToProtoType() , curve_2.ToProtoType() , curve_1.ToProtoType()

    #8524 Score: 0

    txt
    Модератор
    93 pts

    Красным выделен результат кода выше (остальное – работа нода автора поста)

    #8525 Score: 0

    Sche
    Участник

    По 1-й задаче: для оборудования слаботочки, например, я прописываю в параметре Type Comments тип системы (СКС, СКУД, СОТ и т.п.) и потом при необходимости фильтрую. Но там лотки общие. Вообще проблема может быть решена через разные рабочие наборы (Лотки.СС, Лотки.ЭМ).

    По 2й задаче: мудрю всё в динамо. 1я-точка – Location панели, потом поднимаю до точки с z координатой уровня лотка, далее ищу перпендикуляр с ближайшим лотком и точку их пересечения. Дальше по точкам скрипта. Последние три точки до розетки как с панелью, только в обратном порядке.

    Проблемы:

    1. Затык с перпендикуляром (либо кратчайшим расстоянием от точки до линии) – как-то криво я его строю, и не всегда корректно.
    2. Не всегда у нас кабель от оборудования сразу вверх идёт. Бывает, что по коробу горизонтально и потом уже вверх. Значит, надо тоже учитывать. Т.е. вводить еще и выборку по коробам (у меня это воздуховоды)?

    P.S. Кстати, кабель ведь от лотка до точки опуска ведь не голый идёт – в гофре. Первоначально я хотел эту гофру отрисовывать и уже её использовать для построения полной траектории. Но захотелось всего и сразу – чтобы наоборот можно было эту гофру потом автоматом дорисовать.

    #8526 Score: 0

    Sche
    Участник

    Для разных электрических систем можно вот так сделать (с удобным выбором из выпадающего списка):

    https://www.dropbox.com/s/p4l42ofd2b1kpyc/%D0%92%D1%8B%D0%B1%D0%BE%D1%80%20%D1%8D%D0%BB.%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B.dyn?dl=0

     

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)

Для ответа в этой теме необходимо авторизоваться.