17 avr. 2023

[Dynamo += Python] Purge des paramètres de Projet

 



Trop de paramètres de Projet non utilisés ?

#PurgeUnsed #RevitAPI #DynamoBIM #Parameters
if this article is not in your language, use the Google Translate widget ⬈ (bottom of page for Mobile version )


Il arrive parfois que l'on se retrouve avec une quantité de paramètres de projet non utilisé, mais comment savoir lesquels ?

Voici un exemple de solution avec Python (uniquement pour purger les paramètres d'instance), en utilisant la propriété HasValue

Le code Python (fonctionne avec Ironpython2 et Ironpython3)

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 = 'Type de Parametres non utilise a Supprimer'
dialog.FooterText = "Note : Seul les paramètres d'instances seront traités"
# Add Command Link
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1,
                      'Supprimer tous les Paramètres',
                      'Suppression de tous les Paramètres non utilisés')
dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2,
                      'Supprimer seulement les Paramètres Partagés',
                      'Suppression des Parametres Partagés non utilisés (Seulement)')

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


0 commentaires:

Enregistrer un commentaire