Modification de la phase de démolition

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.

Merci de votre aide
Pauline

Personne n’as d’idée pour ce sujet ??

Bonjour Pauline,
J’utilise le node Element.SetPhase du package Orchid afin de modifier les phases des éléments.
Voici un exemple :

1 « J'aime »

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.

2 « J'aime »

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 :

1 « J'aime »

Edit : J’ai trouver la solution sur un autre forum, ici Set phase demolished to None - #3 by Konrad_K_Sobon - Revit - Dynamo avec un code python.

# 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
1 « J'aime »

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 :wink: 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 »
image

1 « J'aime »