<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: AttSync / Brute Force (VB.Net) in .NET Forum</title>
    <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7552946#M28924</link>
    <description>&lt;P&gt;Thanks Gile, it's all good now!! This code is genius!&amp;nbsp;You got my admiration... I don't know why I removed theses lines of code... Thanks again.&lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://forums.autodesk.com/i/smilies/16x16_smiley-wink.png" alt="Smiley Wink" title="Smiley Wink" /&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 17 Nov 2017 13:56:08 GMT</pubDate>
    <dc:creator>JFN_KSH</dc:creator>
    <dc:date>2017-11-17T13:56:08Z</dc:date>
    <item>
      <title>AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551720#M28920</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I`ve written some code that changes the layer of selected blocks &amp;amp; nested blocks.&amp;nbsp;Blockreference(s) containing attributes needs to be synced (attsync). What`s the best way of doing an attsync in .Net? I`ve look at the following Brute force method from Gile (&lt;A title="NET BLOCK Routines" href="http://www.theswamp.org/index.php?topic=31859.msg508802#msg508802" target="_blank"&gt;NET BLOCK Routines&lt;/A&gt;), but I`m getting some intellisense error:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;'GetAttributes' is not a member of 'BlockTableRecord'&lt;/P&gt;
&lt;P&gt;'ResetAttributes' is not a member of 'BlockReference'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;My target framework in set to 4.5&lt;/P&gt;
&lt;P&gt;My AcCoreMgd, AcDbMgd &amp;amp; AcDbMgd are on version 20.1.0.0&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Any help is appreciated!&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Capture.JPG" style="width: 698px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/427442i865940C4561BCC1C/image-size/large?v=v2&amp;amp;px=999" role="button" title="Capture.JPG" alt="Capture.JPG" /&gt;&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Nov 2017 03:10:48 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551720#M28920</guid>
      <dc:creator>JFN_KSH</dc:creator>
      <dc:date>2017-11-17T03:10:48Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551879#M28921</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It looks like you didn't copy the whole code from TheSwamp: the GetAttributes() and ResetAttributes() methods are missing in the code you show.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With VB, you have to clear the Root Namespace in the project to add these extension methods to Autodesk.AutoCAD.DatabaseServices.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Runtime
     
    Namespace Autodesk.AutoCAD.DatabaseServices
        Public Module ExtensionMethods
     
            Dim attDefClass As RXClass = RXClass.GetClass(GetType(AttributeDefinition))
     
            &amp;lt;System.Runtime.CompilerServices.Extension&amp;gt; _
            Public Sub SynchronizeAttributes(target As BlockTableRecord)
                If target Is Nothing Then
                    Throw New ArgumentNullException("target")
                End If
     
                Dim tr As Transaction = target.Database.TransactionManager.TopTransaction
                If tr Is Nothing Then
                    Throw New Exception(ErrorStatus.NoActiveTransactions)
                End If
     
                Dim attDefs As List(Of AttributeDefinition) = target.GetAttributes(tr)
                For Each id As ObjectId In target.GetBlockReferenceIds(True, False)
                    Dim br As BlockReference = _
                        DirectCast(tr.GetObject(id, OpenMode.ForWrite), BlockReference)
                    br.ResetAttributes(attDefs, tr)
                Next
                If target.IsDynamicBlock Then
                    target.UpdateAnonymousBlocks()
                    For Each id As ObjectId In target.GetAnonymousBlockIds()
                        Dim btr As BlockTableRecord = _
                            DirectCast(tr.GetObject(id, OpenMode.ForRead), BlockTableRecord)
                        attDefs = btr.GetAttributes(tr)
                        For Each brId As ObjectId In btr.GetBlockReferenceIds(True, False)
                            Dim br As BlockReference = _
                                DirectCast(tr.GetObject(brId, OpenMode.ForWrite), BlockReference)
                            br.ResetAttributes(attDefs, tr)
                        Next
                    Next
                End If
            End Sub
     
            &amp;lt;System.Runtime.CompilerServices.Extension&amp;gt; _
            Private Function GetAttributes(target As BlockTableRecord, tr As Transaction) As List(Of AttributeDefinition)
                Dim attdefs As List(Of AttributeDefinition) = New List(Of AttributeDefinition)
                For Each id As ObjectId In target
                    If id.ObjectClass = attDefClass Then
                        Dim attDef As AttributeDefinition = _
                            DirectCast(tr.GetObject(id, OpenMode.ForRead), AttributeDefinition)
                        attdefs.Add(attDef)
                    End If
                Next
                Return attdefs
            End Function
     
            &amp;lt;System.Runtime.CompilerServices.Extension&amp;gt; _
            Private Sub ResetAttributes(br As BlockReference, attDefs As List(Of AttributeDefinition), tr As Transaction)
                Dim attValues As New Dictionary(Of String, String)()
                For Each id As ObjectId In br.AttributeCollection
                    If Not id.IsErased Then
                        Dim attRef As AttributeReference = _
                            DirectCast(tr.GetObject(id, OpenMode.ForWrite), AttributeReference)
                        attValues.Add( _
                            attRef.Tag, _
                            If(attRef.IsMTextAttribute, attRef.MTextAttribute.Contents, attRef.TextString))
                        attRef.Erase()
                    End If
                Next
                For Each attDef As AttributeDefinition In attDefs
                    Dim attRef As New AttributeReference()
                    attRef.SetAttributeFromBlock(attDef, br.BlockTransform)
                    If attDef.Constant Then
                        attRef.TextString = If(attDef.IsMTextAttributeDefinition, _
                                               attDef.MTextAttributeDefinition.Contents, _
                                               attDef.TextString)
                    Else If attValues IsNot Nothing AndAlso attValues.ContainsKey(attDef.Tag) Then
                        attRef.TextString = attValues(attDef.Tag.ToUpper())
                    End If
                    br.AttributeCollection.AppendAttribute(attRef)
                    tr.AddNewlyCreatedDBObject(attRef, True)
                Next
            End Sub
     
        End Module
     
    End Namespace&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Nov 2017 06:00:57 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551879#M28921</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2017-11-17T06:00:57Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551881#M28922</link>
      <description>&lt;P&gt;Looks like you are missing some extension method(s)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;an internet search pulled up with these results:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.theswamp.org/index.php?topic=42591.msg477887#msg477887" target="_blank"&gt;https://www.theswamp.org/index.php?topic=42591.0&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;it's in c# i'm sure you'd be able to find the exact ones in VB.NET with a good google search.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;best rgds&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Nov 2017 06:02:52 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551881#M28922</guid>
      <dc:creator>BKSpurgeon</dc:creator>
      <dc:date>2017-11-17T06:02:52Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551892#M28923</link>
      <description>&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/3011731"&gt;@BKSpurgeon&lt;/a&gt;, the whole code (C# and VB) is in the message linked by &lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/528067"&gt;@JFN_KSH&lt;/a&gt;:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.theswamp.org/index.php?topic=31859.msg508802#msg508802" target="_blank"&gt;http://www.theswamp.org/index.php?topic=31859.msg508802#msg508802&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Nov 2017 06:15:23 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7551892#M28923</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2017-11-17T06:15:23Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7552946#M28924</link>
      <description>&lt;P&gt;Thanks Gile, it's all good now!! This code is genius!&amp;nbsp;You got my admiration... I don't know why I removed theses lines of code... Thanks again.&lt;img id="smileywink" class="emoticon emoticon-smileywink" src="https://forums.autodesk.com/i/smilies/16x16_smiley-wink.png" alt="Smiley Wink" title="Smiley Wink" /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Nov 2017 13:56:08 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/7552946#M28924</guid>
      <dc:creator>JFN_KSH</dc:creator>
      <dc:date>2017-11-17T13:56:08Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8148121#M28925</link>
      <description>&lt;P&gt;Hi Gile,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Firstly let me say thank you for sharing your code, it's helped me enormously.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have discovered a minor problem.&lt;/P&gt;&lt;P&gt;Steps to reproduce:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Rotate an attributed block in the drawing&lt;/LI&gt;&lt;LI&gt;Run the attsync code&lt;/LI&gt;&lt;LI&gt;Go to the properties of the block&lt;/LI&gt;&lt;LI&gt;Enter 0 in the Rotation&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;AutoCAD then displays a message: Error, Object was erased. The block's rotation is set to 0 but the attributes remain where they were before the rotation back to 0.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Capture.PNG" style="width: 878px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/525916i8FEFCF683FEE7BD7/image-size/large?v=v2&amp;amp;px=999" role="button" title="Capture.PNG" alt="Capture.PNG" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;I was wondering if you could confirm whether you see the same behaviour and if not, do you have any suggestions as to what might be causing the problem?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is how I'm calling it:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;summary&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;Synchronise&amp;nbsp;block&amp;nbsp;reference&amp;nbsp;attributes&amp;nbsp;with&amp;nbsp;their&amp;nbsp;definitions&lt;/SPAN&gt;
