How to get Model-in-Place Element Level or Work Plane using dynamo or Python

Hi @tiagofrbr
an example

import clr
import System
from System.Collections.Generic import List
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc =  DocumentManager.Instance.CurrentDBDocument

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

def to_list(obj1):
	if hasattr(obj1,"__iter__"): return obj1
	else: return [obj1]
	
	
def myRollBack(func):
	def wrapper(*args, **kwargs):
		TransactionManager.Instance.ForceCloseTransaction()
		t = Transaction(doc, func.__name__)
		t.Start()
		ret = func(*args, **kwargs)
		t.RollBack()
		return ret
	return wrapper 


def get_LevelInPlace(elem):
	# sub function
	@myRollBack
	def getSubIds(elem):
		eIds = doc.Delete(elem.Id) 
		return eIds
	# main function
	lstElem =  [doc.GetElement(id) for id in getSubIds(elem)]
	for e in lstElem:
		if isinstance(e, Extrusion):
			namePlane = e.Sketch.SketchPlane.Name
			planeZ = e.Sketch.SketchPlane.GetPlane().Origin.Z
			filter = System.Predicate[System.Object](lambda x : x.Name == namePlane)
			lvl = List[Element](FilteredElementCollector(doc).OfCategory( BuiltInCategory.OST_Levels).WhereElementIsNotElementType().ToElements()).Find(filter)
			return lvl


def get_Level(item):
	if hasattr(item, "LevelId"): 
		lvl = doc.GetElement(item.LevelId)		
	elif hasattr(item, "Level"):
		lvl = item.Level
	elif hasattr(item, "GenLevel"):
		lvl = item.GenLevel	
	elif hasattr(item, "ReferenceLevel"): 
		lvl = doc.GetElement(item.ReferenceLevel.Id)	
	else:
		lvl = None
		
	if lvl is not None:
		return lvl
	else:
		for bip in [BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM, BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM, BuiltInParameter.SCHEDULE_LEVEL_PARAM]:
			para = item.get_Parameter(bip)
			if para is not None:
				lvl = doc.GetElement(para.AsElementId())
				if lvl is not None:
					return lvl
				
	return None


inPlaceElems = to_list(UnwrapElement(IN[0]))
outlist = []
for e in inPlaceElems:
	if isinstance(e, FamilyInstance):
		if e.Symbol.Family.IsInPlace:
			outlist.append(get_LevelInPlace(e))
		else:
			outlist.append(get_Level(e))
	else:
		outlist.append(get_Level(e))	
OUT = outlist
4 Likes