Delete unused Parameters, how

Hi @Draxl_Andreas

you can try this version

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

my related article