Code Python création de filtres

Bonjour à tous,

J’ai créer un script dynamo afin de créer plusieurs nomenclatures d’éléments. Le nombre de nomenclatures créer dépend d’un nombre correspondant à un cyclage de voiles (dans mon exemple il y a 12 jours de cyclage)

Pour créer ce script, dans un premier temps (groupe en gris), je créer les noms de nomenclatures.
Ensuite, je créer la nomenclature (groupe rose).
Je lui ajoute des champs de nomenclatures (groupe orange).
Ensuite, je souhaite filtrer mes nomenclature en fonction du paramètre « Jour de coulage » pour que dans chaque nomenclature j’obtient uniquement les voiles réalisé le même jour:

exemple : Quantitatif Voiles Jour 01 == uniquement voiles avec le paramètre Jour de coulage = 01
Quantitatif Voiles Jour 02 == uniquement voiles avec le paramètre Jour de coulage = 02

J’aimerais donc obtenir ce résultat :

Or j’obtient ce résultat :


soit une nomenclature vide…

Ceci est mon script :

Après avoir essayer et chercher plusieurs solutions en vain, j’ai trouver le code python suivant permettant de créer et d’appliquer des filtres de nomenclatures à une nomenclature :

import clr
clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript.Geometry import *
# Dynamo Example
import clr
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
# RevitServices
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# doc and uiapp

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

def tolist(obj) : 
	if isinstance(obj, list):
		return UnwrapElement(obj)
	else : 
		return [UnwrapElement(obj)]
		
Views = tolist(IN[0])
FieldId = tolist(IN[1])
Level = IN[2]

Filters = list()
for Id in FieldId:
	F = ScheduleFilter(ScheduleFieldId(Id),ScheduleFilterType.Equal,Level)
	Filters.append(F)

TransactionManager.Instance.EnsureInTransaction(doc)

for View,Filter in zip(Views,Filters):
	(UnwrapElement(View).Definition).InsertFilter(Filter,0)

TransactionManager.Instance.TransactionTaskDone()

OUT = IN[0]

Avec ce code python, lorsqu’en entrée IN[2] je met une valeur (ex: « 01 ») j’obtient bien des éléments dans ma nomenclature, elle ne reste pas vide.

Seule problème, j’aimerais mettre en entrée une liste de valeur (ex: [« 01 »,« 02 »,« 03 »,« 04 »]; ) et un de mes filtres consistent à filtrer selon le niveau de base, l’entrée est donc de type Level je dois donc modifier le script pour qu’il accepte en entré ces type de paramètre mais je ne sais comment faire.
Le code que je cherche à modifier est celui en jaune qui m’indique comme erreur :

Pour le premier :
Avertissement:IronPythonEvaluator.EvaluateIronPythonScript l’opération a échoué.
Traceback (most recent call last):
File « string », line 33, in module
TypeError: expected ElementId, got list

Pour le deuxième :
Avertissement:IronPythonEvaluator.EvaluateIronPythonScript l’opération a échoué.
Traceback (most recent call last):
** File « string », line 33, in module**
TypeError: expected ElementId, got Level

Merci de votre aide

Bien cordialement
Pauline

PS: J’utilise Revit 2022 et dynamo 2.10 et la catégorie des éléments que je souhaite intégrer dans ma nomenclature sont de type Murs.

test_Création quantitatif voiles jour02.dyn (96,0 Ko)

Bonjour,
voici un exemple

import clr
clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript.Geometry import *
# Dynamo Example
import clr
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
# RevitServices
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# doc and uiapp

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

def tolist(obj) : 
	if isinstance(obj, list):
		return UnwrapElement(obj)
	else : 
		return [UnwrapElement(obj)]
		
Views = tolist(IN[0])
FieldId = tolist(IN[1])
Values = tolist(IN[2])

TransactionManager.Instance.EnsureInTransaction(doc)

for view in Views:
	scheduleDef = view.Definition
	Filters = list()
	for Id, Value in zip(FieldId, Values):
		# print the name of SchedulableField
		fieldIdA = ScheduleFieldId(Id)
		fieldA = scheduleDef.GetField(fieldIdA)
		print("Nom du Champs correspondant à l'Id '{}' -> '{}'".format(Id, fieldA.GetName()))
		# end print
		f = ScheduleFilter(ScheduleFieldId(Id),ScheduleFilterType.Equal,Value.Id)
		scheduleDef.InsertFilter(f,0)

TransactionManager.Instance.TransactionTaskDone()

OUT = IN[0]

Mais… obtenir un champ à partir d’un Id que l’on ne connait pas n’est pas une bonne idée.

3 « J'aime »