(PACKAGE DEPRECATED)
Parent Topic : Quasar Package Guide
Quasar Package Guide : PART – A
- ActiveView
- CeilingViewByRoom
- CopyPasteFilter
- CreateDuctByModelCurve
- CreateBeamByModelCurve
- CreateWallSweep
- ElevationInRoom
- ThreeDViewByRoom
- ViewSelector
- TransferViewTemplateAndFilterUI
ActiveView
Return ActiveView
of the current document.

ActiveView – IronPython
# dynamo version - 1.3.4
import clr
# clr.AddReference loads and imports .net assembly(dll)
# load RevitAPI.dll and RevitServices.dll
clr.AddReference("RevitAPI")
clr.AddReference("RevitServices")
# import document manager
from RevitServices.Persistence import DocumentManager
# import transaction manager
from RevitServices.Transactions import TransactionManager
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
# active view
activeView = doc.ActiveView
# output
OUT = activeView
CeilingViewByRoom
Create CeilingPlanView
by Level, Room Element(s), ViewName and Offset ( ViewCrop distance from Room Element) . * Note : If you use for multiple Room Elements, the list length of Rooms input & Names input must be the same (should not include the same naming) and for Level & Offset inputs always be a single value input.

CeilingViewByRoom – IronPython
# dynamo version - 1.3.4
import clr
clr.AddReference("RevitAPI")
clr.AddReference("RevitServices")
# import all classes from Revit DB
from Autodesk.Revit.DB import *
# import document manager
from RevitServices.Persistence import DocumentManager
# import transaction manager
from RevitServices.Transactions import TransactionManager
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
level = IN[0]
rooms = IN[1]
names = IN[2]
# metric unit (mm to ft)
Offset = IN[3]/304.8
result = []
# make list
if not isinstance(rooms,list):
Rooms = UnwrapElement([rooms])
else:
Rooms = UnwrapElement(rooms)
if not isinstance(names,list):
Names = [names]
else:
Names = names
# create new bbox based on offset
def crop_box(bbox, offset):
minX = bbox.Min.X - offset
minY = bbox.Min.Y - offset
minZ = bbox.Min.Z - offset
maxX = bbox.Max.X + offset
maxY = bbox.Max.Y + offset
maxZ = bbox.Max.Z + offset
newbox = BoundingBoxXYZ()
newbox.Min = XYZ(minX,minY, minZ)
newbox.Max = XYZ(maxX, maxY, maxZ)
return newbox
# collect views
views = FilteredElementCollector(doc).OfClass(View).ToElements()
# get first ceiling view
cview = [v for v in views if v.ViewType == ViewType.CeilingPlan][0]
# start transaction
TransactionManager.Instance.EnsureInTransaction(doc)
# loop room and name
for room,name in zip(Rooms,Names):
# duplicate ceiling view
view = cview.Duplicate(ViewDuplicateOption.WithDetailing)
# get room bbox
bbox = room.BoundingBox[doc.ActiveView]
# create new bbox
cbox = crop_box(bbox,Offset)
# get duplicated view
dupview = doc.GetElement(view)
# set name
dupview.Name = name
# set view cropbox
dupview.CropBox = cbox
# set cropbox active
dupview.CropBoxActive = True
# set cropbox visibility
dupview.CropBoxVisible = False
# set scale
dupview.Scale = 25
# append result
result.append(dupview)
# transaction done
TransactionManager.Instance.TransactionTaskDone()
# output result
OUT = result
CopyPasteFilter
Copy Filter Elements from a View to other Views in the same document.
CopyPasteFilter – IronPython
# 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
# view to copy
viewtocopy= UnwrapElement(IN[0])
# views to paste
viewstopaste = IN[1]
# make list
if not isinstance(viewstopaste,list):
viewstopaste = UnwrapElement([IN[1]])
else:
viewstopaste = UnwrapElement(IN[1])
# start transaction
TransactionManager.Instance.EnsureInTransaction(doc)
# views to paste loop each view
for view in viewstopaste:
# views to copy loop each filter id
for id in viewtocopy.GetFilters():
# set filter override
view.SetFilterOverrides(id,viewtocopy.GetFilterOverrides(id))
# set filter visibility
view.SetFilterVisibility(id,viewtocopy.GetFilterVisibility(id))
# transaction done
TransactionManager.Instance.TransactionTaskDone()
# output views
OUT = viewstopaste

