Skip to content

Instantly share code, notes, and snippets.

@teocomi
Last active March 9, 2018 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teocomi/9a3e5ff5c06ecf38ee6ea65f40c7c820 to your computer and use it in GitHub Desktop.
Save teocomi/9a3e5ff5c06ecf38ee6ea65f40c7c820 to your computer and use it in GitHub Desktop.
Fixes column level and offset in Revit using Dynamo
# Inspired by: https://danimosite.wordpress.com/2017/06/06/split-walls-and-columns-by-level/
# Fixes Columns in Revit using Dynamo by setting Top and Base levels to the closest levels and sets the right offsets to those levels
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
import math, sys
# Import System Collections...
import System
from System.Collections.Generic import *
def tolist(obj1):
if hasattr(obj1, "__iter__"):
return obj1
else:
return [obj1]
def FindClosestLevelAndOffset(levels, lev, offset):
closestLevel = None
maxdistance = sys.maxint
newoffset = 0
for l in levels:
dist = (lev.Elevation + offset) - l.Elevation
absdist = math.fabs(dist)
if absdist < maxdistance:
closestLevel = l
maxdistance = absdist
newoffset = dist
return [closestLevel, newoffset]
run = tolist(IN[0])[0]
cols = tolist(UnwrapElement(IN[1]))
if run:
levels = list([l for l in FilteredElementCollector(doc).OfClass(Level).ToElements()])
levels.sort(key=lambda x: x.Elevation, reverse=False)
TransactionManager.Instance.EnsureInTransaction(doc)
for c in cols:
if c.Category.Name == "Structural Columns":
pbase = c.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM)
base = doc.GetElement(pbase.AsElementId())
pbaseoff = c.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM)
ptop = c.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM)
top = doc.GetElement(ptop.AsElementId())
ptopoff = c.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM)
# get closest levels and offset
closestBase = FindClosestLevelAndOffset(levels, base, pbaseoff.AsDouble())
closestTop = FindClosestLevelAndOffset(levels, top, ptopoff.AsDouble())
# set parameters
pbase.Set.Overloads.Functions[2](closestBase[0].Id)
ptop.Set.Overloads.Functions[2](closestTop[0].Id)
pbaseoff.Set(closestBase[1])
ptopoff.Set(closestTop[1])
TransactionManager.Instance.TransactionTaskDone()
OUT = 0
else:
OUT = "Please Set Run to True"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment