Invalid Duct/Pipe Connections

I altered the code of another existing node a bit (Elbow.ByMEPCurves) which will take in a bunch of ducts or fittings and searches the closest connector for every connector from the list and then connects them.
I take it that you first undo the demolish action to allow the reconnection of the network? I guess Dynamo could handle this for you as well…

Anyway, here’s the code:

import clr

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

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

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


pipes = UnwrapElement(IN[0])
margin = 0

connectors = {}
connlist = []

for pipe in pipes:
	try:
		conns = pipe.ConnectorManager.Connectors
	except:
		conns = pipe.MEPModel.ConnectorManager.Connectors
	for conn in conns:
		if conn.IsConnected:
			continue
		connectors[conn] = None
		connlist.append(conn)

for k in connectors.keys():
	mindist = 1000000
	closest = None
	for conn in connlist:
		if conn.Owner.Id.Equals(k.Owner.Id):
			continue
		dist = k.Origin.DistanceTo(conn.Origin)
		if dist < mindist:
			mindist = dist
			closest = conn
	if mindist > margin:
		continue
	connectors[k] = closest
	connlist.remove(closest)
	try:
		del connectors[closest]
	except:
		pass


for k,v in connectors.items():
	TransactionManager.Instance.EnsureInTransaction(doc)		
	try:
		k.ConnectTo(v)
	except:
		pass
	TransactionManager.Instance.TransactionTaskDone()

OUT = "Done"

5 Likes