Place Fabrication hanger by points in Dynamo

Hello @arukaroor and welcome
Please read the forum rules if you haven’t.

I’m not sure if there are custom nodes can do this, I know you are a beginner but you can do it with Python if you have some programming knowledge.
unfortunately the Fabrication Part is not the easiest part of the Revit API

here an example
hangers3

Python code

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


fabPart = UnwrapElement(IN[0])
lstPoints = IN[1]
famName = IN[2]
outHanger = []
error = []
fabConf = FilteredElementCollector(doc).OfClass(FabricationConfiguration).FirstElement()
lstServ = fabConf.GetAllLoadedServices()
button  = getServiceButton(lstServ, famName)
if button is not None:
	TransactionManager.Instance.EnsureInTransaction(doc)
	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

the api doc

3 Likes