Modul 2 add an output


#1

I’m struggling with the python from http://learndynamo.com/mod2/

I don’t know much python and i can’t figure it out.
As an output i also want the created elevations, so that i can set some parameters after it is created.
Can somebody tell me what i need to change.

thank you

#Copyright(c) 2016 www.Learndynamo.com 
#Please contact at jeremy@learndynamo.com
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 = []
#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)
        #Create elevation marker and elevation in position 0.
        eleMarker = ElevationMarker.CreateElevationMarker(doc, viewType.Id, elevationPT, 100)
        ele = eleMarker.CreateElevation(doc, doc.ActiveView.Id , 0)
      
        #Rotate elevation marker towars model line.
        ElementTransformUtils.RotateElement(doc, eleMarker.Id, ln, ang)
      
        #  
        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.SetCropRegionShape(cLoop)
            lst.append("Elevation Created")
       
        except:
            pass
            lst.append("Missed Elevation")
    TransactionManager.Instance.TransactionTaskDone()
  
    OUT = lst
    
else:
    OUT = "Set toggle to TRUE"

#2

I too am trying to figure this out. I know it has to do with lines 88-95.
I have been playing around with it for some time and I cannot get it to say “Elevation Created”. I know the problem has something to do with the curves I am feeding it but not sure. I would like to remove the SetCropRegionShape from the code and use View.SetCropBoxCurves Shown in this post for more control.

Thanks for any help you can provide,

I added the code in one block if that more helpful.

#Copyright(c) 2016 www.Learndynamo.com 
#Please contact at jeremy@learndynamo.com

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 = []

#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)

		#Create elevation marker and elevation in position 0.
		eleMarker = ElevationMarker.CreateElevationMarker(doc, viewType.Id, elevationPT, 100)
		ele = eleMarker.CreateElevation(doc, doc.ActiveView.Id , 0)
		
		#Rotate elevation marker towars model line.
		ElementTransformUtils.RotateElement(doc, eleMarker.Id, ln, ang)
		
		#	
		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.SetCropRegionShape(cLoop)
			lst.append("Elevation Created")
		
		except:
			pass
			lst.append("Missed Elevation")

	TransactionManager.Instance.TransactionTaskDone()
	
	OUT = lst
	
else:

	OUT = "Set toggle to TRUE"

#3

Did anyone manage to code in the out elements of the created elevations to set crop box curves after and change parameters?


#4

Found this in the comments, someone modified the code to have an elevations created output list

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)
 
        #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)
       
        #  
        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.SetCropRegionShape(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"

#5

some more reading to fix missed elevation… SetCropRegionShape() method (line 59) has been replaced with SetCropShape() for 2017 Revit