Help with mep script

Hello everybody.
Dear members, yesterday I found this topic

credits to @c.poupin

To summarize, his script paints the faces of the conduit however it doesnt do the same with the curves. So I tried to include the conduitfittings in the script, but I wasnt successful in several ways.
As an example of modification:

ORIGINAL

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)

MOD

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, ConduitFitting

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) or isinstance(conduitToPaint, ConduitFitting):
		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)

Does anyone know what really should be adjusted?

Hi,

the paint method does not work with Families, it is necessary to add a Material parameter in the Family

1 Like

hmm now I understand why no attempt was right.
Thank you for noticing this @c.poupin

1 Like