Author Topic: Rename BLOCK AUTOCAD DOTNET  (Read 2647 times)

0 Members and 1 Guest are viewing this topic.

johnpolob

  • Newt
  • Posts: 29
Rename BLOCK AUTOCAD DOTNET
« on: September 16, 2015, 10:19:20 AM »
Hi All,

I need to rename some blocks in my drawing. That's the reason why I wrote the code below on VB.net for renaming several block at a time .

But when I launch my command in AutoCad 2011 I have this message "eDuplicateRecordName".

Could someone help to fix this issue.

All suggestions are welcome.

Thank you in advance.

<CommandMethod("RENBLK")>
        Public Sub RenameBlockInModelSpace()

            Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim zDb As Database = zDoc.Database
            Dim zEd As Editor = zDoc.Editor

            Dim i As Integer = 0

            'Début de l'opération
            Using zTrans As Transaction = zDb.TransactionManager.StartTransaction()

                'Ouverture de la TABLE des blocs en écriture
                Dim zBlkTbl As BlockTable = zTrans.GetObject(zDb.BlockTableId, OpenMode.ForWrite)
                'Ouverture des enregistrements de la TABLE des blocs en lecture
                Dim zBlkTblRec As BlockTableRecord = zTrans.GetObject(zBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

                Dim zBlkCl As RXClass = RXClass.GetClass(GetType(BlockReference))

                Dim zBlkRefCol As ObjectIdCollection = zBlkTblRec.GetBlockReferenceIds(True, False)

                For Each zBlkTblRecId As ObjectId In zBlkTblRec 'zBlkTblRec.GetBlockReferenceIds(True, False) 'zBlkRefCol
                    Try

                        If zBlkTblRecId.ObjectClass = zBlkCl Then

                            Dim zBlkRef As BlockReference = TryCast(zTrans.GetObject(zBlkTblRecId, OpenMode.ForWrite, False), BlockReference)



                            zEd.WriteMessage(String.Format(vbLf + "Block : {0} -- Id : {1} -- Layer : {2}", zBlkRef.Name, zBlkTblRecId, zBlkRef.Layer))
                            i = i + 1
                            If zBlkRef.Name = "BAT-10" Then
                                Dim MYmap As New IdMapping
                                Dim newzBlkTblRec As BlockTableRecord = zBlkTblRec.DeepClone(zBlkTbl, MYmap, True)
                                'MsgBox(zBlkRef.Name)

                                newzBlkTblRec.Name = "VUU-10"

                                zBlkRef.BlockTableRecord = zBlkTbl.Add(newzBlkTblRec)
                                zTrans.AddNewlyCreatedDBObject(newzBlkTblRec, True)

                            End If


                        End If
                    Catch ex As SystemException

                    End Try
                Next
                zEd.WriteMessage(String.Format(vbLf + "Total des blocs : {0} ", i))
                zTrans.Commit()
            End Using

        End Sub

Jeff H

  • Needs a day job
  • Posts: 6150
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #1 on: September 16, 2015, 11:02:34 AM »
You need to be iterating the BlockTable and checking the BlockTableRecords name instead trying to get blockreferences of the BlockTableRecord for model space.


johnpolob

  • Newt
  • Posts: 29
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #2 on: September 16, 2015, 11:12:03 AM »
Thank you Jeff H for  your fast reply.

Please could you show me an example.
 
Thank you in advance.

gile

  • Gator
  • Posts: 2507
  • Marseille, France
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #3 on: September 16, 2015, 11:38:36 AM »
If it is good to simply rename the blocks, just open the block definition (BlockTableRecord) and rename it.

S'il s'agit bien de simplement renommer des blocs, il suffit d'ouvrir la définition de bloc (BlockTableRecord) et de la renommer.

Code - C#: [Select]
  1.         [CommandMethod("RENBLK")]
  2.         public void Test()
  3.         {
  4.             Document doc = AcAp.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.  
  8.             using (Transaction tr = db.TransactionManager.StartTransaction())
  9.             {
  10.                 // ouvrir la table des blocs en lecture
  11.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  12.                 // vérifier si la table contient bien le bloc à renommer
  13.                 if (bt.Has("BAT-10"))
  14.                 {
  15.                     // ouvrir la défintion du bloc en écriture
  16.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt["BAT-10"], OpenMode.ForWrite);
  17.                     // changer le nom du bloc
  18.                     btr.Name = "VUU-10";
  19.                 }
  20.                 tr.Commit();
  21.             }
  22.         }
