#20.11.2023
import clr
import sys
# Import DocumentManager and TransactionManager
#https://forum.dynamobim.com/t/zombie-parameters-linger-after-delete-from-project-parameters/87934/4
#Jacob Small 2023-03-28
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# Import relevant sections of the RevitAPI
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import Document, SharedParameterElement, FilteredElementCollector
doc = DocumentManager.Instance.CurrentDBDocument #the active document
TransactionManager.Instance.EnsureInTransaction(doc)# Start Transaction
FilterPrefix=IN[0]
FilterPrefix_ForcePurge=IN[1]
bindings = doc.ParameterBindings #get all the parameter bindings in the document
sharedParameters = FilteredElementCollector( doc ).OfClass(SharedParameterElement).ToElements() #get all shared parameters in the document
results = [] #an empty list for our results
for sp in sharedParameters: #for eveyr shared parameter perfor the following
spDef = sp.GetDefinition() #get the definition of the shared parameter
test = bindings.Contains(spDef) #test if the bindings map contains the defintion
name = sp.Name #get the name of the shared paramter
for Fpre in FilterPrefix: #For each prefix matching in list
ParamDelete = False
if name[:len(Fpre)]==Fpre: #Filter out prefixes
if not test: #if the definition was not in the bindings map
ParamDelete = True
results.append("--Deleted : {0}".format(name)) #let us know the parameter has been deleted
else:
results.append("___In Use : {0}".format(name)) #let us know the parameter is in use
if len(FilterPrefix_ForcePurge) > 0 : ##items in list
for FpreForce in FilterPrefix_ForcePurge :
if FpreForce>"" and name[:len(FpreForce)]==FpreForce:
ParamDelete = True
results.append("-DelForce : {0}".format(name)) #let us know the parameter has been deleted
if ParamDelete: ##Delete Parameters
ParamDelete = False
##doc.Delete(sp.Id) #delete the shared parameter
TransactionManager.Instance.TransactionTaskDone()# End Transaction
OUT = results #return the results to Dyanmo environment
import sys
import clr
import System
from System.Collections.Generic import List
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
dialog = TaskDialog("Purge Project Parameters")
# Properties
dialog.MainInstruction = 'Unused Parameter Type to Delete'
dialog.FooterText = "Note: Only instance parameters will be processed"
# Add Command Link
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1,
'Delete all Parameters',
'Deleting all unused Parameters')
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2,
'Delete only Shared Parameters',
'Deleting Unused Shared Parameters (Only)')
diag = dialog.Show()
# Force close any open transactions to ensure a clean slate
TransactionManager.Instance.ForceCloseTransaction()
# Get the parameter bindings of the document
bindingMap = doc.ParameterBindings
iterator = doc.ParameterBindings.ForwardIterator()
def_toRemove = []
result = []
while iterator.MoveNext():
definition = iterator.Key
binding = iterator.Current
if definition.IsValidObject:
if isinstance(binding, InstanceBinding):
categories = binding.Categories
# Create a filter to select elements in the categories of the binding
filterCats = ElementMulticategoryFilter(List[ElementId]([cat.Id for cat in categories]))
# Create a predicate to filter elements that have a value for the current parameter definition
filterByHasValue = System.Predicate[System.Object](lambda x : x.get_Parameter(definition) is not None and x.get_Parameter(definition).HasValue)
# Find all elements that have a null value for the current parameter definition
instanceNullValues = List[DB.Element](FilteredElementCollector(doc).WherePasses(filterCats).WhereElementIsNotElementType().ToElements()).FindAll(filterByHasValue)
if len(instanceNullValues) == 0:
def_toRemove.append(definition)
# Start a transaction to remove the parameter definitions
t = Transaction(doc, "Remove Parameters")
t.Start()
for def_ in def_toRemove:
#
if hasattr(def_, "Id"):
filterbyId = System.Predicate[System.Object](lambda x : x.Id == def_.Id)
# for all Parameters
if diag == TaskDialogResult.CommandLink1:
param_elem = List[DB.Element](FilteredElementCollector(doc).OfClass(ParameterElement).WhereElementIsNotElementType().ToElements()).Find(filterbyId)
# for only SharedParameters
elif diag == TaskDialogResult.CommandLink2:
param_elem = List[DB.Element](FilteredElementCollector(doc).OfClass(SharedParameterElement).WhereElementIsNotElementType().ToElements()).Find(filterbyId)
else:
param_elem = None
#
if param_elem is not None:
doc.Delete(param_elem.Id)
result.append("Project Parameter '{}' removed".format(def_.Name))
t.Commit()
t.Dispose()
OUT = result