Hello,
I'm trying to write a program to erase imported line styles, however I get Collection is Read only from the following code.
Any help appretiated or any work arounds?
<Autodesk.Revit.Attributes.
Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)> _
<Autodesk.Revit.Attributes.
Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)> _
<Autodesk.Revit.Attributes.
Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)> _
Public
Class PurgeLineSubCategories
Implements Autodesk.Revit.UI.IExternalCommand
PublicFunction Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
ByRef message AsString, ByVal elements As Autodesk.Revit.DB.ElementSet) _
As Autodesk.Revit.UI.ResultImplements Autodesk.Revit.UI.IExternalCommand.Execute
Dim lineCat As Autodesk.Revit.DB.Categories
Dim docActiveDoc AsDocument = commandData.Application.ActiveUIDocument.Document
Dim trans As New Autodesk.Revit.DB.Transaction(docActiveDoc)
If trans.Start("PurgeLineSubCategories") = Autodesk.Revit.DB.TransactionStatus.Started Then
If docActiveDoc.IsModifiable = FalseThen
MsgBox(
"Active document '" & docActiveDoc.PathName.ToString() & "' is not modifiable...")
Else
lineCat = commandData.Application.ActiveUIDocument.Document.Settings.Categories
ForEach objCategory AsCategoryIn lineCat
If objCategory.CanAddSubcategory Then
Dim objCategoryNameMap As Autodesk.Revit.DB.CategoryNameMap = objCategory.SubCategories
Dim objCategoryNameMapIterator As Autodesk.Revit.DB.CategoryNameMapIterator = objCategoryNameMap.ForwardIterator
objCategoryNameMapIterator.Reset()
Dim strKey AsString = ""
Do While objCategoryNameMapIterator.MoveNext
Try
Dim objSubCategory AsCategory = objCategoryNameMapIterator.Current
If objSubCategory.Name = "Enter new name here"Then
strKey = objCategoryNameMapIterator.Key
MsgBox(objSubCategory.Name)
objCategoryNameMap.Erase(objCategoryNameMapIterator.Key)
EndIf
Catch ex AsException
MsgBox(ex.Message)
EndTry
Loop
Try
objCategoryNameMap.Erase(strKey)
Catch ex AsException
MsgBox(ex.Message)
EndTry
EndIf
Next
EndIf
EndIf
EndFunction
End
Class
Dear David,
You are being a bad boy. Erasing during iteration. Tsk, tsk.
I would suggest that you just make a note of the elements you would like to delete within the loop 'Do While objCategoryNameMapIterator.MoveNext', for instance by adding them to some collection of your own.
Once the iteration has terminated, you can delete them all in a separate step.
I hope this helps.
Cheers, Jeremy.
--
Jeremy Tammik
Autodesk Developer Network -- http://www.autodesk.com/joinadn
The Building Coder -- http://thebuildingcoder.typepad.com
Hello Jeremy,
Thank you for your reply.
I did thin of that and tried it woithout any luck, I also tried outside the For Each, but with no luck :-(..
Any other ideas?
Regards
David
I now have.
<Autodesk.Revit.Attributes.
Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)> _
<Autodesk.Revit.Attributes.
Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)> _
<Autodesk.Revit.Attributes.
Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)> _
Public
ClassPurgeLineSubCategories
Implements Autodesk.Revit.UI.IExternalCommand
PublicFunction Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
ByRef message AsString, ByVal elements As Autodesk.Revit.DB.ElementSet) _
As Autodesk.Revit.UI.ResultImplements Autodesk.Revit.UI.IExternalCommand.Execute
Dim docActiveDoc AsDocument = commandData.Application.ActiveUIDocument.Document
Dim trans AsNewTransaction(docActiveDoc)
If trans.Start("PurgeLineSubCategories") = TransactionStatus.Started Then
If docActiveDoc.IsModifiable = FalseThen
MsgBox(
"Active document '" & docActiveDoc.PathName.ToString() & "' is not modifiable...")
Else
Dim lineCat AsCategories = docActiveDoc.Settings.Categories
Dim strKey AsString = ""
ForEach objCategory AsCategoryIn lineCat
If objCategory.Name = "Lines"Then
Dim objCategoryNameMap AsCategoryNameMap = objCategory.SubCategories
Dim objCategoryNameMapIterator AsCategoryNameMapIterator = objCategoryNameMap.ForwardIterator
objCategoryNameMapIterator.Reset()
DoWhile objCategoryNameMapIterator.MoveNext
If objCategoryNameMapIterator.Key = "Enter new name here"Then
strKey = objCategoryNameMapIterator.Key
EndIf
Loop
objCategoryNameMapIterator.Dispose()
If (Not strKey = "") Then
Try
MsgBox(
"Erasing " & objCategory.Name & " " & strKey)
objCategoryNameMap.Erase(strKey)
Catch ex AsException
MsgBox(ex.Message)
EndTry
EndIf
EndIf
Next
Try
lineCat.Erase(strKey)
Catch ex AsException
MsgBox(ex.Message)
EndTry
trans.Commit()
EndIf
EndIf
EndFunction
End
Class
Hi David,
Good for you. Nope, sorry, no oither ideas, off-hand, I'm afraid.
Cheers, Jeremy.
Maybe this solution can help?
http://thebuildingcoder.typepad.com/blog/2012/10/deleting-a-graphicstyle-element.html
Cheers,
Jeremy
I just implemented a new external command in The Building Coder samples for this:
Cheers,
Jeremy
Can't find what you're looking for? Ask the community or share your knowledge.