Bring forward / send back (detail items)

Hello All.

Is there any custom node people know of, that brings forward, or sends back, detail items? Or is it even possible? I’m currently working on a project with alot of detailing where this would be very useful.

greetings, Robin

1 Like

Hello Robin,
I’m not aware of any custom nodes that deals with draw order, but it is possible with the DetailElementOrderUtils class in the Revit API.

This example uses draw to back, but just replace

stb=DetailElementOrderUtils.SendToBack(doc,view,elemIds)

with one of the other methods shown below:

Dynamo example:

The python script:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('System')
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

#Converting input from Dynamo to Revit
detailItems = UnwrapElement(IN[0])
view = UnwrapElement(IN[1])

#Creating collection of elementIDs
elemIds = List[ElementId]([el.Id for el in detailItems])

#Send detail item to back in a transaction
TransactionManager.Instance.EnsureInTransaction(doc)

stb=DetailElementOrderUtils.SendToBack(doc,view,elemIds)

TransactionManager.Instance.TransactionTaskDone()

OUT = stb
3 Likes

Is it possible to change the draw order for detail components in multiple views?

I tried modifying your code as attached:
bring to front.dyn (7.1 KB)

"
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('System')
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

#Converting input from Dynamo to Revit
detailItems = UnwrapElement(IN[0])

#collecting views
viewcollector = FilteredElementCollector(doc).OfClass(View)
#viewcollector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views)
views = list()
viewIds = []
for view in viewcollector:
	if view.IsTemplate == False:
		views.append(view)
for v in views:
	#viewId = v.Id
	viewIds = List[View]([v])

#Creating collection of elementIDs
elemIds = []
for el in detailItems:
	elId = el.Id
	elemIds = List[ElementId]([elId])

#Bring detail item to front in a transaction
TransactionManager.Instance.EnsureInTransaction(doc)

#for i in range(0,len(elemIds)):

for v in views:
	btf = DetailElementOrderUtils.BringToFront(doc,v,elemIds)
	TransactionManager.Instance.TransactionTaskDone()

	OUT = btf
";

Sure it should be possible, but first you need a list of views and a corresponding list with sublists that contain only the elements (detail items) in each view.

OK, what’s the next step after that? I keep getting the exception:

Exception: The set detailElementIds contains one or more non-detail element Ids.
Parameter name: detailElementIds

Figured it out. Thanks for the help, Einar.

I’m sure the filtering could be optimized a bit, but this seems to work.

Python script:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('System')
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

#Converting input from Dynamo to Revit
mylist = UnwrapElement(IN[0])

#Send detail item to back in a transaction
TransactionManager.Instance.EnsureInTransaction(doc)

for i in range(0,len(mylist)):
	viewmatch = mylist[i]
	v = viewmatch[1]
	elem = viewmatch[0]
	btf=DetailElementOrderUtils.BringToFront(doc,v,elem.Id)

TransactionManager.Instance.TransactionTaskDone()

OUT = btf
1 Like