(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.


Continue to PART – B
Categories: Revit Revit-Dynamo
min.naung
Founder and Developer @twentytwo.space
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