This post is about how you can create sheet with custom viewports location by using Ironpython in Revit Dynamo Application.
First to import the modules: clr to load .Net Assemblies as IronPython modules which are RevitAPI.dll for DB, RevitServices.dll for DocumentManager and TransactionManager. Collect the current document and store in doc variable.
# dynamo version - 1.3.4 import clr clr.AddReference('RevitAPI') clr.AddReference("RevitServices") from Autodesk.Revit.DB import * from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument
The first input is a titleblock , and second input is a list of views both inputs keep unwrap.
# titleblock family t = UnwrapElement(IN[0]) # input a list of view # in this sample with 4 views views = UnwrapElement(IN[1])
And we have to open a transaction before creating the sheet. ViewSheet class has, Create, a static method to create a sheet by providing document and titleblock’s id as arguments ViewSheet.Create(doc, t.Id) .

# transaction start TransactionManager.Instance.EnsureInTransaction(doc) # create sheet sheet = ViewSheet.Create(doc, t.Id)
Next step is to place the viewports on the sheet with our custom/desire locations. To do so, first, we need to get rectangle outline paper space (so called BoundingBoxUV ) of the sheet by using Outline property from the created sheet.

# get outline of sheet o = sheet.Outline
BoundingBoxUV uses UV coordinate system which we can collect U, V coordinates’ maximum and minimum point values. In the sample code line 27 and 28 assigned x and y variables to U and V net values. (Net value = maximum – minimum)

# net values x = o.Max.U - o.Min.U y = o.Max.V - o.Min.V
After we collect the values, we need to compute four location points to properly place the four views from IN[1] input. Construct XYZ point with x, y, z values. Divisible values for x, y are most suitable values that i find for this sample, you can play around with these numbers. And z value must be 0.

# first role uv1 = XYZ( x/5, y/1.4, 0) uv2 = XYZ( x/1.7, y/1.4, 0) # second role uv3 = XYZ( x/5, y/3.5,0) uv4 = XYZ( x/1.7, y/3.5,0)
Finally, create a viewport with a location point, for each of the view by looping (views, [points]) together on the created sheet. Viewport class has, Create, a static method which need to provide four arguments as follow and close the transaction.

# create viewport for each view for v,loc in zip(views,[uv1,uv2,uv3,uv4]): Viewport.Create(doc, sheet.Id , v.Id,loc) # transaction close TransactionManager.Instance.TransactionTaskDone() # output sheet OUT = sheet
Well, that’s all for this sample and see the full sample code below.

# dynamo version - 1.3.4 import clr clr.AddReference('RevitAPI') clr.AddReference("RevitServices") from Autodesk.Revit.DB import * from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument # titleblock family t = UnwrapElement(IN[0]) # input a list of view # in this sample with 4 views views = UnwrapElement(IN[1]) # transaction start TransactionManager.Instance.EnsureInTransaction(doc) # create sheet sheet = ViewSheet.Create(doc, t.Id) # get outline of sheet o = sheet.Outline # net values x = o.Max.U - o.Min.U y = o.Max.V - o.Min.V # first role uv1 = XYZ( x/5, y/1.4, 0) uv2 = XYZ( x/1.7, y/1.4, 0) # second role uv3 = XYZ( x/5, y/3.5,0) uv4 = XYZ( x/1.7, y/3.5,0) # create viewport for each view for v,loc in zip(views,[uv1,uv2,uv3,uv4]): Viewport.Create(doc, sheet.Id , v.Id,loc) # transaction close TransactionManager.Instance.TransactionTaskDone() # output sheet OUT = sheet
Categories: How To Revit-Dynamo
min.naung
Founder and Developer @twentytwo.space
Leave a Reply