TheSwamp

Code Red => VB(A) => Topic started by: TR on April 12, 2004, 07:46:35 PM

Title: Replacing Att Def's with text.
Post by: TR on April 12, 2004, 07:46:35 PM
I'm trying to replace all attribute definitions in modelspace with text. The following code replaces all the attributes with text, but for some reason moves some of them to 0,0,0. Anyone have any ideas?

Code: [Select]

Public Sub remove_attdef()

    Dim SelSet As AcadSelectionSet
    Dim AT As AcadAttribute
    Dim FilterType(0 To 0) As Integer
    Dim FilterData(0 To 0) As Variant
    Dim TXT As AcadText
    Dim YesNo

    'select attribute definitions
    FilterType(0) = 0
    FilterData(0) = "ATTDEF"

    On Error GoTo Exit_Error
        ThisDrawing.SelectionSets.Add "SelSet"
        Set SelSet = ThisDrawing.SelectionSets("SelSet")
        SelSet.Clear

    SelSet.Select acSelectionSetAll, , , FilterType, FilterData

    'if the count is greater than 1 then there are attribute definitions in
modelspace
    If SelSet.Count <> 0 Then
        YesNo = MsgBox("You Have " & SelSet.Count & " Attribute
Definition(s) in " & ThisDrawing.Name & ". This Program will attempt to
convert them to Text.", _
        vbYesNo + vbCritical + vbDefaultButton1)
        'if "Ok" is pressed then try to replace all of the attribute
definitions with text that has the same properties.
        If YesNo = vbYes Then
            For Each AT In SelSet
                Set TXT = ThisDrawing.ModelSpace.AddText(AT.TagString,
AT.InsertionPoint, AT.Height)
                TXT.Alignment = AT.Alignment
                TXT.Layer = AT.Layer
                TXT.Color = AT.Color
                TXT.Rotation = AT.Rotation
                TXT.Update
                AT.Delete
            Next
        End If
    End If
    'clear the selection set
    SelSet.Clear
    'rescan the drawing for attribute definitions
    SelSet.Select acSelectionSetAll, , , FilterType, FilterData
    'if it the count is zero then it worked.
    If SelSet.Count = 0 Then
        MsgBox "All attributes were converted to text."
    Else:
        MsgBox "Failed to convert all attributes to text."
    End If


Exit_Error:
   SelSet.Delete
   Set SelSet = Nothing
   Set AT = Nothing
   Set TXT = Nothing
End Sub
Title: Replacing Att Def's with text.
Post by: Ron Heigh on April 12, 2004, 10:38:36 PM
have you tried "burst"?
Title: Replacing Att Def's with text.
Post by: Ron Heigh on April 12, 2004, 10:57:46 PM
what if you add
Code: [Select]
Dim insertionZero(0 To 2) As Double
insertionZero(0) = 0: insertionZero(1) = 0: insertionZero(2) = 0

TXT.Move insertionZero, AT.InsertionPoint


This should correct your problem.
I'm not sure why, but I've had a similar problem with using VBA to place text into drawings.
Title: Replacing Att Def's with text.
Post by: Keith™ on April 13, 2004, 08:18:53 AM
Ok, the problem is one that many people tend to overlook. Whenever you insert text with VBA and use the alignment point, you should be transferring both of the alignment points.

If a text item is defined as anything other than left justified, Autodesk saw fit to use a different DXF code to implement that point. Problem is, that whenever you initially define a bit of text if the initial alignment point is anything bet left, the point referenced by InsertionPoint is always 0,0,0 and whenever you insert text that is left justified, the point referenced by TextAlignmentPoint is always 0,0,0 So......

Code: [Select]

           For Each AT In SelSet
                Set TXT = ThisDrawing.ModelSpace.AddText(AT.TagString,
AT.InsertionPoint, AT.Height)
                TXT.Alignment = AT.Alignment
                TXT.TextAlignmentPoint = AT.TextAlignmentPoint
                TXT.Layer = AT.Layer
                TXT.Color = AT.Color
                TXT.Rotation = AT.Rotation
                TXT.Update
                AT.Delete
            Next


So this should fix that problem...

Just remember that if you apply the alignment point BEFORE you apply the alignment, the text will sometimes do wierd things...
So apply the alignment first then apply the alignment point.
Title: Replacing Att Def's with text.
Post by: TR on April 13, 2004, 08:27:20 PM
Thanks guys.

