Create Switchback Stairs and Landing From Lines With Python Script

@c.poupin Ah, that makes perfect sense. Brilliant! Didn’t realize TopElevation was an enumeration (still learning). Also, I like how you dealt with .ToRevitType() instead of a separate node. Very slick.

The Python Script | Extract Dwg node seems to make a list derived from the SelectModelElement node input, which is from a CAD file or…lines created in Revit? That’s a great way to test something instead of the hassle of a link.

Here is my updated code. Added the Revit Nodes reference just in case:

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import StairsRun
from Autodesk.Revit.DB.Architecture import StairsLanding
from Autodesk.Revit.DB import CurveLoop

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

doc = DocumentManager.Instance.CurrentDBDocument	
class StairsFailurePreprocessor( IFailuresPreprocessor ):
	def PreprocessFailures(self, failuresAccessor):
		return FailureProcessingResult.Continue

baseLevel = UnwrapElement(IN[0])
nextLevel = UnwrapElement(IN[1])
b1Curves = IN[2]
r1Curves = IN[3]
p1Curves = IN[4]
b2Curves = IN[5]
r2Curves = IN[6]
p2Curves = IN[7]
elCurves = IN[8]

TransactionManager.Instance.ForceCloseTransaction()

newStairsScope = StairsEditScope(doc, 'New Stairs')
newStairsId = newStairsScope.Start(baseLevel.Id, nextLevel.Id)

trans = Transaction(doc, 'Add Runs and Landings to Stairs')
trans.Start()

bdryCurves1 = list(b1Curves)
riserCurves1 = list(r1Curves)
pathCurves1 = list(p1Curves)

bdryCurves2 = list(b2Curves)
riserCurves2 = list(r2Curves)
pathCurves2 = list(p2Curves)

landingLoop = CurveLoop.Create(elCurves)

r1Count = len(r1Curves)
r2Count = len(r2Curves)

#midLevel = nextLevel.Elevation - baseLevel.Elevation / 2 * r1Count / r2Count

newRun1 = Autodesk.Revit.DB.Architecture.StairsRun.CreateSketchedRun(doc, newStairsId, baseLevel.Elevation, bdryCurves1, riserCurves1, pathCurves1)
newLanding = Autodesk.Revit.DB.Architecture.StairsLanding.CreateSketchedLanding(doc, newStairsId, landingLoop, newRun1.TopElevation)
newRun2 = Autodesk.Revit.DB.Architecture.StairsRun.CreateSketchedRun(doc, newStairsId, newLanding.BaseElevation, bdryCurves2, riserCurves2, pathCurves2)
trans.Commit()
newStairsScope.Commit(StairsFailurePreprocessor())

OUT = newStairsId

Well done, Sir!

-L

1 Like