TransactionTaskDone() doesn't work

Hello,

Can someone help me with this issue?
I have a script and in that script I close my transaction.
In a next python script I open de transaction again and get a parameter that I set in the first script.
But he don’t use the right values, is there something wrong with my transaction?

When I use the dynamo node Tranasction.End the script works fine… but I try to understand what I do wrong.

Input = grouped list:

import clr #.NET Laden
import sys #sys is de fundamentele Python bibliotheek
#de standaard IronPython-bibliotheken
#sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib') #Imports the
#standaard IronPython-bibliotheken, die alles dekken, van servers en
#encryptie tot reguliere expressies.
import System #The System namespace in de hoofdmap .NET
from System import Array #.NET class voor het verwerken van array-informatie
import System.Collections.Generic as MGen #Module kan nu benaderd worden met MGen.xxxx
#from System.Collections.Generic import * #Hiermee kunt u generieke afhandelen. Revit's API
#soms wil hard-getypte 'generieke' lijsten, genaamd ILists. Als je niet nodig hebt
#deze kunt u deze regel verwijderen.
clr.AddReference('ProtoGeometry')  #Een Dynamo-bibliotheek voor zijn proxygeometrie
#classes. Je hebt dit alleen nodig als je interactie hebt met geometrie.
import Autodesk.DesignScript.Geometry as AGeo #Module kan worden opgeroepen a=met AGeo.xxxx
#from Autodesk.DesignScript.Geometry import * #Laadt alles in Dynamo's
#geometriebibliotheek
clr.AddReference("RevitNodes") #Dynamo's nodes voor Revit
import Revit #Laad in de Revit-namespaces in RevitNodes
clr.ImportExtensions(Revit.Elements) #Meer laden van Dynamo's Revit-bibliotheken
clr.ImportExtensions(Revit.GeometryConversion) #Meer laden van Dynamo's
#Revit-bibliotheken. Je hebt dit alleen nodig als je interactie hebt met geometrie.
clr.AddReference("RevitServices") #Dynamo's classes voor het omgaan met Revit-documenten
import RevitServices 
from RevitServices.Persistence import DocumentManager #Een interne Dynamo class
#dat het document bijhoudt waaraan Dynamo momenteel is gekoppeld
from RevitServices.Transactions import TransactionManager #Een Dynamo class voor
#transacties openen en sluiten om de database van het Revit-document te wijzigen

clr.AddReference("RevitAPI") #Verwijzing naar Revit's API DLL's toevoegen
clr.AddReference("RevitAPIUI") #Verwijzing naar Revit's APIUI DLL's toevoegen

import Autodesk #Loads the Autodesk namespace
import Autodesk.Revit.DB as RDB #Loading Revit's API UI classes module kan nu worden aangeroepen met RDB.xxxx
#from Autodesk.Revit.DB import * #Loading Revit's API UI classes
import Autodesk.Revit.UI as RUI # Loading Revit's API UI classes als RUI.xxxx
#from Autodesk.Revit.UI import * #Loading Revit's API UI classes

doc = DocumentManager.Instance.CurrentDBDocument #Dit is het actieve Revit document
uiapp = DocumentManager.Instance.CurrentUIApplication #Een handle instellen voor het actieve Revit UI-document
app = uiapp.Application  #Een handle instellen op de momenteel geopende instantie van de Revit-toepassing
uidoc = uiapp.ActiveUIDocument #Een handle instellen op de momenteel geopende instantie van de Revit UI-toepassing
	
def GetName(ele):
	elename = None
 	try:
 		elename = ele.Name
 	except:
 		elename = RDB.Element.Name.__get__(ele)
 	return elename

# einde code omrekenen revit feet naar huidig ingestelde document units
# Hieronder kan je dan gaan programmeren
# Gebruik boiler template

elementen = UnwrapElement(IN[0])

#Pipe fittingen ophalen
pipe_fitting = []
for pf in elementen:
	for p in pf:
		pf_name = GetName(p)
		if pf_name.Contains("Bochtstraal"):
			pipe_fitting.append(p)
		
#geconnecte pipe ophalen
refs = [] 

for x in pipe_fitting:
	connset = x.MEPModel.ConnectorManager.Connectors
	conn_pipes = []
	for c in connset:
		if c.IsConnected:
			for lc in c.AllRefs:
				conn_pipes.append(lc.Owner)
	refs.append(conn_pipes)

#section van geconnecte buis ophalen
p_section = []
for r in refs:
	p_section.append([]) #lege lijst maken voor behoudt structuur
	for i in r:
		section = i.get_Parameter(RDB.BuiltInParameter.RBS_SECTION).AsValueString()
		p_section[-1].append(section)	#-1 zorgt ervoor dat lijst in structuur blijft.	
		
#Unique items eruit halen

listOfList = [p_section]
ukeys1 = [item[0] for item in p_section]
ukeys2 = []
for u in ukeys1:
	ukeys2.append(int(u))
	
#Start transaction
TransactionManager.Instance.EnsureInTransaction(doc)

#toevoegen van sections aan bochten
uk = 0
for pf in pipe_fitting:
	pf.LookupParameter("Section").Set(ukeys2[uk])
	uk += 1 	

TransactionManager.Instance.TransactionTaskDone()

OUT = elementen

Try either:

  1. doc.Regenerate() just before you close your transaction.
  2. Pass your elements output by your first script as an input to your second script.

Thanks! That works!
Just out of curiosity, why is the transaction manager not enough?

Depends on the call you make to the Revit the API - you can most likely discover the specifics of your problem if you pull apart your scripts and run tests.

with that said, some Revit API calls specifically require the developer to call doc.Regenerate() to force the database to update so subsequent calls on the same object points to the same memory address. There are also some nuances with the way Dynamo has to handle its own transactions to interact with Revit and this can also have unintentional side-effects. For example, some methods cannot be called while there is an open transaction; instead, the Dynamo developer will need to call Dynamo’s ForceCloseTransaction() beforehand.

5 Likes

Thank you for the explanation :slight_smile: