I’ve made a python script to create a view set from a selected revision.
I get this error to close the transaction. Any tips on how to do that?

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference("System.Drawing")
clr.AddReference("System.Windows.Forms")
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
class RevisionSelectionForm(Form):
def __init__(self, RevNames):
self.revname = RevNames
self.Text = 'Revision Print Set'
self.label = System.Windows.Forms.Label()
self.label.Text = "Select Revision"
self.label.Location = Point(1, 50)
self.label.Height = 30
self.label.Width = 200
self.count = 0
self.cb = System.Windows.Forms.ComboBox()
self.cb.Width = 200
self.cb.Height = 20
self.cb.Location = Point(15,20)
self.cb.DataSource = self.revname
self.button = System.Windows.Forms.Button()
self.button.Text = 'Select Revision'
self.button.Location = Point(15,60)
self.button.Width = self.cb.Width
self.button.Height = 25
self.button.Click += self.button_click
self.Width = self.cb.Width + 50
self.Height = 100
self.Controls.Add(self.cb)
self.Controls.Add(self.button)
def button_click(self, sender, event):
self.selected = self.cb.SelectedValue
self.Close()
def filter_list(revisionlist, search_str):
passed = None
for element in revisionlist:
name = element.Name
if search_str == name:
passed = element
return passed
sheets = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).WhereElementIsNotElementType().ToElements()
revisionlist = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Revisions).WhereElementIsNotElementType().ToElements()
RevNames = [x.Name for x in revisionlist]
form = RevisionSelectionForm(RevNames)
form.ShowDialog()
SelectedRev = form.selected
SelRevEle = filter_list(revisionlist, SelectedRev)
filterview = FilteredElementCollector(doc).OfClass(ViewSheetSet).GetElementIterator()
filterview.Reset()
viewexists = None
sheetToPrint = []
for i in sheets:
revIds = i.GetAllRevisionIds()
if SelRevEle.Id in revIds:
sheetToPrint.append(i)
# remove viewset if already exists
for f in filterview:
if f.Name == SelectedRev:
viewexists = f
break
if viewexists != None:
TransactionManager.Instance.EnsureInTransaction(doc)
doc.Delete(viewexists.Id)
TransactionManager.Instance.TransactionTaskDone()
viewexists = None
# create viewset
if viewexists == None:
viewSet = ViewSet()
for v in sheetToPrint: (viewSet.Insert(v))
printManager = doc.PrintManager
printManager.PrintRange = PrintRange.Select
viewSS = printManager.ViewSheetSetting
try:
TransactionManager.Instance.EnsureInTransaction(doc)
viewSS.CurrentViewSheetSet.Views = viewSet
viewSS.SaveAs(SelectedRev)
TransactionManager.Instance.TransactionTaskDone()
msg = "Sheet set '" + SelectedRev + "' created."
except:
msg = "The ViewSet could not be created"
#Assign your output to the OUT variable.
OUT = msg
I got it to work. see code below.
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
clr.AddReference("System.Drawing")
clr.AddReference("System.Windows.Forms")
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
class RevisionSelectionForm(Form):
def __init__(self, RevNames):
self.revname = RevNames
self.Text = 'Revision Print Set'
self.label = System.Windows.Forms.Label()
self.label.Text = "Select Revision"
self.label.Location = Point(1, 50)
self.label.Height = 30
self.label.Width = 200
self.count = 0
self.cb = System.Windows.Forms.ComboBox()
self.cb.Width = 200
self.cb.Height = 20
self.cb.Location = Point(15,20)
self.cb.DataSource = self.revname
self.button = System.Windows.Forms.Button()
self.button.Text = 'Select Revision'
self.button.Location = Point(15,60)
self.button.Width = self.cb.Width
self.button.Height = 25
self.button.Click += self.button_click
self.Width = self.cb.Width + 50
self.Height = 150
self.Controls.Add(self.cb)
self.Controls.Add(self.button)
def button_click(self, sender, event):
self.selected = self.cb.SelectedValue
self.Close()
def filter_list(revisionlist, search_str):
passed = None
for element in revisionlist:
name = element.Name
if search_str == name:
passed = element
return passed
sheets = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).WhereElementIsNotElementType().ToElements()
revisionlist = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Revisions).WhereElementIsNotElementType().ToElements()
RevNames = [x.Name for x in revisionlist]
form = RevisionSelectionForm(RevNames)
form.ShowDialog()
SelectedRev = form.selected
SelRevEle = filter_list(revisionlist, SelectedRev)
filterview = FilteredElementCollector(doc).OfClass(ViewSheetSet).GetElementIterator()
filterview.Reset()
viewexists = None
sheetToPrint = []
for i in sheets:
revIds = i.GetAllRevisionIds()
if SelRevEle.Id in revIds:
sheetToPrint.append(i)
# remove viewset if already exists
for f in filterview:
if f.Name == SelectedRev:
viewexists = f
break
if viewexists != None:
tcheck = Transaction(doc, 'viewcheck')
tcheck.Start()
doc.Delete(viewexists.Id)
tcheck.Commit()
viewexists = None
# create viewset
if viewexists == None:
viewSet = ViewSet()
for v in sheetToPrint: (viewSet.Insert(v))
printManager = doc.PrintManager
printManager.PrintRange = PrintRange.Select
viewSS = printManager.ViewSheetSetting
try:
trev = Transaction(doc, 'create viewset')
trev.Start()
viewSS.CurrentViewSheetSet.Views = viewSet
viewSS.SaveAs(SelectedRev)
trev.Commit()
msg = "Sheet set '" + SelectedRev + "' created."
except:
msg = "The ViewSet could not be created"
#Assign your output to the OUT variable.
OUT = msg
1 Like
Just for those who have found it difficult to locate the changes made to the original code,I added a diff of the two versions of the code below. the numbers indicate the line numbers.
diff -w originalCode.py updatedCode.py
12c12,13
<
---
> from RevitServices.Transactions import TransactionManager
> doc = DocumentManager.Instance.CurrentDBDocument
17c18
< clr.AddReference('RevitAPIUI')
---
>
25,27d25
< app = __revit__.Application
< doc = __revit__.ActiveUIDocument.Document
<
55c53
< self.Height = 150
---
> self.Height = 100
98,99c96
< tcheck = Transaction(doc, 'viewcheck')
< tcheck.Start()
---
> TransactionManager.Instance.EnsureInTransaction(doc)
101c98
< tcheck.Commit()
---
> TransactionManager.Instance.TransactionTaskDone()
112,113c109
< trev = Transaction(doc, 'create viewset')
< trev.Start()
---
> TransactionManager.Instance.EnsureInTransaction(doc)
116c112
< trev.Commit()
---
> TransactionManager.Instance.TransactionTaskDone()
1 Like