Соединить трубы
Главная › Форумы › Задать вопрос › Соединить трубы
- В этой теме 11 ответов, 3 участника, последнее обновление 7 лет, 3 месяца назад сделано txt.
-
АвторСообщения
-
Возможно кто-то решил задачу: как соединить два коннектора между собой в Динамо? То есть коннектор может принадлежать трубе, арматуре, оборудованию. Это дало бы возможность присоединить трубу к оборудованию, арматуре (я так думаю) и трубы между собой. Например для двух коннекторов труб:
Писал для Ревита 15. В 17 не тестил
В 17 Ревите нет метода NewPipeCreate.
Надо использовать другой метод. Почитал в хелпе
http://www.revitapidocs.com/2017/04817280-4044-112c-d229-59e8a50b1c95.htmОбщий принцип – самый большой участок кода – рассчет точек, по которым будут строиться новые элементы. Посоздавать по этим точкам трубы и фитинги – дело методов и, как по мне, не является интересным. Дак вот: сначала рассчитываем точки “маршрута”, потом записываем этот маршрут в лист и запихиваем их в нод, который перечисляя эти точки в цикле строит трубы. После создания труб берем с них коннекторы и соединяем между собой фитингами.
Пока что на таком шаге (для двух выделенных труб, расположенных на одной оси с разрывом – как на картинке в первом сообщении (дальние концы заглушены)
код питона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.CurrentDBDocumentin0=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))Сам метод находится по ссылке:
http://www.revitapidocs.com/2017/705a520c-2546-322a-1b35-b3df66960674.htmПохоже, что когда мы определяем два коннектора Connector_1, Connector_2 в пределах одного питон кода, то они определяются как ConnectorSet (это можно проверить нодом Object.Type)(если в питоне определить только один какой-нибудь коннектор, пусть Connector_1, то на выходе будем иметь Connector). Однако , если мы определяем коннекторы за пределами питон кода (причем для каждого свой нод с питон кодом), а затем отдельно подаем на входы IN[2], IN[3] – то новая труба будет создана между двумя коннекторами существующих труб (я ожидал вообще другого – что коннекторы соединяться и две трубы преобразуются в одну новую, но видимо метод работает другим способом – создает трубу между коннекторами без соединения с ними и с нулевым зазором…).
Как заставить питон определять в одном питон коде два коннектора Connector_1, Connector_2 как отдельные Connector– ы – остается загадкойHi Txt,
Here is how you get connectors.
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Надеюсь понятно написал на ломаном английском)
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)Никак. Коннекторы попадают в перечень рандомно.Только вычислять расстояния между точками вставки. Почему не изучите мой скрипт? Работает неплохо. Там все эти вопросы решены. Есть догадка – что конекторы [0] и [1] – всегда начало и конец трубы. Остальные коннекторы – врезки.
Вариант: создать 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Далее код выше нужно будет доработать чтобы работал со списком труб. А пока…
Труба создана, теперь надо как то соединить между собой коннектора, находящиеся в одной точке (получить 1 трубу из 2)… -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.