CreateDuctByModelCurves
Create Duct Element
(s) by ModelCurve(s)/Line(s) and Duct FamilyType
.

CreateDuctByModelCurve – IronPython
# dynamo version - 1.3.4
import clr
clr.AddReference("RevitAPI")
clr.AddReference("RevitServices")
from Autodesk.Revit.DB import *
from RevitServices.Persistence import DocumentManager
# import classes from mechanical namespace
from Autodesk.Revit.DB.Mechanical import *
from RevitServices.Transactions import TransactionManager
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
lines = IN[0]
ductType = UnwrapElement(IN[1])
ducts = []
# make list
if isinstance(lines, list):
lines = UnwrapElement(lines)
else:
lines = UnwrapElement([lines])
#current view level
level = doc.ActiveView.GenLevel
#collect family symbol
fsymbol = FilteredElementCollector(doc).OfClass(MechanicalSystemType).ToElements()[0]
#transaction start
TransactionManager.Instance.EnsureInTransaction(doc)
# loop lines
for line in lines:
#create duct
duct = Duct.Create(doc, fsymbol.Id,ductType.Id, level.Id, line.GeometryCurve.GetEndPoint(0), \
line.GeometryCurve.GetEndPoint(1));
#append to result
ducts.append(duct)
#transaction end
TransactionManager.Instance.TransactionTaskDone()
# output result
OUT = ducts

CreateBeamsByModelCurves
Create Beam Element
(s) by ModelCurve(s)/Line(s) and Beam FamilyType
.

CreateBeamByModelCurve – IronPython
# 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
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
# input model curves
lines = IN[0]
# empty list for return output
beams = []
# if input is a list
if isinstance(lines, list):
lines = UnwrapElement(lines)
# if not a list
else:
lines = UnwrapElement([lines])
#current view level
level = doc.ActiveView.GenLevel
#collect family symbol
fsymbol = FilteredElementCollector(doc).OfClass(FamilySymbol)
#collect first symbol from structural framing symbols
sym=fsymbol.OfCategory(BuiltInCategory.OST_StructuralFraming).ToElements()[0]
#transaction start
TransactionManager.Instance.EnsureInTransaction(doc)
for line in lines:
#create beam
beam = doc.Create.NewFamilyInstance(line.GeometryCurve, sym,
level, Structure.StructuralType.Beam)
#append to output
beams.append(beam)
#transaction end
TransactionManager.Instance.TransactionTaskDone()
#output
OUT = beams

CreateWallSweep
Create WallSweep
by WallElement(s), WallType,a string “Sweep”/”Reveal”,a Boolean value & an Offset value from Wall base level.

# 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
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
# for output result
wallSweeps = []
# wallsweeptype dictionary
wallSweepTypes = {"Sweep": WallSweepType.Sweep,
"Reveal": WallSweepType.Reveal}
# input1 walls
walls = IN[0]
# input3 string input
sweepOrReveal = IN[2]
# input4 boolean input default is horizontal(false)
vertical = IN[3] if IN[3] else False
# distance from wall base if horizontal, vertical wall start
# default is 1000mm
distance = IN[4]/304.8 if IN[4] else 1000/304.8
# check and make list
if not isinstance(walls,list):
walls = UnwrapElement([IN[0]])
else:
walls = UnwrapElement(IN[0])
# input2 wall sweep type input
wallSweepTypeId = UnwrapElement(IN[1]).Id
# wall sweep info class constructor
wallSweepInfo = WallSweepInfo(wallSweepTypes[sweepOrReveal],vertical)
# set distance
wallSweepInfo.Distance = distance
# start transaction
TransactionManager.Instance.EnsureInTransaction(doc)
# loop input walls
for wall in walls:
# create wall sweep by wall, wallsweepid and wallsweep info
wallsweep = WallSweep.Create(wall,wallSweepTypeId,wallSweepInfo)
# append result to output
wallSweeps.append(wallsweep)
# transaction done
TransactionManager.Instance.TransactionTaskDone()
# output result
OUT = wallSweeps

