Here is the doc-printing.py script, place it into a hooks folder inside your .extension folder.
__author__ = 'Stewart Cartmell'
from pyrevit import revit
from pyrevit import DB
from pyrevit import EXEC_PARAMS
# shortcut for DB.BuiltInParameter
BIP = DB.BuiltInParameter
# shortcut for DB.BuiltInCategory
BIC = DB.BuiltInCategory
# current document from event handler
doc = EXEC_PARAMS.event_args.Document
# attempt to get all elements with a type name that contains "NPLT"
param_id = DB.ElementId(BIP.ALL_MODEL_TYPE_NAME)
param_provider = DB.ParameterValueProvider(param_id)
param_contains = DB.FilterStringContains()
param_rule = DB.FilterStringRule(param_provider,param_contains,'NPLT',False)
param_filter = DB.ElementParameterFilter(param_rule)
np_element_ids = DB.FilteredElementCollector(doc).WherePasses(param_filter).ToElementIds()
print('Num Elements Collected: {}'.format(len(np_element_ids)))
param_id = DB.ElementId(BIP.BUILDING_CURVE_GSTYLE)
param_provider = DB.ParameterValueProvider(param_id)
param_contains = DB.FilterStringContains()
param_rule = DB.FilterStringRule(param_provider,param_contains,'NPLT',False)
param_filter = DB.ElementParameterFilter(param_rule)
line_element_ids = DB.FilteredElementCollector(doc).WherePasses(param_filter).ToElementIds()
print('Num Lines Collected: {}'.format(len(line_element_ids)))
# get view_ids of all views (including views within sheets) of printed pages
printed_view_ids = EXEC_PARAMS.event_args.GetViewElementIds()
printed_views = []
for p in printed_view_ids:
pview = doc.GetElement(p)
printed_views.append(pview)
# hide elements and subcategories in all printed views
with revit.Transaction("Hide NPLT Elements",doc):
for s in printed_views:
s.HideElements(np_element_ids)
s.HideElements(line_element_ids)
#for c in np_subcategories:
# s.SetCategoryHidden(c,True)
#use try-except because the sheet might not have any additional viewports
try:
vports = s.GetAllViewports()
for vportid in vports:
# get the view id associated with the current viewport
view_id = doc.GetElement(vportid).ViewId
# get the actual view element in order to hide/unhide things inside that view
view = doc.GetElement(view_id)
view.HideElements(np_element_ids)
view.HideElements(line_element_ids)
#for sc in np_subcategories:
# view.SetCategoryHidden(sc,True)
except:
pass
And here is the doc-printed.py script. Note there is an issue when combining pages into a single pdf so I don’t rely on the EXEC_PARAMS views printed list.
__author__ = 'Stewart Cartmell'
from pyrevit import revit
from pyrevit import DB
from pyrevit import EXEC_PARAMS
# shortcut for DB.BuiltInParameter
BIP = DB.BuiltInParameter
# shortcut for DB.BuiltInCategory
BIC = DB.BuiltInCategory
# importing doc-printing to gain access to it's sheet list
# current document from event handler
doc = EXEC_PARAMS.event_args.Document
#Note! Using EXEC_PARAMS to get printed views does not work
# for views that are combined into a single pdf when printing
# so we'll collect all sheets and unhide elements there:
#Get all sheets in project, including placeholder sheets
sheetsUnfiltered = DB.FilteredElementCollector(doc) \
.OfCategory(DB.BuiltInCategory.OST_Sheets) \
.WhereElementIsNotElementType() \
.ToElements()
#Create empty list to hold all sheets minus placeholder sheets
sheetlist = []
#Filter out placeholder sheets
for s in sheetsUnfiltered:
if not s.IsPlaceholder:
sheetlist.append(s)
# attempt to get all elements with a type name that contains "NPLT"
param_id = DB.ElementId(BIP.ALL_MODEL_TYPE_NAME)
param_provider = DB.ParameterValueProvider(param_id)
param_contains = DB.FilterStringContains()
param_rule = DB.FilterStringRule(param_provider,param_contains,'NPLT',False)
param_filter = DB.ElementParameterFilter(param_rule)
np_element_ids = DB.FilteredElementCollector(doc).WherePasses(param_filter).ToElementIds()
print('Num Elements Collected: {}'.format(len(np_element_ids)))
param_id = DB.ElementId(BIP.BUILDING_CURVE_GSTYLE)
param_provider = DB.ParameterValueProvider(param_id)
param_contains = DB.FilterStringContains()
param_rule = DB.FilterStringRule(param_provider,param_contains,'NPLT',False)
param_filter = DB.ElementParameterFilter(param_rule)
line_element_ids = DB.FilteredElementCollector(doc).WherePasses(param_filter).ToElementIds()
print('Num Lines Collected: {}'.format(len(line_element_ids)))
# unhide elements
with revit.Transaction("Unhide NPLT Elements",doc):
for s in sheetlist:
s.UnhideElements(np_element_ids)
s.UnhideElements(line_element_ids)
try:
vports = s.GetAllViewports()
for vportid in vports:
# get the view id associated with the current viewport
view_id = doc.GetElement(vportid).ViewId
# get the actual view element in order to hide/unhide things inside that view
view = doc.GetElement(view_id)
view.UnhideElements(np_element_ids)
view.UnhideElements(line_element_ids)
except:
pass
Always happy to receive insights on how I can optimize.