I added the TextAlignmentPoint stuff and now it's not moving all the items but it's skipping some of the attribute definitions. I'll have to take a look at a little closer when I get some free time.
Title: Replacing Att Def's with text.
Post by: Keith™ on April 13, 2004, 08:53:13 PM
Turn off the error checking the next time you run it and see if it is a coding error.
Title: Replacing Att Def's with text.
Post by: daron on April 14, 2004, 09:56:23 PM
I was working on a lisp of this once and Stig helped (gave) me with a solution. Let me go see if I can find it.
Title: Replacing Att Def's with text.
Post by: daron on April 14, 2004, 10:01:55 PM
How's this (http://www.theswamp.org/phpBB2/viewtopic.php?p=5104#5104)?
Title: Replacing Att Def's with text.
Post by: TR on April 15, 2004, 02:15:48 AM
Thanks Daron.....but I want to do it in vba. I don't really know visual-lisp and I'm not about to start learning it now. :)
Title: Replacing Att Def's with text.
Post by: daron on April 15, 2004, 07:59:36 AM
That's too bad. That's one fast routine. You're welcome.
Title: Replacing Att Def's with text.
Post by: hendie on April 15, 2004, 08:37:43 AM
the code ran fine for me when I substituted Keiths code regarding alignment
Title: Replacing Att Def's with text.
Post by: Keith™ on April 15, 2004, 09:55:44 AM
Hendie, I think that would appear to be the fix
Title: Replacing Att Def's with text.
Post by: TR on April 15, 2004, 06:39:26 PM
It seems I was getting a weird error message. I looked it up online and it doesn't really mean anything. I did a select case to check if it for that error message and resume next if it was. I'll post the code when I get to work tomorrow in case anyone wants it for anything.

Thanks for the help guys.
Title: Replacing Att Def's with text.
Post by: TR on April 16, 2004, 06:32:22 PM
Here's the fixed code if anyone's interested.
Code: [Select]

Option Explicit
Public Sub remove_attdef()

    Dim SelSet As AcadSelectionSet
    Dim AT As AcadAttribute
    Dim FilterType(0 To 0) As Integer
    Dim FilterData(0 To 0) As Variant
    Dim TXT As AcadText
    Dim YesNo

    'select attribute definitions
    FilterType(0) = 0
    FilterData(0) = "ATTDEF"

    On Error GoTo Exit_Error
    ThisDrawing.SelectionSets.Add "SelSet"
    Set SelSet = ThisDrawing.SelectionSets("SelSet")
    SelSet.Clear

    SelSet.Select acSelectionSetAll, , , FilterType, FilterData

    'if the count is greater than 1 then there are attribute definitions in
modelspace
    If SelSet.Count <> 0 Then
        YesNo = MsgBox("You Have " & SelSet.Count & " Attribute
Definition(s) in " & ThisDrawing.Name & _
        ". Would you like this program to attempt to convert them to text?",
_
        vbYesNo + vbCritical + vbDefaultButton1)
        'if "Ok" is pressed then try to replace all of the attribute
definitions with text that has the same properties.
        If YesNo = vbYes Then
            For Each AT In SelSet
                Set TXT = ThisDrawing.ModelSpace.AddText(AT.TagString,
AT.InsertionPoint, AT.Height)
                TXT.Alignment = AT.Alignment
                TXT.TextAlignmentPoint = AT.TextAlignmentPoint
                TXT.Layer = AT.Layer
                TXT.Color = AT.Color
                TXT.Rotation = AT.Rotation
                TXT.Update
                AT.Delete
            Next
        End If
    End If
    'clear the selection set
    SelSet.Clear
    'rescan the drawing for attribute definitions
    SelSet.Select acSelectionSetAll, , , FilterType, FilterData
    'if it the count is zero then it worked.
    If SelSet.Count = 0 Then
        MsgBox "All attributes were converted to text."
    Else:
        MsgBox "Failed to convert all attributes to text."
    End If

Exit_Error:
    Select Case Err.Number
    Case -2145386494 'not applicable
        Resume Next
    Case Else
        SelSet.Delete
        Set SelSet = Nothing
        Set AT = Nothing
        Set TXT = Nothing
    End Select
End Sub
Title: Replacing Att Def's with text.
Post by: hendie on April 20, 2004, 03:55:45 AM
funny how things work out.

I just found a use for this routine. Thanks guys.
Title: Replacing Att Def's with text.
Post by: TR on April 20, 2004, 07:22:57 AM
:)
Title: Replacing Att Def's with text.
Post by: Keith™ on April 20, 2004, 06:24:49 PM
Well, it is kinda funny how collective efforts sometimes pays off in the end...