Change the Curve that determines the 2D extents of Grids in Each View

Here an update code

there will surely be cases where it will not work


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

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument
app = uiapp.Application
sdkNumber = int(app.VersionNumber)


clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)


def createDatumLine(boundLines, grid):
	gridLine = None
	curveG = grid.Curve#.ToProtoType()
	vectGrid = curveG.Direction
	lstPtToLine = []
	for lineBound in boundLines:
		rayc = DB.Line.CreateUnbound(XYZ(curveG.Origin.X, curveG.Origin.Y, lineBound.GetEndPoint(0).Z) , vectGrid)
		outInterR = clr.Reference[IntersectionResultArray]()
		result = rayc.Intersect(lineBound, outInterR)
		print(result)
		if result == SetComparisonResult.Overlap:
			interResult = outInterR.Value
			lstPtToLine.append(interResult[0].XYZPoint)
	print(lstPtToLine)
	if len(lstPtToLine) == 2:
		gridLine = Autodesk.Revit.DB.Line.CreateBound(lstPtToLine[0], lstPtToLine[1])
	return gridLine
	
	
activView = doc.ActiveView
TransactionManager.Instance.EnsureInTransaction(doc)
#
activView.CropBoxVisible = True
doc.Regenerate()
cropBox = activView.CropBox 

fecGrids = FilteredElementCollector(doc, activView.Id).OfClass(DatumPlane).ToElements()
cutOffset = fecGrids[0].GetCurvesInView(DatumExtentType.ViewSpecific, activView)[0].GetEndPoint(0).Z
fecGrids = [x for x in fecGrids if isinstance(x, DB.Grid)]

outLst = []
shpManager = activView.GetCropRegionShapeManager()
boundLines = shpManager.GetCropShape()[0]


if activView.ViewDirection.IsAlmostEqualTo(XYZ(0,0,1)):
	# get Current Elevation of boundLines
	currentZ = list(boundLines)[0].GetEndPoint(0).Z
	# transform boundLines CurveLoop
	tf = Transform.CreateTranslation( XYZ(0,0, cutOffset - currentZ))
	boundLines = CurveLoop.CreateViaTransform(boundLines, tf)
	for grid in fecGrids:
		outLst.append(grid.Curve.ToProtoType())
		newGLine = createDatumLine(boundLines, grid)
		if newGLine is not None:
			grid.SetCurveInView(DatumExtentType.ViewSpecific, activView, newGLine)
			
else:
	for grid in fecGrids:
		outLst.append(grid.Curve.ToProtoType())
		newGLine = createDatumLine(boundLines, grid)
		if newGLine is not None:
			grid.SetCurveInView(DatumExtentType.ViewSpecific, activView, newGLine)
			
	
TransactionManager.Instance.TransactionTaskDone()

OUT =  outLst, [x.ToProtoType() for x in boundLines], cutOffset,

some tests in Video with a slightly different process

test extend grid2

5 Likes