Articles liés à l’interopérabilité Dynamo avec Revit (éléments, plugins ou API).
Bonjour à tous,
J’aurais besoin d’aide pour un script qui me permet de modifier la phase de construction de tous les éléments murs, sols, ossature et poteaux porteurs de la maquette en Existante et la phase de démolition en Aucun(e).
C’est sur la phase de démolition que je coince, car je n’arrive pas à l’appliquer.
L’erreur du nœud Element.SetParameterByName en bas m’indique : Avertissement:Element.SetParameterByName l’opération a échoué. Le type de stockage du paramètre n’est pas une chaîne.
Bonjour,
Moi j’utiliserai le nœud « Select Phase », au lieu de la chaine de caractère en entrée, quand tu veux affecter une phase de démolition via le noeud Element.SetParameterByName. Quand tu veux affecter « Aucun(e) », il y a le noeud "Element.SetParametertoNone de Springs.
Le message d’erreur s’affiche car le paramètre Phase n’accepte qu’un élément Phase (pas le nom String). Problème de types de données.
Tu peux quand meme utiliser le nœud Phase.ByName pour trouver l’élément de phase comme ci-dessous :
# Copyright(c) 2016, Konrad K Sobon
# @arch_laboratory, http://archi-lab.net
# Import Element wrapper extension methods
import clr
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
import sys
pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib'
sys.path.append(pyt_path)
#The inputs to this node will be stored as a list in the IN variable.
dataEnteringNode = IN
def ProcessList(_func, _list):
return map( lambda x: ProcessList(_func, x) if type(x)==list else _func(x), _list )
def Unwrap(item):
return UnwrapElement(item)
def SetPhaseToNone(e):
e.get_Parameter(BuiltInParameter.PHASE_DEMOLISHED).Set(ElementId.InvalidElementId)
return e
if isinstance(IN[0], list):
elements = ProcessList(Unwrap, IN[0])
else:
elements = [Unwrap(IN[0])]
try:
errorReport = None
TransactionManager.Instance.EnsureInTransaction(doc)
output = ProcessList(SetPhaseToNone, elements)
TransactionManager.Instance.TransactionTaskDone()
except:
# if error accurs anywhere in the process catch it
import traceback
errorReport = traceback.format_exc()
#Assign your output to the OUT variable
if errorReport == None:
OUT = output
else:
OUT = errorReport
Le code block + le noeud « Phase.ByName » équivaut au nœud « Select Phase », sauf que c’est vrai que ce genre de nœud à choix multiple à tendance à modifier le choix qui est fait quand on réouvre les scripts, donc la solution de @ahalim est plus safe Moi je n’utilise plus le noeud « Categories » pour choisir une catégorie par exemple, ça saute souvent, j’utilise un code block + « Category.ByName »