Как изменить траекторию электрических цепей в dynamo?
Главная › Форумы › Задать вопрос › Как изменить траекторию электрических цепей в dynamo?
- В этой теме 16 ответов, 5 участников, последнее обновление 4 года назад сделано Репкин Артем.
-
АвторСообщения
-
Добрый день,
На просторах интернета нашел скрипт поиска кратчайшего пути между двумя устройствами по лоткам. Есть мысль с помощью dynamo сделать так, чтобы траектория эл.цепи автоматом прокладывалась по этому пути.
Есть такая штука как SetCircuitPath(). Насколько я понимаю, туда надо подать список точек, по которым этот path построится. Но т.к. в пайтоне я совсем не писатель (и даже с трудом читатель), то что с этим дальше делать не совсем представляю. Нужен хотя бы простейший пример кода: берем цепь, задаем произвольный список точек и получаем новый путь.
Не работал с электрикой. rvt файл с примером лотков, проводов и прочего электрического хозяйства приложите и картинку с результатом, который нужен
У меня не получается открыть dyn – пишет, битый файл.
Может проблема в dyf? Как его правильно установить?
Я почитал код – серьезная работа с графами, которую я в свое время не осилил.
Хотелось бы, чтоб заработало и у меня. Было бы интересно даже поблагодарить
автора за такой суровый труд.А вот задать новый путь электрической системе проще простого.
Надо получить список координат пути в виде XYZ (внимание, это не point!).
Потом у электрической системы есть метод
ElectricalSystem.SetCircuitPath(тут список из координат)
Метод действительно рабочий и вы копали в правильном направлении.К сожалению, без питона не обойтись. Прошу помощи запустить это скрипт – обязательно напишу рабочий пример.
Скрипт брал отсюда https://forum.dynamobim.com/t/shortest-route/16360/14
У меня он тоже с первого раза ругнулся, но потом запустился.
Сохранил dyf как dyn. Поможет? Сложил туда же:
https://cloud.mail.ru/public/LaHh/iNrw1ZC7F
У меня как раз и проблема, как список points превратить в эти самые XYZ.
Всё, разобрался. Вроде строит цепи по лоткам. Буду тестить.
Спасибо, заработало.
Столкнулся со следующими проблемами:
1. Каким образом будете выбирать электрическую систему и лотоки?
Я выбираю все лотки в проекте. И электрическую систему беру по элементу.
Вопрос выбора исходных данных существеннен. Хотелось бы, чтобы, нажав кнопку, все пересчитало само. Такого уровня автоматизации достичь возможно. Выбор электрической системы по элементу также не всегда корректен: возможны ситуации, когда у элемента несколько электрических систем – например, приточная установка с тэнами. Вентилятор одним кабелем, а тэны, независимо от вентилятора, другими кабелями2. Путь просчитывается не полностью. Путь по лотку считает волшебная “нода”. А вот спуск с лотка кто будет рассчитывать?
Я пока продолжаю работать. Но, вот черновик:
https://www.dropbox.com/s/7ffmekdzdpqi1m1/01_ShortestPath_SI.dyn?dl=0Текущая задача – решить проблему №2. Это по сути, не проблема, просто задача, требующая времени. Буду решать на досуге.
по второй задаче,как вариант построения линий от одного элемента до горизонтального лотка
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()По 1-й задаче: для оборудования слаботочки, например, я прописываю в параметре Type Comments тип системы (СКС, СКУД, СОТ и т.п.) и потом при необходимости фильтрую. Но там лотки общие. Вообще проблема может быть решена через разные рабочие наборы (Лотки.СС, Лотки.ЭМ).
По 2й задаче: мудрю всё в динамо. 1я-точка – Location панели, потом поднимаю до точки с z координатой уровня лотка, далее ищу перпендикуляр с ближайшим лотком и точку их пересечения. Дальше по точкам скрипта. Последние три точки до розетки как с панелью, только в обратном порядке.
Проблемы:
- Затык с перпендикуляром (либо кратчайшим расстоянием от точки до линии) – как-то криво я его строю, и не всегда корректно.
- Не всегда у нас кабель от оборудования сразу вверх идёт. Бывает, что по коробу горизонтально и потом уже вверх. Значит, надо тоже учитывать. Т.е. вводить еще и выборку по коробам (у меня это воздуховоды)?
P.S. Кстати, кабель ведь от лотка до точки опуска ведь не голый идёт – в гофре. Первоначально я хотел эту гофру отрисовывать и уже её использовать для построения полной траектории. Но захотелось всего и сразу – чтобы наоборот можно было эту гофру потом автоматом дорисовать.
Для разных электрических систем можно вот так сделать (с удобным выбором из выпадающего списка):
MaksimУчастникЗдравствуйте. Не получается открыть файлы Динамо из данной ветки “Ошибка чтения поврежденного файла”, в чем может быть причина? Моя версия 1.3.3.4111.
ИваСерж, у вас было подобное?!
И кстати, посмотрел на ютубе ваши ролики, спасибо за них.
Но хотел бы узнать, удалось ли, решить отображение схемы в пространстве “Чертежного вида” или “Легенды”?
MaksimУчастникSche, к чему я спрашивал, мне интересно было бы структурку слаботочки получать, вы это уже решили?
Подскажите куда копать, допустим на примере ПРВ (ТАМУ-распред_коробка-розетка-(2-ая розетка тоже от коробки))?
То есть, я с уровня/уровней собираю типы по параметру (допустим “ПРВ”) и по вашему алгоритму они постятся в Чертежном виде?
По структурке “не всё так однозначно”)).
Например, для СКС у меня отдельно семейства для чертежного вида. Из модели я беру цепи и соответственно для каждой цепи точки размещения розетки и панели. Так же из модели подхватываю номера оборудования и место размещения. Затем на чертежном виде размещаю аннотативные семейства и вношу в них данные оборудования. Получается вот так:
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.