Paint all conduit's faces at once

Hello @tiagob_etc
try this (just for Conduits, conduits must connected)

import clr
import sys
import System
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Electrical import Conduit

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

def getAllConnect(conduit):
	lstIds = [conduit.Id]
	lstconduit = [conduit]
	def findNext(lstconduitCheck):
		lstElemId = []
		for conduitCheck in lstconduitCheck:
			if hasattr(conduitCheck, 'ConnectorManager'):
				conManag = conduitCheck.ConnectorManager
			else:
				conManag = conduitCheck.MEPModel.ConnectorManager			
			for con in conManag.Connectors :
				for conRef in con.AllRefs:
					if conRef.Owner.Id not in lstIds:
						lstElemId.append(conRef.Owner.Id)
		return lstElemId
	flag = True
	while flag:
		newConnIds = findNext(lstconduit)
		if len(newConnIds) > 0:
			newConnElem = [doc.GetElement(x) for x in 	newConnIds]	
			lstconduit.extend(newConnElem)
			lstIds.extend(newConnIds)
		else:
			flag = False
			break
	return 	lstconduit	
	
conduit = UnwrapElement(IN[0])
material = UnwrapElement(IN[1])
opt = Options()
TransactionManager.Instance.EnsureInTransaction(doc)
for conduitToPaint in getAllConnect(conduit) :
	if isinstance(conduitToPaint, Conduit):
		instGeo = conduit.get_Geometry(opt)
		for ig in instGeo:
			if isinstance(ig, Solid):
				for face in ig.Faces:
					doc.Paint(conduitToPaint.Id, face, material.Id)						
						
TransactionManager.Instance.TransactionTaskDone()

OUT = getAllConnect(conduit)
5 Likes