Anuncios
Welcome to the Revit Ideas Board! Before posting, please read the helpful tips here. Thank you for your Ideas!
Comentario
Contributor
Contributor

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".

richardlaroche_1-1679512800317.png

 

The family has a "Nominal Diameter" family parameter set to instance and the connector diameter is referenced to it.

richardlaroche_0-1679512730639.png

 

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