ElevationInRoom
Create ElevationViews by Room Element(s), a FloorPlan View & an Offset value (ViewCrop distance from Room Element(s)). Default Naming is ” RoomNumber_RoomName ” + “A, B, C, D” for each of the ElevationView from the ElevationMarker.
*Note : Although Rooms input can accept multiple Room Element(s), Views & Offset inputs is only accept a single input.
Code Sample on github repo.


ThreeDViewByRoom
Create 3DView(s) by Room Element(s), ViewName(s) & an Offset value (SectionBox Crop distance from Room Element(s)).
*Note : Although Rooms & Names inputs can accept multiple value input, Offset input is only accept a single input.

ThreeDViewByRoom – IronPython
# 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
# instantiate current document
doc = DocumentManager.Instance.CurrentDBDocument
rooms = IN[0]
names = IN[1]
offset = IN[2]/304.8 # mm to ft
results = []
# check list for rooms
if isinstance(IN[0], list):
rooms = UnwrapElement(IN[0])
else:
rooms = [UnwrapElement(IN[0])]
# check list for name
if isinstance(IN[1],list):
names = IN[1]
else:
names = [IN[1]]
def crop_box(bbox, offset):
# modify x,y,z point of bbox
minX = bbox.Min.X - offset
minY = bbox.Min.Y - offset
minZ = bbox.Min.Z - offset
maxX = bbox.Max.X + offset
maxY = bbox.Max.Y + offset
maxZ = bbox.Max.Z + offset
# create new bbox
newbox = BoundingBoxXYZ()
newbox.Min = XYZ(minX,minY, minZ)
newbox.Max = XYZ(maxX, maxY, maxZ)
return newbox
def createNewSectionBox(elem,viewName,offset):
# collect view type in document
viewTypes = FilteredElementCollector(doc).OfClass(ViewFamilyType)
#loop view types
for i in viewTypes:
# floor plane view type
if i.ViewFamily == ViewFamily.ThreeDimensional:
# get type id
viewTypeId = i.Id
# break the loop
break
# create new bbox by current bbox and offset
bbox = crop_box(elem.BoundingBox[doc.ActiveView],offset)
# create 3D View
view = View3D.CreateIsometric(doc, viewType.Id)
# set view name
view.Name = viewName
# set sectionbox to bbox
view.SetSectionBox(bbox)
# set cropbox active
view.CropBoxActive = True
# set cropbox visibility
view.CropBoxVisible = True
# set view scale
view.Scale = 50
# set detail level to fine
view.DetailLevel = ViewDetailLevel.Fine
# set detail style to shading
view.DisplayStyle = DisplayStyle.Shading
# return view
return view
# start Transaction
TransactionManager.Instance.EnsureInTransaction(doc)
# loop element and name together
for element,name in zip(rooms,names):
# call function with element, name and offset arguments
# and append it to results
results.append(createNewSectionBox(element,name,offset))
# end Transaction
TransactionManager.Instance.TransactionTaskDone()
# output results
OUT = results
ViewSelector
Select & Collect the return View(s).

TransferViewTemplateAndFilterUI
Transfer View Template(s) including the associate Filter Element(s) from a Linked Document to the current Document.


I’m a beginner for python and your scripts are easy and understandable…thanks
LikeLike
I glad, you find it useful.
LikeLike
that is what we after, simple script, thanks mate !
LikeLike
Thank you too, mate
LikeLike
Elevation by Room – brilliant, far easier than the one available on Dynamo forum!
It did work, however with a warning that Operation Failed. I couldn’t select a specific View Template.
Another thing is that I would love to assign a specific Elevation Type, and have no clue whatsoever how to do it via Dynamo.
Otherwise, brill!
LikeLike
Hello Marcin,
After you get all your desire elevation views, manually applying view template and changing elevation type shouldn’t be a problem.
LikeLike