This is the final version of my graph based on @Steven and @awilliams code above (thanks both). I won’t try to figure out the direction of rotation so I added an option to select it ( usually the smaller rotation is the right direction).
Inputs are the Elevation Mark to rotate, the wall to look at and the elevation that will look at that wall (and the direction of rotation clockwise or not).
rotate elevations to look at wall.dyn (28.4 KB)
3 Likes
vanman
December 10, 2021, 5:15am
23
Did anyone figure out how to rotate to wall? When I rotate it, it moves slightly off the point and not sure how to figure out the direction
Just ended up using this for room elevations. Cant remember whos code it is but this line seems to be what susses it. Would be cool to get how it does. Probably adapt for anything and elevations
ElementTransformUtils.RotateElement(doc, eleMarker.Id, ln, ang)
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"