Hi, I’ve been using and modifying python code to create elevation markers from https://learndynamo.com/mod2/ to create curtain wall elevations.
One thing I’m not sure how to do or even code is how to always create an elevation marker on the outside of the building. Because curtain walls dont have a location line. I’ve had a think about it and could you have rules that if there’s a floor it will create on the other side of that? But then you have decks as floors on the outside sometimes so how would that help. Is it possible to create a perimeter line of a building at each floor and create an elevation marker on the outside of that. Maybe there’s something much simpler I haven’t thought of. Maybe there’s something that could be done in dynamo before going into the python script with the location point.
The elevation marker creator code below
import clr
clr.AddReference('RevitAPI')
clr.AddReference("RevitServices")
clr.AddReference("RevitNodes")
import RevitServices
import Revit
import Autodesk
from Autodesk.Revit.DB import *
from math import *
clr.ImportExtensions(Revit.GeometryConversion)
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
toggle = IN[0]
points = UnwrapElement(IN[1])
modelPoints = UnwrapElement(IN[2])
cropCurves = UnwrapElement(IN[3])
viewType = UnwrapElement(IN[4])
lst = []
viewid = []
output = []
#Get Family View Type
vft = 0
collector = FilteredElementCollector(doc).OfClass(ViewFamilyType).ToElements()
#eleViews = []
for i in collector:
if i.ViewFamily == ViewFamily.Elevation:
vft = i.Id
break
if toggle == True:
TransactionManager.Instance.EnsureInTransaction(doc)
for ind, point in enumerate(points):
#Retrieve the mid point of model lines and get X,Y.
modelMP = modelPoints[ind].ToXyz()
modelMPX = modelMP.X
modelMPY = modelMP.Y
#Retrieve individual lines of crop window.
cropLines = cropCurves[ind]
l1 = cropLines[0].ToRevitType()
l2 = cropLines[1].ToRevitType()
l3 = cropLines[2].ToRevitType()
l4 = cropLines[3].ToRevitType()
# Create a line in the z-Axis for elevation marker to rotate around.
elevationPT = point.ToXyz()
elptRotate = XYZ(elevationPT.X, elevationPT.Y, elevationPT.Z+100)
ln = Line.CreateBound(elevationPT, elptRotate)
#Calculate the angle between Model Mid Point and Elevation Point.
elevationPTY = elevationPT.Y
elevationPTX = elevationPT.X
combY = elevationPTY-modelMPY
combX = elevationPTX-modelMPX
ang = atan2(combY, combX)/2
ang1 = atan2(combY, combX)/2
#Create elevation marker and elevation in position 0.
eleMarker = ElevationMarker.CreateElevationMarker(doc, viewType.Id, elevationPT, 100)
ele = eleMarker.CreateElevation(doc, doc.ActiveView.Id , 0)
viewid.append(ele)
#Rotate elevation marker towars model line.
ElementTransformUtils.RotateElement(doc, eleMarker.Id, ln, ang)
ElementTransformUtils.RotateElement(doc, eleMarker.Id, ln, ang1)
#
crManager = ele.GetCropRegionShapeManager()
#crShape = crManager.GetCropRegionShape()
newCurveLoop = []
newCurveLoop.Add(l1)
newCurveLoop.Add(l2)
newCurveLoop.Add(l3)
newCurveLoop.Add(l4)
cLoop = CurveLoop.Create(newCurveLoop)
try:
crManager.SetCropShape(cLoop)
lst.append("Elevation Created")
except:
pass
lst.append("Missed Elevation")
TransactionManager.Instance.TransactionTaskDone()
output.append([lst,viewid])
OUT = output
else:
OUT = "Set Run Gate to TRUE"