Hi everyone,
I’m trying to create a script which places FamilyInstances based on a list of given coordinates, rotation angles, a family symbol and a workplane. I have been pointed to a relevant code snippet here, but from my understanding this only works with one coordinate / rotation at a time as it does not expect a list as an input.
Can anyone help me out? Thanks!
Update: I found the solution. For those interested, here’s the modified code:
import clr
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
from Revit.Elements import *
clr.AddReference('System')
from System.Collections.Generic import *
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
#The inputs to this node will be stored as a list in the IN variables.
dataEnteringNode = IN
symbol = UnwrapElement(IN[0])
refPlane = UnwrapElement(IN[1])
locations = []
for i in IN[2]:
locations.append(UnwrapElement(i).ToXyz())
referenceDirections = []
for i in IN[3]:
referenceDirections.append(UnwrapElement(i).ToXyz())
out = []
symbol.Activate()
reference = Reference(refPlane)
TransactionManager.Instance.EnsureInTransaction(doc)
for location, direction in zip(locations, referenceDirections):
new = doc.Create.NewFamilyInstance(reference,location,direction,symbol)
out.append(new)
TransactionManager.Instance.TransactionTaskDone()
#Assign your output to the OUT variable.
OUT = out
1 Like