Trop de paramètres de Projet non utilisés ?
#PurgeUnsed #RevitAPI #DynamoBIM #Parameters
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é
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