Hi, anyone know how to adjust this code to let drafting views through the node even though they don’t have a crop region? Would be super helpful in my sheet duplicate with view script. Otherwise I need to extract the drafting views and feed them back into the list in the correct place around this node somehow.
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import clr
clr.AddReference('RevitAPI')
import Autodesk.Revit.DB
import clr
clr.AddReference("RevitNodes")
import Revit
clr.AddReference('DSCoreNodes')
import DSCore
from DSCore import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
# Import ToProtoType, ToRevitType geometry conversion extension methods
clr.ImportExtensions(Revit.GeometryConversion)
#The inputs to this node will be stored as a list in the IN variables.
if isinstance(IN[0], list):
views = UnwrapElement(IN[0])
else:
views = [UnwrapElement(IN[0])]
if isinstance(IN[1], list):
if IN[1][0].GetType() == PolyCurve:
curves = [PolyCurve.Curves(x) for x in IN[1]]
elif IN[1][0].GetType() == Curve or IN[1][0].GetType() == Line:
curves = List.OfRepeatedItem(IN[1],len(views))
else:
curves = IN[1]
else:
if IN[1].GetType() == PolyCurve:
curves = [PolyCurve.Curves(IN[1])]
else:
curves = [IN[1]]
listout = []
for view,curve in zip(views,curves):
regionMan = view.GetCropRegionShapeManager()
revit_curve = [c.ToRevitType() for c in curve]
curveloop = Autodesk.Revit.DB.CurveLoop()
for c in revit_curve:
curveloop.Append(c)
TransactionManager.Instance.EnsureInTransaction(doc)
if view.CropBoxActive == False:
view.CropBoxActive = True
view.CropBoxVisible = True
regionMan.SetCropShape(curveloop)
TransactionManager.Instance.TransactionTaskDone()
listout.append(view)
#Assign your output to the OUT variable.
OUT = listout
for view,curve in zip(views,curves):
if view.GetType() == Autodesk.Revit.DB.ViewDrafting:
listout.append(view)
continue
regionMan = view.GetCropRegionShapeManager()
Awesome, thanks man. I’ve tried a few times but unfortunately I don’t know where to put it in the code haha. Could you assist please? I thought this may have been it
listout = []
for view,curve in zip(views,curves):
if view.GetType() == Autodesk.Revit.DB.ViewDrafting:
listout.append(view)
continue
regionMan = view.GetCropRegionShapeManager()
revit_curve = [c.ToRevitType() for c in curve]
curveloop = Autodesk.Revit.DB.CurveLoop()
for c in revit_curve:
Not sure if the list structure and the new code might throw it out
Looks like you haven’t got the indentation right. Here’s the complete code:
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import clr
clr.AddReference('RevitAPI')
import Autodesk.Revit.DB
import clr
clr.AddReference("RevitNodes")
import Revit
clr.AddReference('DSCoreNodes')
import DSCore
from DSCore import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
# Import ToProtoType, ToRevitType geometry conversion extension methods
clr.ImportExtensions(Revit.GeometryConversion)
#The inputs to this node will be stored as a list in the IN variables.
if isinstance(IN[0], list):
views = UnwrapElement(IN[0])
else:
views = [UnwrapElement(IN[0])]
if isinstance(IN[1], list):
if IN[1][0].GetType() == PolyCurve:
curves = [PolyCurve.Curves(x) for x in IN[1]]
elif IN[1][0].GetType() == Curve or IN[1][0].GetType() == Line:
curves = List.OfRepeatedItem(IN[1],len(views))
else:
curves = IN[1]
else:
if IN[1].GetType() == PolyCurve:
curves = [PolyCurve.Curves(IN[1])]
else:
curves = [IN[1]]
listout = []
for view,curve in zip(views,curves):
if view.GetType() == Autodesk.Revit.DB.ViewDrafting:
listout.append(view)
continue
regionMan = view.GetCropRegionShapeManager()
revit_curve = [c.ToRevitType() for c in curve]
curveloop = Autodesk.Revit.DB.CurveLoop()
for c in revit_curve:
curveloop.Append(c)
TransactionManager.Instance.EnsureInTransaction(doc)
if view.CropBoxActive == False:
view.CropBoxActive = True
view.CropBoxVisible = True
regionMan.SetCropShape(curveloop)
TransactionManager.Instance.TransactionTaskDone()
listout.append(view)
#Assign your output to the OUT variable.
OUT = listout
Hmm, might have something to do with how the custom nodes handles it. Have you tried it with a simple flat list? That seems to work for me when using a python node.