Filtering For a Specific Line Style

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.

2 Likes