Revit API Forum
Welcome to Autodesk’s Revit API Forums. Share your knowledge, ask questions, and explore popular Revit API topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

objCategoryNameMapIterator Erase Collection is Read only Purge line styles

5 REPLIES 5
Reply
Message 1 of 6
david.rock
454 Views, 5 Replies

objCategoryNameMapIterator Erase Collection is Read only Purge line styles

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

5 REPLIES 5
Message 2 of 6
jeremytammik
in reply to: david.rock

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



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 3 of 6
david.rock
in reply to: jeremytammik

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

Message 4 of 6
jeremytammik
in reply to: david.rock

Hi David,

 

Good for you. Nope, sorry, no oither ideas, off-hand, I'm afraid.

 

Cheers, Jeremy.



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 5 of 6
jeremytammik
in reply to: david.rock

Maybe this solution can help?

 

http://thebuildingcoder.typepad.com/blog/2012/10/deleting-a-graphicstyle-element.html

 

Cheers,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 6 of 6
jeremytammik
in reply to: david.rock

I just implemented a new external command in The Building Coder samples for this:

 

https://github.com/jeremytammik/the_building_coder_samples/blob/master/BuildingCoder/BuildingCoder/C...

 

Cheers,

 

Jeremy



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Rail Community