Speaking English as a French Frog

johnpolob

  • Newt
  • Posts: 29
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #4 on: September 17, 2015, 08:40:50 AM »
Bonjour Gile,

Grand merci pour ta réponse rapide. Ton code m'a permis de comprendre (du moins je pense) en profondeur la différence entre la défintion et la référence d'un bloc.

J'ai quand même un petit soucis car je dois comparer les noms des blocs qui se trouvent dans mon dessin avec ceux qui se trouvent dans une table access avant de les renommer.

Le code ci-dessous ne renomme qu'un seul bloc alors qu'il devrait renommer tous les blocs se trouvant dans mon dessin avec un nouveau nom se trouvant dans ma table.

Quand il y a deux bloc ayant le même nom dans mon dessin, il renomme un seul et génère un message du style : "eDuplicateRecordName"

Pourrais-tu y jeter un coup d'oeil et dire à quel niveau ça cloche.

Merci davance.

<CommandMethod("RENBLK1")>
        Public Sub RenameBlockInModelSpace()

            Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim zDb As Database = zDoc.Database
            Dim zEd As Editor = zDoc.Editor

            Dim conStr As New OleDbConnection
            'conStr = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Q:\APPLICATION\ZccKCSAcad\DB\ZccKCSAcad_2015.udl") '"Data Source=ZCC3\SQLEXPRESS;AttachDbFilename=J:\DB\ZccKCSAcad_2015_SQL.mdf;Integrated Security=True")
            conStr.ConnectionString = "File Name= Q:\APPLICATION\ZccKCSAcad\DB\ZccKCSAcad_2015.udl"
            conStr.Open()

            If conStr.State = ConnectionState.Open Then
                Dim cmd As OleDbCommand = conStr.CreateCommand
                cmd.CommandText = "SELECT rb_ID, rd_OLD_NAME, rd_NEW_NAME FROM table_CONNECTOR_BLOCK ORDER BY rb_ID"

                Dim dR As OleDbDataReader = cmd.ExecuteReader

                Dim i As Integer = 0
                Dim nbBlk As Integer = 0

                'Début de l'opération
                Using zTrans As Transaction = zDb.TransactionManager.StartTransaction()

                    Try

                        While dR.Read
                            Dim zBlkTbl As BlockTable = zTrans.GetObject(zDb.BlockTableId, OpenMode.ForRead)
                            Dim zBlkNameOld As String
                            Dim zBlkNameNew As String

                            zBlkNameOld = dR("rd_OLD_NAME")
                            zBlkNameNew = dR("rd_NEW_NAME")

                            If (zBlkTbl.Has(zBlkNameOld)) Then

                                'Obtenir la définition du bloc
                                Dim zBlkTblRec As BlockTableRecord = zTrans.GetObject(zBlkTbl(zBlkNameOld), OpenMode.ForWrite)

                                zEd.WriteMessage(String.Format(vbLf + "Block name : {0}", zBlkTblRec.Name))
                                zBlkTblRec.Name = zBlkNameNew
                                i = i + 1
                            End If
                            nbBlk = nbBlk + 1
                        End While

                    Catch ex As SystemException
                    End Try

                        zTrans.Commit()
                    End Using
                dR.Close()
                conStr.Close()
            End If
        End Sub

