Yeah, just spent a while dealing with this issue.
I spawn a plumbing fixture on a pipe face using that method: doc.Create.NewFamilyInstance(pipeface,pipefacecenter,XYZ(0,0,0),fixturefamilysymbol)
the fixturefamilysymbol is a simple cylinder with a connector set to "global".
The family has a "Nominal Diameter" family parameter set to instance and the connector diameter is referenced to it.
Then I try to connect the NewFamilyInstance's connector to the reference pipe connector using connecfrom = list(newfamilyinstance.MEPModel.ConnectorManager.UnusedConnectors)[0].ConnectTo( list(referencepipe.ConnectorManager.UnusedConnectors)[0])
(I did all the necessary filtering before to keep elements with only one UnusedConnector)
Sometime it does work. Sometimes not. Here is an example:
Here is my code (please forgive my brutal style and overkill boilerplate):
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
from System.Collections.Generic import *
from Autodesk.Revit.Attributes import*
import clr
clr.AddReference("RevitAPIUI")
from Autodesk.Revit.UI import *
# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from System.Collections.Generic import *
# Import Revit Nodes
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
# Import python library
import sys
pyt_path = r"C:\Program Files\Autodesk\Revit 2022\AddIns\DynamoForRevit"
sys.path.append(pyt_path)
import os
import subprocess
import System
from System import *
doc = DocumentManager.Instance.CurrentDBDocument
# The inputs to this node will be stored as a list in the IN variables.
def getParamValue(element,param):
try:
DB = element.GetOrderedParameters()
for i in DB:
if i.Definition.Name == param:
if i.StorageType == 2:
value = (i.AsDouble())
elif i.StorageType == 1:
value = (i.AsInteger())
elif i.StorageType == 3:
value = (i.AsString())
else: value = (i.AsElementId())
except:
value = ("Aucune valeur trouvée")
return value
def getParamObj(element,param):
valueout = 0
try:
DB = element.GetOrderedParameters()
for i in DB:
if i.Definition.Name == param:
valueout = i
except:
pass
return valueout
def getpipefaceformagicconnector(wpipe):
pipe = UnwrapElement(wpipe)
cons = list(pipe.ConnectorManager.UnusedConnectors)
if len(cons) >0:
geomenum = pipe.get_Geometry(opt)
pipecurve = pipe.Location.Curve
solids = []
pipefaces = []
for geobj in geomenum:
solids.append(geobj)
for solid in solids:
flist = solid.Faces
for fc in flist:
if "PlanarFace" in fc.GetType().ToString():
pipefaces.append(fc)
for con in cons:
for pipeface in pipefaces:
if pipecurve.GetEndPoint(0).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin) - getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return pipeface
elif pipecurve.GetEndPoint(1).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin)- getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return pipeface
return ["Error",UnwrapElement(wpipe)]
def getpipefacecenterformagicconnector(wpipe):
pipe = UnwrapElement(wpipe)
cons = list(pipe.ConnectorManager.UnusedConnectors)
if len(cons) >0:
geomenum = pipe.get_Geometry(opt)
pipecurve = pipe.Location.Curve
solids = []
pipefaces = []
for geobj in geomenum:
solids.append(geobj)
for solid in solids:
flist = solid.Faces
for fc in flist:
if "PlanarFace" in fc.GetType().ToString():
pipefaces.append(fc)
for con in cons:
for pipeface in pipefaces:
if pipecurve.GetEndPoint(0).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin) - getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return pipecurve.GetEndPoint(0)
elif pipecurve.GetEndPoint(1).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin)- getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return pipecurve.GetEndPoint(1)
return listout.append(["Error",UnwrapElement(wpipe)])
def getpipeconnectorformagicconnector(wpipe):
pipe = UnwrapElement(wpipe)
cons = list(pipe.ConnectorManager.UnusedConnectors)
if len(cons) >0:
geomenum = pipe.get_Geometry(opt)
pipecurve = pipe.Location.Curve
solids = []
pipefaces = []
for geobj in geomenum:
solids.append(geobj)
for solid in solids:
flist = solid.Faces
for fc in flist:
if "PlanarFace" in fc.GetType().ToString():
pipefaces.append(fc)
for con in cons:
for pipeface in pipefaces:
if pipecurve.GetEndPoint(0).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin) - getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return con
elif pipecurve.GetEndPoint(1).DistanceTo(con.Origin)==0 and pipeface.Origin.DistanceTo(con.Origin)- getParamValue(pipe,"Outside Diameter")/2 < 0.01:
return con
return ["Error",UnwrapElement(wpipe)]
def getMagicConnectorFamTyp(document):
allPlumbingfixturesTypesInProject = FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_PlumbingFixtures).WhereElementIsElementType().ToElements()
pftinsert = []
for pbft in allPlumbingfixturesTypesInProject:
pbftType = pbft.get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM)
if "Magic" in pbftType.AsString():
pftinsert.append(pbft)
TransactionManager.Instance.EnsureInTransaction(doc)
pbft.Activate()
TransactionManager.Instance.TransactionTaskDone()
return pbft
return None
TransactionManager.Instance.EnsureInTransaction(doc)
Connecto = []
RefFace = []
RefLines = []
listout = []
opt = Options()
opt.ComputeReferences = True
mcft = getMagicConnectorFamTyp(doc)
wpipe = doc.GetElement(ElementId(4869586))
pipeface = getpipefaceformagicconnector(wpipe)
pipefacecenter = getpipefacecenterformagicconnector(wpipe)
#faceNormals.append(pipeface.FaceNormal)
#pipecurve = UnwrapElement(wpipe).Location.Curve
Connecto = getpipeconnectorformagicconnector(wpipe)
MagicConnector = doc.Create.NewFamilyInstance(pipeface,pipefacecenter,XYZ(0,0,0),mcft)
listout.append([MagicConnector,wpipe,pipeface,pipefacecenter])
level = UnwrapElement(wpipe).LevelId
phase = UnwrapElement(wpipe).get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId()
DiamAssign = getParamValue(UnwrapElement(wpipe),"Diameter")
listout.append(DiamAssign)
MagicConnDiameter = getParamObj(MagicConnector,"Nominal Diameter")
MagicConnDiameter.Set(DiamAssign)
#MagicConnOffsetfromHost = getParamObj(MagicConnector,"Offset from Host")
#MagicConnOffsetfromHost.Set(8/304.8)
MagicConnector.get_Parameter(BuiltInParameter.PHASE_CREATED).Set(phase)
MagicConnHWFU = getParamObj(doc.GetElement(MagicConnector.GetTypeId()),"CWFU")
MagicConnHWFU.Set(10)
MagicConnHWFU = getParamObj(doc.GetElement(MagicConnector.GetTypeId()),"HWFU")
MagicConnHWFU.Set(0)
MagicConnHWFU = getParamObj(doc.GetElement(MagicConnector.GetTypeId()),"WFU")
MagicConnHWFU.Set(0)
try:
connecfrom = list(MagicConnector.MEPModel.ConnectorManager.UnusedConnectors)
connecfrom[0].ConnectTo(Connecto)
listout.append([MagicConnector,"connect OK",Connecto,connecfrom[0]])
except:
connecfrom = list(MagicConnector.MEPModel.ConnectorManager.UnusedConnectors)
listout.append([MagicConnector,"connect fail",Connecto,connecfrom[0]])
TransactionManager.Instance.TransactionTaskDone()
# Assign your output to the OUT variable.
OUT = listout