&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;summary&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;param&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;name&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"blkRefIds&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;The&amp;nbsp;objectIds&amp;nbsp;of&amp;nbsp;the&amp;nbsp;block&amp;nbsp;references&amp;nbsp;to&amp;nbsp;synchronise&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;param&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN&gt;Public&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Shared&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Sub&lt;/SPAN&gt;&amp;nbsp;myAttSync&lt;SPAN&gt;(blkRefIds &lt;/SPAN&gt;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;List&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;Of&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;ObjectId&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&amp;nbsp;db&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Database&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;HostApplicationServices&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;WorkingDatabase
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&amp;nbsp;doc&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Document&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Application&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;DocumentManager&lt;SPAN&gt;.&lt;/SPAN&gt;GetDocument&lt;SPAN&gt;(&lt;/SPAN&gt;db&lt;SPAN&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Using&lt;/SPAN&gt;&amp;nbsp;docLock&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;DocumentLock&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;doc&lt;SPAN&gt;.&lt;/SPAN&gt;LockDocument&lt;SPAN&gt;()&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Using&lt;/SPAN&gt;&amp;nbsp;trans&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Transaction&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;db&lt;SPAN&gt;.&lt;/SPAN&gt;TransactionManager&lt;SPAN&gt;.&lt;/SPAN&gt;StartTransaction&lt;SPAN&gt;()&lt;BR /&gt;&lt;/SPAN&gt;            ' If no specific blocks supplied then synchronise all...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;&amp;nbsp;blkRefIds &lt;SPAN&gt;Is&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Nothing&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&amp;nbsp;bt&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;BlockTable&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;trans&lt;SPAN&gt;.&lt;/SPAN&gt;GetObject&lt;SPAN&gt;(&lt;/SPAN&gt;db&lt;SPAN&gt;.&lt;/SPAN&gt;BlockTableId,&amp;nbsp;&lt;SPAN&gt;OpenMode&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;ForRead&lt;SPAN&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkRefIds &lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;bt&lt;SPAN&gt;.&lt;/SPAN&gt;Cast&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;Of&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;ObjectId&lt;/SPAN&gt;&lt;SPAN&gt;)()&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;ToList&lt;SPAN&gt;()&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;For&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Each&lt;/SPAN&gt;&amp;nbsp;id&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;ObjectId&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;In&lt;/SPAN&gt;&amp;nbsp;blkRefIds
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&amp;nbsp;btr&amp;nbsp;&lt;SPAN&gt;As&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;BlockTableRecord&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;trans&lt;SPAN&gt;.&lt;/SPAN&gt;GetObject&lt;SPAN&gt;(&lt;/SPAN&gt;id,&amp;nbsp;&lt;SPAN&gt;OpenMode&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;ForRead&lt;SPAN&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;&amp;nbsp;btr&lt;SPAN&gt;.&lt;/SPAN&gt;IsLayout&amp;nbsp;&lt;SPAN&gt;Then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Continue&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;For&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;&amp;nbsp;btr&lt;SPAN&gt;.&lt;/SPAN&gt;IsFromExternalReference&amp;nbsp;&lt;SPAN&gt;Then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Continue&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;For&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;&amp;nbsp;btr&lt;SPAN&gt;.&lt;/SPAN&gt;GetBlockReferenceIds&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;True&lt;/SPAN&gt;,&amp;nbsp;&lt;SPAN&gt;True&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;Count&amp;nbsp;&lt;SPAN&gt;=&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;0&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Continue&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;For&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;If&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btr&lt;SPAN&gt;.&lt;/SPAN&gt;UpgradeOpen&lt;SPAN&gt;()&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btr&lt;SPAN&gt;.&lt;/SPAN&gt;SynchronizeAttributes&lt;SPAN&gt;()&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;Next&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trans&lt;SPAN&gt;.&lt;/SPAN&gt;Commit&lt;SPAN&gt;()&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Using&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Using&lt;/SPAN&gt;
&lt;SPAN&gt;End&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Paul&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 10:27:08 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8148121#M28925</guid>
      <dc:creator>Paulio</dc:creator>
      <dc:date>2018-07-23T10:27:08Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8148224#M28926</link>
      <description>&lt;P&gt;I think I've fixed it.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've changed ResetAttributes to look like this so rather than deleting each one and recreating it, it simply updates them from the definition:&lt;/P&gt;&lt;PRE&gt;    &amp;lt;System.Runtime.CompilerServices.Extension&amp;gt;
    Private Sub ResetAttributes(br As BlockReference, attdefs As List(Of AttributeDefinition), trans As Transaction)
        Dim attValues As New Dictionary(Of String, String)()
        For Each id As ObjectId In br.AttributeCollection
            If Not id.IsErased Then
                Dim attRef As AttributeReference = DirectCast(trans.GetObject(id, OpenMode.ForWrite), AttributeReference)
                Dim attDef As AttributeDefinition = attdefs.Find(Function(x) x.Tag = attRef.Tag)
                If attDef Is Nothing Then
                    attRef.Erase()
                    Continue For
                End If
                Dim attText As String = If(attRef.IsMTextAttribute, attRef.MTextAttribute.Contents, attRef.TextString)
                attRef.SetAttributeFromBlock(attDef, br.BlockTransform)
                attRef.TextString = attText
                attdefs.Remove(attDef)
            End If
        Next
        For Each attDef As AttributeDefinition In attdefs
            Dim attRef As New AttributeReference()
            attRef.SetAttributeFromBlock(attDef, br.BlockTransform)
            If attDef.Constant Then
                attRef.TextString = If(attDef.IsMTextAttributeDefinition, attDef.MTextAttributeDefinition.Contents, attDef.TextString)
            ElseIf attValues IsNot Nothing AndAlso attValues.ContainsKey(attDef.Tag) Then
                attRef.TextString = attValues(attDef.Tag.ToUpper())
            End If
            br.AttributeCollection.AppendAttribute(attRef)
            trans.AddNewlyCreatedDBObject(attRef, True)
        Next
    End Sub&lt;/PRE&gt;&lt;P&gt;This also handles blocks that have duplicate attributes. I know it doesn't make sense for attributes to be duplicated but AutoCAD allows users to create duplicates, and in my experience if they can do it, they will!&lt;/P&gt;&lt;P&gt;Can you see any flaws in the above?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks again&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Paul&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 11:22:17 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8148224#M28926</guid>
      <dc:creator>Paulio</dc:creator>
      <dc:date>2018-07-23T11:22:17Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8151937#M28927</link>
      <description>&lt;P&gt;Update:&lt;/P&gt;&lt;P&gt;There was an issue with the code I posted. It would only work for the first instance of a particular block. The second one would get its attributes removed. It now looks like this:&lt;/P&gt;&lt;PRE&gt;&amp;lt;System.Runtime.CompilerServices.Extension&amp;gt;
    Private Sub ResetAttributes(br As BlockReference, attdefs As List(Of AttributeDefinition), trans As Transaction)
Dim defsCopy As New List(Of AttributeDefinition)(attdefs)
        Dim attValues As New Dictionary(Of String, String)()
        For Each id As ObjectId In br.AttributeCollection
            If Not id.IsErased Then
                Dim attRef As AttributeReference = DirectCast(trans.GetObject(id, OpenMode.ForWrite), AttributeReference)
                Dim attDef As AttributeDefinition = attdefs.Find(Function(x) x.Tag = attRef.Tag)
                If attDef Is Nothing Then
                    attRef.Erase()
                    Continue For
                End If
                Dim attText As String = If(attRef.IsMTextAttribute, attRef.MTextAttribute.Contents, attRef.TextString)
                attRef.SetAttributeFromBlock(attDef, br.BlockTransform)
                attRef.TextString = attText
                defsCopy.Remove(attDef)
            End If
        Next
        For Each attDef As AttributeDefinition In defsCopy
            Dim attRef As New AttributeReference()
            attRef.SetAttributeFromBlock(attDef, br.BlockTransform)
            If attDef.Constant Then
                attRef.TextString = If(attDef.IsMTextAttributeDefinition, attDef.MTextAttributeDefinition.Contents, attDef.TextString)
            ElseIf attValues IsNot Nothing AndAlso attValues.ContainsKey(attDef.Tag) Then
                attRef.TextString = attValues(attDef.Tag.ToUpper())
            End If
            br.AttributeCollection.AppendAttribute(attRef)
            trans.AddNewlyCreatedDBObject(attRef, True)
        Next
    End Sub&lt;/PRE&gt;</description>
      <pubDate>Tue, 24 Jul 2018 15:02:55 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8151937#M28927</guid>
      <dc:creator>Paulio</dc:creator>
      <dc:date>2018-07-24T15:02:55Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8526372#M28928</link>
      <description>&lt;P&gt;Hello Giles. I'm trying to apply your Attsync solution, but I can not make it work in multithreading or Backgroundworker. It's not possible? I know that Autocad has a bad behavior with multithreading. Is this the cause? When I run it as a simple method, everything works fine.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank's&lt;/P&gt;
&lt;P&gt;José&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 12:53:07 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/8526372#M28928</guid>
      <dc:creator>jose_chambel</dc:creator>
      <dc:date>2019-01-16T12:53:07Z</dc:date>
    </item>
    <item>
      <title>Re: AttSync / Brute Force (VB.Net)</title>
      <link>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/11944963#M28929</link>
      <description>&lt;P&gt;How about this, per BlockReference? Assuming BLK As BlockReference, then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;BLK.RecordGraphicsModified(True)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 May 2023 19:43:00 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/attsync-brute-force-vb-net/m-p/11944963#M28929</guid>
      <dc:creator>lcrist</dc:creator>
      <dc:date>2023-05-05T19:43:00Z</dc:date>
    </item>
  </channel>
</rss>

