Création de nouvelle transaction refusée

Bonjour à tous :grinning:

Ce message est malheureusement bien connu :unamused:
Starting a new transaction is not permitted. It could be because another transaction already started and has not been completed yet, or the document is in a state in which it cannot start a new transaction (e.g. during failure handling or a read-only mode, which could be either permanent or temporary).

Dans mon cas, le script est assez simple, je décale tous les types d’une famille d’une certaine hauteur.

. Je suis obligé de déconnecter les liaisons entre noeud 1 et 2 puis 2 et 3 pour que le script fonctionne. Je le lance assez souvent donc c’est pénible. Avez-vous une idée du problème ? Je commite bien la transaction donc je ne comprends pas où est l’interaction.

import clr

clr.AddReference('ProtoGeometry')
clr.AddReference('DSCoreNodes')
clr.AddReference('RevitAPI')

import System
clr.AddReference('System.Core')

from DSCore import *
from Autodesk.DesignScript.Geometry import *
from Autodesk.Revit.DB import*

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc=DocumentManager.Instance.CurrentDBDocument
bulles = UnwrapElement(IN[0])
niveaux=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType().ToElements()
cvs=1/0.3048 #métrique/impérial
bon_niveau=0
nombre_bulles_traitees=0

t=Transaction(doc,'Correction niveau bulle')
t.Start()

for bulle in bulles:
	delta=10000
	for niveau in niveaux:
		if niveau.Elevation!=0:
			difference_niveau_bulle=bulle.LookupParameter("Décalage par rapport à l'hôte").AsDouble()/cvs-niveau.Elevation/cvs
			if difference_niveau_bulle<delta and difference_niveau_bulle>=0:
				delta=difference_niveau_bulle
				bon_niveau=niveau.Elevation
			
	#on a trouvé le niveau le plus proche
	if bon_niveau!= 0:
		bulle.LookupParameter("Décalage par rapport à l'hôte").Set(bon_niveau+1.2*cvs)
		nombre_bulles_traitees+=1
	
t.Commit()

OUT=str(nombre_bulles_traitees)+" bulles modifiées sur "+str(len(bulles))

Auriez-vous une idée ?

Salut,
les nœuds Dynamo sont encapsulés dans un groupe de transaction (API Dynamo ‹ RevitServices ›), si tu veux utiliser une transaction de l’API Revit il est nécessaire de mettre fin a cette transaction de groupe au préalable.

TransactionManager.Instance.ForceCloseTransaction()
t=Transaction(doc,'Correction niveau bulle')
t.Start()
# reste du code
t.Commit()

ou alors tu utilises les Transactions d’instances de l’API Dynamo (instances de la transaction de groupe)

TransactionManager.Instance.EnsureInTransaction(doc)
# reste du code
TransactionManager.Instance.TransactionTaskDone()
3 J'aime

Merci Cyril, je pensais que le fait de comit fermait la transaction. Je vais pouvoir corriger tous mes scripts :slight_smile:

1 J'aime