gile

  • Gator
  • Posts: 2507
  • Marseille, France
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #5 on: September 18, 2015, 01:25:43 AM »
You can't have two blocks with the same name in tne block table.

Tu ne peux pas avoir deux blocs avec le même nom dans la table des blocs.
Speaking English as a French Frog

johnpolob

  • Newt
  • Posts: 29
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #6 on: September 18, 2015, 11:07:32 AM »
Hi All,

My issue is solved.

I want to thank Gile and Jeff for their advices.

I will put later my solution whether It can help somebody else.

Thank you very much.

johnpolob

  • Newt
  • Posts: 29
Re: Rename BLOCK AUTOCAD DOTNET
« Reply #7 on: September 21, 2015, 06:28:29 AM »
As promised, you will find below a solution of my issue.

Thank you to Gile and Jeff

This has been possible due to yours advices.

<CommandMethod("RENBLK")>
        Public Sub RenameDefinitionBlock()

            Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim zDb As Database = zDoc.Database
            Dim zEd As Editor = zDoc.Editor
            Dim conStr As New OleDbConnection

            'Chaîne de connection à la base de données
            conStr.ConnectionString = "File Name= Your file.udl"
            'Ouverture de la connection
            conStr.Open()

            Dim nbBlk As Integer = 0

            'Début de l'opération
            Using zTrans As Transaction = zDb.TransactionManager.StartTransaction()

                Try
                    'Ouverture de la table des blocs en lecture
                    Dim zBlkTbl As BlockTable = zTrans.GetObject(zDb.BlockTableId, OpenMode.ForRead)
                    'Parcours de la table des blocs
                    For Each objId As ObjectId In zBlkTbl
                        'Ouverture de la table des enregistements (définition) des blocs en écriture
                        Dim zBlkTblRec As BlockTableRecord = zTrans.GetObject(objId, OpenMode.ForWrite)
                        'Sauvegarde du nom de l'enregistrement pour le tester plus loin
                        Dim zTestName As String = zBlkTblRec.Name
                        'Ne pas prendre en consideration les *Model_Space et *Paper_Space
                        If zBlkTblRec.IsLayout = True Then
                        Else
                            'Test de la connection à la base de données
                            If conStr.State = ConnectionState.Open Then
                                Dim cmd As OleDbCommand = conStr.CreateCommand
                                'Sélection du nom équivalent dans la base de données
                                cmd.CommandText = "SELECT cb_ID, cb_OLD_NAME, cb_NEW_NAME FROM table_CONNECTOR_BLOCK WHERE cb_OLD_NAME='" & zTestName & "'"

                                Dim dR As OleDbDataReader = cmd.ExecuteReader

                                While dR.Read
                                    'Recupération de l'ancien et du nouveau nom
                                    Dim zBlkNameOld As String = dR("cb_OLD_NAME")
                                    Dim zBlkNameNew As String = dR("cb_NEW_NAME")

                                    zEd.WriteMessage(String.Format(vbLf + "-----------------------------------------------------------------------------"))
                                    zEd.WriteMessage(String.Format(vbLf + "Block name : {0} --- Old name : {1} --- New name : {2}", zBlkTblRec.Name, zBlkNameOld, zBlkNameNew))
                                    zEd.WriteMessage(String.Format(vbLf + "-----------------------------------------------------------------------------"))
                                    'Renommer le bloc par le nouveau nom trouvé
                                    zBlkTblRec.Name = zBlkNameNew
                                    nbBlk = nbBlk + 1

                                End While
                                'Fermeture de l
                                dR.Close()
                            End If
                        End If

                    Next
                    'Affichage du nombre de blocs différents
                    zEd.WriteMessage(String.Format(vbLf + "Number of differents blocks : {0}", nbBlk))
                Catch ex As SystemException

                End Try
                'Fin de l'opération
                zTrans.Commit()
            End Using
            'Fermeture de la base de données
            conStr.Close()

        End Sub