I need help creating electrical conduit with Dynamo in Revit

Translated by moderator. See below the line for original post.


I need help automating my pipeline with a dynamo. I’ve tried everything and I need help.


Original post below


Necesito ayuda para la automatizacion de mis tuberia con dynamo.. he intentado de todo y necesito ayuda

Welcome to the forum @erickantoniorodrigue!

The official language here is English, which sadly is a requirement for search to work (annars skulle jag posta på svenska). Please translate all future posts, keeping your native language post on the other side of a separation if you’d like, as it may help us should we ever get multi-language support.

here an example with Python

conduitbylines

This is a simple example involving horizontal pipe runs; if other types of fittings need to be used (such as Tee-fittings), the solution will need to be adapted.

code Python (with PythonNet3)

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

clr.AddReference("System.Core")
clr.ImportExtensions(System.Linq)

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
#import specify namespace
from Autodesk.Revit.DB.Electrical import *

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

def get_conduit_size(type_conduit_name, size_project):
    global unit_L
    input_size = UnitUtils.ConvertToInternalUnits(float(size_project), unit_L)
    css = ConduitSizeSettings.GetConduitSizeSettings(doc)
    enumeratorA = css.GetEnumerator()
    while enumeratorA.MoveNext(): 
        type_conduit, allSize = enumeratorA.Current.Key, enumeratorA.Current.Value
        #print(type_conduit, allSize)
        enumeratorB = allSize.GetEnumerator()
        while enumeratorB.MoveNext():
            size_c = enumeratorB.Current
            #print(type_conduit, size_c)
            if abs(size_c.NominalDiameter - input_size ) < 0.01:
                return type_conduit, size_c.NominalDiameter
    return None, None
        
def create_elbows(lstconduit):
    all_connectors = [c for cond in lstconduit for c in cond.ConnectorManager.Connectors]
    out = []
    i = 0
    while all_connectors and i < 100:
        i += 1
        conA = all_connectors.pop(0)
        if len(all_connectors) > 0:
            all_connectors.sort(key = lambda c : c.Origin.DistanceTo(conA.Origin))
            conCandidate = all_connectors[0]
            if conCandidate.Origin.DistanceTo(conA.Origin) < 0.01:
                conB = all_connectors.pop(0)
                newfitting = doc.Create.NewElbowFitting(conA, conB)
                out.append(newfitting)
    return out
    
toList = lambda x : x if hasattr(x, '__iter__') else [x]
lst_DSlines_toconduit = IN[0]
conduit_type_name = IN[1]
conduit_size = IN[2]
conduit_LevelId = doc.ActiveView.GenLevel.Id
unit_L = doc.GetUnits().GetFormatOptions(SpecTypeId.Length).GetUnitTypeId()
lst_new_conduit = []

conduit_type = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Conduit).WhereElementIsElementType()\
            .FirstOrDefault(System.Func[System.Object, System.Boolean](lambda x: x.Name == conduit_type_name))

if conduit_type:
    conduit_std_type_name  = conduit_type.get_Parameter(BuiltInParameter.CONDUIT_STANDARD_TYPE_PARAM).AsValueString()
    conduit_std_type, size_conduit = get_conduit_size(conduit_std_type_name, conduit_size)
    #print(conduit_std_type_name, size_conduit)
    #Do some action in a Transaction
    if size_conduit:
        TransactionManager.Instance.EnsureInTransaction(doc)
    
        for line in lst_DSlines_toconduit:
            line = line.ToRevitType()
            newconduit = Conduit.Create( doc, conduit_type.Id, line.GetEndPoint(0), line.GetEndPoint(1), conduit_LevelId)
            newconduit.get_Parameter(BuiltInParameter.RBS_CONDUIT_DIAMETER_PARAM).Set(size_conduit)
            lst_new_conduit.append(newconduit)
        #
        doc.Regenerate()
    
        lst_elbows = create_elbows(lst_new_conduit)
    
        TransactionManager.Instance.TransactionTaskDone()
    
        OUT =lst_new_conduit, lst_elbows