Hi all,
First time on the forum and quite a newbie regarding dynamo and python, but I’m trying my best.
I’m creating a graph that basically gets AutoCAD block locations from an excel, matches block names with Revit groups names and moves the Revit groups to the block locations.
on the image below you can see the lists I use, on the python script I get the list of groups directly from Revit and with a for loop check if the group names are the same as the block names to return a list with the groups to be place and its location.
This is the full script:
# Enable Python support and load DesignScript library
import clr
import math
clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
def tolist(obj1):
if hasattr(obj1,"__iter__"): return obj1
else: return [obj1]
doc = DocumentManager.Instance.CurrentDBDocument
blocks = IN[0]
locations = IN[1]
mglist = []
loclist = []
#Gets groups from Revit
collector = FilteredElementCollector(doc, doc.ActiveView.Id)
filter = ElementCategoryFilter(BuiltInCategory.OST_IOSModelGroups)
mgroups = collector.WherePasses(filter).ToElements()
#Gets a list with groups to be placed and locations
for mg in mgroups:
for block in blocks:
if mg.GroupType.ToDSType(True).Name == block:
mglist.append(mg.GroupType)
bindex = blocks.index(block)
newloc = locations[bindex]
loclist.append(newloc)
#place the groups
outList = []
i = 0
locs = tolist(loclist)
if len(mglist) == len(locs):
for g in mglist:
loc = locs[i].ToRevitType(True)
TransactionManager.Instance.EnsureInTransaction(doc)
newGrp = doc.Create.PlaceGroup(loc, g)
outList.append(newGrp)
TransactionManager.Instance.TransactionTaskDone()
i = i+1
else:
outList.append("Could not Create Groups")
# Assign your output to the OUT variable.
OUT = outList
And Dynamo file:
Place & Rotate Model groups.dyn (86.0 KB)
The issue that I detect happens on this part:
#Gets a list with groups to be placed and locations
for mg in mgroups:
for block in blocks:
if mg.GroupType.ToDSType(True).Name == block:
mglist.append(mg.GroupType)
bindex = blocks.index(block)
newloc = locations[bindex]
loclist.append(newloc)
On the image below you can see that group T6_AS matches index 5 and 9 of block list, next to it you can see their respective locations, but on the OUT it duplicates location of index 5 instead of append locations on index 5 and 9.
I thinks it has something to do on how the for loop works, I tried to find a solution but I can not find anything.
Any ideas? Thanks for the help in advance!