Place Fabrication hanger by points in Dynamo

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
2 Likes