Here is a variant for multi conduit, nevertheless you will have to determine the points per conduits (list with sub list of points)
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Fabrication import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
def getConnectors(elem):
lstCon = []
conectors = elem.ConnectorManager.Connectors
lstCon = [con for con in conectors]
return lstCon[0], lstCon[1]
def getServiceButton(lstServiceFab, famName):
for servicFab in lstServiceFab:
countGroup = servicFab.GroupCount
for x in range(countGroup):
countButton = servicFab.GetButtonCount(x)
for y in range(countButton):
fabServiceButton = servicFab.GetButton(x,y)
if fabServiceButton.Name == famName:
return fabServiceButton
toList = lambda x : x if hasattr(x, '__iter__') else [x]
lst_fabPart = toList(UnwrapElement(IN[0]))
group_lst_Points = IN[1]
famName = IN[2]
outHanger = []
error = []
fabConf = FilteredElementCollector(doc).OfClass(FabricationConfiguration).FirstElement()
lstServ = fabConf.GetAllLoadedServices() #GetAllServices()
button = getServiceButton(lstServ, famName)
if button is not None:
TransactionManager.Instance.EnsureInTransaction(doc)
for lstPoints, fabPart in zip(group_lst_Points, lst_fabPart):
for pts in lstPoints:
#convert dynamoPt to RevitPt
rvtPt = pts.ToXyz()
curveFabPart = fabPart.Location.Curve
conectA, conectB = getConnectors(fabPart)
interResult = curveFabPart.Project(rvtPt)
if interResult.Distance < 0.05 :
distaceA = rvtPt.DistanceTo(conectA.Origin)
distaceB = rvtPt.DistanceTo(conectB.Origin)
try:
newhanger = FabricationPart.CreateHanger(doc, button, fabPart.Id, conectA, distaceA, True)
outHanger.append(newhanger)
except:
try:
newhanger = FabricationPart.CreateHanger(doc, button, fabPart.Id, conectB, distaceB, True)
outHanger.append(newhanger)
except Exception as ex:
error.append([ex, distaceA, distaceB])
TransactionManager.Instance.TransactionTaskDone()
else:
error = "ERROR, No hanger has been loaded with this name : '{}'".format(famName)
OUT = fabConf, button, outHanger, error