[MEP] Create pipe with line - Python Script

Dear,

I’m trying to create a pipe from a definied line. I’m trying to get it using the MEPover Node called Pipe.ByLines but I always get “null” result. Find Image below.

I’m trying to findout the problem on the Python code, but I couldn’t find any trouble.

clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference(“RevitAPI”)
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

if isinstance(IN[0], list):
lines = IN[0]
else:
lines = [IN[0]]
FirstPoint = [x.StartPoint for x in lines]
SecondPoint = [x.EndPoint for x in lines]
if isinstance(IN[1], list):
pipetype = UnwrapElement(IN[1])
else:
pipetype = [UnwrapElement(IN[1])]
ptl = len(pipetype)

if isinstance(IN[2], list):
systemtype = UnwrapElement(IN[2])
else:
systemtype = [UnwrapElement(IN[2])]
stl = len(systemtype)
if isinstance(IN[3], list):
level = UnwrapElement(IN[3])
else:
level = [UnwrapElement(IN[3])]
ll = len(level)
if isinstance(IN[4], list):
diameter = IN[4]
else:
diameter = [IN[4]]
dl = len(diameter)

elements =

TransactionManager.Instance.EnsureInTransaction(doc)
for i,x in enumerate(FirstPoint):
try:
levelid = level[i%ll].Id
systypeid = systemtype[i%stl].Id
pipetypeid = pipetype[i%ptl].Id
diam = diameter[i%dl]

pipe = Autodesk.Revit.DB.Plumbing.Pipe.Create(doc,systypeid,pipetypeid,levelid,x.ToXyz(),SecondPoint[i].ToXyz())

param = pipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
param.SetValueString(diam.ToString())

elements.append(pipe.ToDSType(False))
except:
elements.append(None)

TransactionManager.Instance.TransactionTaskDone()

OUT = elements

May someone help me?

Thanks in advance

You should only use the ‘Element.Name’ node to help you choose the correct pipe (system) type. The node expects a pipe (system) type and not a string (the Element.Name node returns a string).

1 Like

Thanks @T_Pover already works, but only on Revit 18.x

If I try to run the routine on Revit 19.x it gets completely freeze. I guess It’s a Python Code problema.

import clr

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

if isinstance(IN[0], list):
lines = IN[0]
else:
lines = [IN[0]]
FirstPoint = [x.StartPoint for x in lines]
SecondPoint = [x.EndPoint for x in lines]
if isinstance(IN[1], list):
pipetype = UnwrapElement(IN[1])
else:
pipetype = [UnwrapElement(IN[1])]
ptl = len(pipetype)

if isinstance(IN[2], list):
systemtype = UnwrapElement(IN[2])
else:
systemtype = [UnwrapElement(IN[2])]
stl = len(systemtype)
if isinstance(IN[3], list):
level = UnwrapElement(IN[3])
else:
level = [UnwrapElement(IN[3])]
ll = len(level)
if isinstance(IN[4], list):
diameter = IN[4]
else:
diameter = [IN[4]]
dl = len(diameter)

elements = []

TransactionManager.Instance.EnsureInTransaction(doc)
for i,x in enumerate(FirstPoint):
try:
levelid = level[i%ll].Id
systypeid = systemtype[i%stl].Id
pipetypeid = pipetype[i%ptl].Id
diam = diameter[i%dl]

pipe = Autodesk.Revit.DB.Plumbing.Pipe.Create(doc,systypeid,pipetypeid,levelid,x.ToXyz(),SecondPoint[i].ToXyz())

param = pipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
param.SetValueString(diam.ToString())

elements.append(pipe.ToDSType(False))
except:
elements.append(None)

TransactionManager.Instance.TransactionTaskDone()

OUT = elements

I Have to check it out again.

1 Like

Try this code adds pipes and sets diameter

import clr

import sys
sys.path.append(‘C:\Program Files (x86)\IronPython 2.7\Lib’)

import System
from System import Array
from System.Collections.Generic import *

clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *

clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference(“RevitAPI”)
clr.AddReference(“RevitAPIUI”)

import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *

Current doc/app/ui

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc = uiapp.ActiveUIDocument

Define list/unwrap list functions

def tolist(input):
result = input if isinstance(input, list) else [input]
return result

def uwlist(input):
result = input if isinstance(input, list) else [input]
return UnwrapElement(result)

Preparing input from dynamo to revit

pipeTypes = uwlist(IN[0])
PipingSystemTypes = uwlist(IN[1])
levels = uwlist(IN[2])
stPoints = uwlist(IN[3])
enPoints = uwlist(IN[4])
ppDia = IN[5]

#element = tolist(IN[1])
#element = tolist(IN[2])

output list

newPipe=
pipeElements=

#Start Transaction
TransactionManager.Instance.EnsureInTransaction(doc)

your actions

for i in range(len(stPoints)):
pSysTypId = PipingSystemTypes[0].Id
pTypId = pipeTypes[0].Id
lvlId = levels[0].Id
st = stPoints[i].ToXyz()
end = enPoints[i].ToXyz()

NewPipe = Autodesk.Revit.DB.Plumbing.Pipe.Create(doc, pSysTypId, pTypId, lvlId, st, end)
param = NewPipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
param.SetValueString(ppDia.ToString())
pipeElements.append(NewPipe.ToDSType(False))

#End Transaction
TransactionManager.Instance.TransactionTaskDone()

Preparing output to Dynamo

OUT = pipeElements