Соединить трубы

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

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Автор
    Сообщения
  • #5847 Score: 0
    txt
    Модератор
    86 pts

    Возможно кто-то решил задачу: как соединить два коннектора  между собой в Динамо? То есть коннектор может принадлежать трубе, арматуре, оборудованию. Это дало бы возможность присоединить трубу к оборудованию, арматуре (я так думаю)  и трубы между собой.  Например для двух коннекторов труб:

     

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

    Писал для Ревита 15. В 17 не тестил

    https://www.dropbox.com/s/tr3m0u6fkzmenhy/2016.08.05%20%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D1%80%D1%83%D0%B1%D1%8B.rar?dl=0

    В 17 Ревите нет метода NewPipeCreate.
    Надо использовать другой метод. Почитал в хелпе
    http://www.revitapidocs.com/2017/04817280-4044-112c-d229-59e8a50b1c95.htm

    Общий принцип – самый большой участок кода – рассчет точек, по которым будут строиться новые элементы. Посоздавать по этим точкам трубы и фитинги – дело методов и, как по мне, не является интересным. Дак вот: сначала рассчитываем точки “маршрута”, потом записываем этот маршрут в лист и запихиваем их в нод, который перечисляя эти точки в цикле строит трубы. После создания труб берем с них коннекторы и соединяем между собой фитингами.

    #6547 Score: 0
    txt
    Модератор
    86 pts

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

    import clr
    clr.AddReference('RevitAPI')
    from Autodesk.Revit.DB import *
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    #clr.AddReference("RevitAPI")
    #from Autodesk.Revit.DB import *
    clr.AddReference("RevitNodes")
    import Revit
    clr.ImportExtensions(Revit.GeometryConversion)
    clr.AddReference("RevitServices")
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager
    doc = DocumentManager.Instance.CurrentDBDocument

    in0=IN[0]
    in1=IN[1]
    def UE(x):
    return UnwrapElement(x)
    systemType_Id = UE(in0).get_Parameter(BuiltInParameter.RBS_PIPING_SYSTEM_TYPE_PARAM).AsElementId()
    pipeType_Id=UE(in0).get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsElementId() #AsValueString()
    level_Id=UE(in0).get_Parameter(BuiltInParameter.RBS_START_LEVEL_PARAM).AsElementId()
    Connector_1=UE(in0).ConnectorManager.UnusedConnectors #первая труба -заглушена с одного конца, получаем не заглушенный конец
    Connector_2=UE(in1).ConnectorManager.UnusedConnectors # вторая труба - аналогично
    TransactionManager.Instance.EnsureInTransaction(doc)
    pipe=Plumbing.Pipe.Create(doc, pipeType_Id, level_Id, Connector_1, Connector_2)
    TransactionManager.Instance.TransactionTaskDone()
    OUT =pipe

    Ошибка:

    спотыкается на строке:

    pipe=Plumbing.Pipe.Create(doc, pipeType_Id, level_Id, Connector_1, Connector_2)
    (пишет что ожидает Connector , а подано ConnecorSet (хотя если вывести на OUT=Connector_1, то на выходе будет Autodesk.Revit.DB.Connector))

    #6548 Score: 0
    txt
    Модератор
    86 pts

    Сам метод находится по ссылке:
    http://www.revitapidocs.com/2017/705a520c-2546-322a-1b35-b3df66960674.htm

    #6549 Score: 0
    txt
    Модератор
    86 pts

    Похоже, что когда мы определяем два коннектора Connector_1, Connector_2 в пределах одного питон кода, то они определяются как ConnectorSet (это можно проверить нодом Object.Type)(если в питоне определить только один какой-нибудь коннектор, пусть Connector_1, то на выходе будем иметь Connector). Однако , если мы определяем коннекторы за пределами питон кода (причем для каждого свой нод с питон кодом), а затем отдельно подаем на входы IN[2], IN[3] – то новая труба будет создана между двумя коннекторами существующих труб (я ожидал вообще другого – что коннекторы соединяться и две трубы преобразуются в одну новую, но видимо метод работает другим способом – создает трубу между коннекторами без соединения с ними и с нулевым зазором…).
    Как заставить питон определять в одном питон коде два коннектора Connector_1, Connector_2 как отдельные Connector– ы – остается загадкой

    #6550 Score: 0
    kulkul
    Участник
    47 pts

    Hi Txt,

    Here is how you get connectors.

    #6551 Score: 0
    txt
    Модератор
    86 pts

    Thank you kulkul ,
    Im know about it and want to see what inside this node (python code) because im want to create the new pipe between 2 connectors in one python code

    Надеюсь понятно написал на ломаном английском)

    #6555 Score: 0
    txt
    Модератор
    86 pts

    1.) Как получить коннектор из набора (ConnectorSet)
    Для того чтобы вытаскивать коннекторы из набора нужно вначале поместить их в список:
    connectors=[]
    a=UnwrapElement(IN[0]).ConnectorManager.Connectors # в IN[0] у нас труба
    for i in a:
    connectors.append(i)

    На выходе получаем набор коннекторов (ConnectorSet) – у трубы их 2 шт.
    Чтобы получить определенный коннектор нужно указать индекс этого коннектора в наборе :
    OUT=connectors[0] #или connectors[1]
    ________________________________________________________________________________
    Если получаем неиспользуемые коннекторы (в трубе у которой один конец либо заглушен, либо присоединен к фитингу):
    connectors=[]
    a=UnwrapElement(IN[0]).ConnectorManager.UnusedConnectors
    for i in a:
    connectors.append(i)

    То на выходе мы получим 1 коннектор , однако он все равно будет считаться набором , а не коннектором, поэтому для того, чтобы его получить пишем также:
    OUT=connectors[0]
    _______________________________________________________________________________
    Аналогично можно получить коннектор из набора , указав его индекс в Lookup(индекс):
    connector_1=UnwrapElement(IN[0]).ConnectorManager.Lookup(0)
    connector_2=UnwrapElement(IN[0]).ConnectorManager.Lookup(1)

    2.) Как получить координаты коннектора:
    connector_1.Origin – получаем числовые координаты коннектора
    connector_1.Origin.ToPoint() – получаем точку с координатами
    3.) Id коннектора
    Connector.Id (Ну это не обычный уникальный Id элемента. Для каждой трубы он будет равняться 0 либо 1)

    #6556 Score: 1
    txt
    Модератор
    86 pts

    Вопрос : как эти коннектора различать между собой ? идентифицировать ? например если нужно замерить расстояние между определенными коннекторами…

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

    Никак. Коннекторы попадают в перечень рандомно.Только вычислять расстояния между точками вставки. Почему не изучите мой скрипт? Работает неплохо. Там все эти вопросы решены. Есть догадка – что конекторы [0] и [1] – всегда начало и конец трубы. Остальные коннекторы – врезки.

    #6574 Score: 0
    txt
    Модератор
    86 pts

    Вариант: создать 1 трубу между ближайшими коннекторами 2 труб

    in0=IN[0]
    in1=IN[1]
    def UE(x):
    return UnwrapElement(x)
    systemType_Id = UE(in0).get_Parameter(BuiltInParameter.RBS_PIPING_SYSTEM_TYPE_PARAM).AsElementId()
    pipeType_Id=UE(in0).get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsElementId()
    level_Id=UE(in0).get_Parameter(BuiltInParameter.RBS_START_LEVEL_PARAM).AsElementId()
    con_m_0=[i for i in UE(in0).ConnectorManager.Connectors] #получаем набор коннекторов
    con_m_1=[i for i in UE(in1).ConnectorManager.Connectors] #получаем набор коннекторов
    dist_els= [[(i.Origin).DistanceTo(j.Origin), i, j] for i in con_m_0 for j in con_m_1] #получаем в каждом подсписке расстояние между элементами (коннекторами) и сами элементы одновременно
    dist_min=[min(map(lambda x: x[0], dist_els))] #получаем только расстояния
    cons_near=[i[1:] for i in dist_els for j in dist_min if i[0]==j] #получаем элементы в подсписках (без расстояний) для которых расстояние минимально, т.е. ближайшие элементы
    TransactionManager.Instance.EnsureInTransaction(doc)
    pipe=Plumbing.Pipe.Create(doc, pipeType_Id, level_Id , cons_near[0][0], cons_near[0][1]) #строим трубу между ближайшими элементами
    TransactionManager.Instance.TransactionTaskDone()
    OUT =pipe

    #6575 Score: 0
    txt
    Модератор
    86 pts

    Далее код выше нужно будет доработать чтобы работал со списком труб. А пока…
    Труба создана, теперь надо как то соединить между собой коннектора, находящиеся в одной точке (получить 1 трубу из 2)…

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