I'm having trouble getting View.SetVisibility to work. It keeps throwing a ModificationOutsideTransactionException error when it hits rvtView.setVisibility(rvtCategory, blnVisible)
Here's my code:
PrivateSub SetCategoryVisibility(ByRef rvtView AsView, ByRef blnVisible AsBoolean)
Dim rvtFilterDimensions As Autodesk.Revit.DB.ElementClassFilter = New Autodesk.Revit.DB.ElementClassFilter(GetType(Autodesk.Revit.DB.Dimension))
Dim rvtFilterHosts As Autodesk.Revit.DB.ElementClassFilter = New Autodesk.Revit.DB.ElementClassFilter(GetType(Autodesk.Revit.DB.HostObject))
Dim rvtFilterReferencePlanes As Autodesk.Revit.DB.ElementClassFilter = New Autodesk.Revit.DB.ElementClassFilter(GetType(Autodesk.Revit.DB.ReferencePlane))
Dim a As Generic.IList(OfElementFilter) = New Generic.List(OfElementFilter)
a.Add(rvtFilterDimensions)
a.Add(rvtFilterHosts)
a.Add(rvtFilterReferencePlanes)
Dim rvtFilterOr AsLogicalOrFilter = NewLogicalOrFilter(a)
Dim rvtCollector AsNew Autodesk.Revit.DB.FilteredElementCollector(m_rvtDBDoc)
Dim ilistElements As Generic.IList(Of Autodesk.Revit.DB.Element)
Dim rvtTransStatus AsTransactionStatus
Using rvtGroup AsTransactionGroup = NewTransactionGroup(m_rvtDBDoc)
Try
rvtCollector.WherePasses(rvtFilterOr)
ilistElements = rvtCollector.ToElements()
rvtTransStatus = rvtGroup.Start(
"Category Visibility")
ForEach rvtElement In ilistElements
IfNot rvtElement.Category IsNothingThen
Dim rvtCategory As Autodesk.Revit.DB.Category = rvtElement.Category
If rvtCategory.AllowsVisibilityControl(rvtView) Then
Using rvtTransaction AsTransaction = NewTransaction(m_rvtDBDoc)
Dim rvtStatus AsTransactionStatus
Try
rvtStatus = rvtTransaction.Start(rvtCategory.Name)
Debug.Print(rvtView.getVisibility(rvtCategory))
rvtView.setVisibility(rvtCategory, blnVisible)
rvtStatus = rvtTransaction.Commit()
m_rvtUIDoc.RefreshActiveView()
Threading.
Thread.Sleep(2000)
Catch e As Exceptions.ModificationOutsideTransactionException
If rvtStatus = TransactionStatus.Started Then rvtTransaction.RollBack()
Dim message AsString = e.ToString()
Catch e AsException
If rvtStatus = TransactionStatus.Started Then rvtTransaction.RollBack()
Dim message AsString = e.ToString()
EndTry
EndUsing
EndIf
EndIf
Next
Catch e As Exceptions.ModificationOutsideTransactionException
If rvtTransStatus = TransactionStatus.Started Then rvtGroup.RollBack()
Dim message AsString = e.ToString()
Catch e AsException
If rvtTransStatus = TransactionStatus.Started Then rvtGroup.RollBack()
Dim message AsString = e.ToString()
EndTry
rvtGroup.Assimilate()
EndUsing
EndSub
SetVisibility() works well in Revit if it is in a started transaction.
Your code looks no problem. SeVisibility is in called within the open transaction. Probably the issue is not in this code fragment.
If there is a reproducible code project and the test rvt file, that would be helpful to detect issue,