Hi !
I made my first script in Python.
I duplicate a 3D view, and apply some filters according to an iteration.
It almost work, but it still have two things to fix :
- I wan’t to make a filter “not equals of true”. How to make it ?
- The program works : it duplicates “x” views, create “x” filters and apply them to the right view. But filters aren’t applied : I have to get on each filter to validate it before the view applied the modification. Does i forgot a line “valid filter” or someone like this ?
This is my Python script :
# Charger les bibliothèques DesignScript et Standard Python
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# Charger l'API Revit
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
import Autodesk
clr.AddReference('RevitNodes')
from Revit.Elements import *
# Charger RevitServices (DocumentManager pour l'acces document actuel / TransactionManager pour la modification)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# Importer les fonctions natives .NET
from System.Collections.Generic import List
# Les entrées effectuées dans ce noeud sont stockées sous forme de liste dans les variables IN.
dataEnteringNode = IN
# Convertir le parametre doc récupéré comme entier, en ElementId et obtenir le ParamererElement correspondant au document courant
doc = DocumentManager.Instance.CurrentDBDocument
valuesList = IN[0]
paramID_Debut = ElementId(IN[1])
paramID_Fin = ElementId(IN[2])
paramID_Chantier = ElementId(IN[3])
filterNameList = IN[4]
#Unwrap permet d'accéder à la liste des éléments de la vue
myView = UnwrapElement(IN[5])
pattern = IN[6]
#Type de duplication de la vue : Avec les détails
optionDuplicate = Autodesk.Revit.DB.ViewDuplicateOption.WithDetailing
red = Color(255,0,0)
#Obtenir la définition du paramètre. Récupérer le BindingMap qui relie les paramètres à leurs définitions, et récupérer la liaison du paramètre fourni.
paramElem = doc.GetElement(paramID_Debut)
definition = paramElem.GetDefinition()
binding_map = doc.ParameterBindings
binding = binding_map.Item[definition]
#Récupérer les catégories du paramètres, puisles ID
category_set = binding.Categories.GetEnumerator()
cat_ids = [cat.Id for cat in category_set]
#Convertir la liste en liste .NET pour la suite
cat_ids_list = List[ElementId](cat_ids)
#Retirer les catégories non incluables dans les filtres
cat_ids_valid = ParameterFilterUtilities.RemoveUnfilterableCategories(cat_ids_list)
#Creation des valeurs de parametres
pStart = ParameterValueProvider (paramID_Debut)
pEnd = ParameterValueProvider (paramID_Fin)
pChantier = ParameterValueProvider (paramID_Chantier)
#Récupération des filtres déjà existants dans le projet
FiltersList = list(FilteredElementCollector(doc).OfClass(ParameterFilterElement).ToElements())
FiltersName = [i.Name for i in FiltersList]
mesFiltres = []
#Ouverture des modifications dans le fichier
TransactionManager.Instance.EnsureInTransaction(doc)
#Creation des filtres dans Revit suivant le nombre de phases
for myValue in valuesList :
#Récupération des noms de filtres à créer
phaseEnCours = filterNameList[0]+str(myValue)
postPhase = filterNameList[1]+str(myValue)
#Duplication de la vue de base
newViewID = View.Duplicate(myView, optionDuplicate)
newView = doc.GetElement(newViewID)
try :
newView.Name = myView.Name+"_"+str(myValue)
mesFiltres.Add("Vue créée : "+newView.Name)
except :
mesFiltres.Add("Vue non renommée : "+newView.Name)
#Création du filtre "en cours" s'il n'est pas déjà existant
if phaseEnCours not in FiltersName :
#Creation des conditions de filtres
xStart_enCours = FilterElementIdRule (pStart, FilterNumericLessOrEqual(), ElementId(myValue))
xEnd_enCours = FilterElementIdRule (pEnd, FilterNumericGreaterOrEqual(), ElementId(myValue))
#xChantier ne doit pas etre egal a vrai
#A CHANGER
xChantier = FilterElementIdRule (pChantier, FilterNumericEquals(), ElementId(1))
#Creation du filtre de phase en cours
xrule_enCours = []
xrule_enCours.Add(ElementParameterFilter(xStart_enCours))
xrule_enCours.Add(ElementParameterFilter(xEnd_enCours))
xrule_enCours.Add(ElementParameterFilter(xChantier))
#Convertion en liste .NET de ElementFilter
ruleList_enCours = List[ElementFilter](xrule_enCours)
#Application de la règle AND / OR pour le cumul des filtres
myRule_enCours = LogicalAndFilter(ruleList_enCours)
#Création du filtre dans Revit
filter_current = ParameterFilterElement.Create(doc, phaseEnCours, cat_ids_valid, myRule_enCours)
#Sinon récupération du filtre déjà existant
else :
for f in FiltersList:
if f.Name == phaseEnCours :
filter_current = f
#Ajout du filtre à la vue
newView.AddFilter(filter_current.Id)
#Application de remplacement de vue sur les filtres
over = newView.GetFilterOverrides(filter_current.Id)
#Hachurage de l'élément coupé
over.SetCutForegroundPatternId(pattern)
over.SetCutForegroundPatternColor(red)
#Hachurage de l'élément vu
over.SetSurfaceForegroundPatternId(pattern)
over.SetSurfaceForegroundPatternColor(red)
newView.SetFilterOverrides(filter_current.Id,over)
mesFiltres.Add(phaseEnCours)
#Création du filtre "en cours" s'il n'est pas déjà existant
if postPhase not in FiltersName :
#Creation des conditions de filtres
xStart_Post = FilterElementIdRule (pStart, FilterNumericGreater(), ElementId(myValue))
xEnd_Post = FilterElementIdRule (pEnd, FilterNumericLess(), ElementId(myValue))
xChantier = FilterElementIdRule (pChantier, FilterNumericEquals(), ElementId(1))
#Creation du filtre élément à masquer
xrule_Post = []
xrule_Post.Add(ElementParameterFilter(xEnd_Post))
xrule_Post.Add(ElementParameterFilter(xChantier))
#Convertion en liste .NET de ElementFilter
ruleList_Post = List[ElementFilter](xrule_Post)
#Application de la règle AND / OR pour le cumul des filtres
myRule_Post = LogicalAndFilter(ruleList_Post)
#Creation du filtre post chantier à masquer et à ajouter au précédent
xrule_Post2 = []
xrule_Post2.Add(ElementParameterFilter(xStart_Post))
xrule_Post2.Add(myRule_Post)
#Convertion en liste .NET de ElementFilter
ruleList_Post2 = List[ElementFilter](xrule_Post2)
#Application de la règle AND / OR pour le cumul des filtres
myRule_Post2 = LogicalOrFilter(ruleList_Post2)
#Création du filtre dans Revit
filter_post = ParameterFilterElement.Create(doc, postPhase, cat_ids_valid, myRule_Post2)
else :
for f in FiltersList:
if f.Name == postPhase :
filter_post = f
#Ajout du filtre à la vue
newView.AddFilter(filter_post.Id)
newView.SetFilterVisibility(filter_post.Id, 0)
mesFiltres.Add(postPhase)
#Fin des modifications dans le fichier
TransactionManager.Instance.TransactionTaskDone()
# Affectez la sortie à la variable OUT.
OUT = mesFiltres
I want to apologize for my bad english, that’s not my mother langage and i don’t practice a lot. Thank you for your solicitude.
Mélanie