Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Tip: Blöcke mit Attributen nachträglich aktualisieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
PNY präsentiert die PRO Elite™ High Endurance microSD-Flash-Speicherkarten für Videoüberwachung und kontinuierliche Aufzeichnung, eine Pressemitteilung
Autor Thema:  Tip: Blöcke mit Attributen nachträglich aktualisieren (2524 mal gelesen)
CADoktor
Mitglied
Techniker


Sehen Sie sich das Profil von CADoktor an!   Senden Sie eine Private Message an CADoktor  Schreiben Sie einen Gästebucheintrag für CADoktor

Beiträge: 35
Registriert: 29.03.2006

erstellt am: 30. Mrz. 2006 10:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Attribute sind in AutoCAD ein leidiges Thema.

Das Problem das ich hatte, waren Beschriftungsblöcke einer AutoCAD Applikation (Viega CAD bzw. Linear).

Diese Beschriftungsblöcke sind programmintern mit den entsprechenden Leitungen verknüpft. Die Leitungen (Heizung, Sanitär) werden von der Applikation dimensioniert und mit entsprechenden Funktionen beschriftet. Änder sich die Berechnung, können die vorhandenen Beschriftungblöcke automatisch aktualisiert werden.

So weit so gut... Nun zum Problem.
Der Beschriftungsblock sollte geändert werden.
Die Lage der Attribute, Texthöhe und Schriftart sollte geändert werden. Gesagt getan und dann Block mit den Attributen neu definiert und alte Definition überschrieben ...
Ergebnis: Keine Änderung bestehender Atrribute...

Ist ja auch logisch, weil die Attributsreferenzen nicht aktualisert werden. Aber es gibt ja einige Tools (z.B. Toolpack)
die Funktionen zum Neudefinieren von Blöcken mit Attributen bieten.

Problem war nun, dass die Applikation den Bezug zu den Beschrifterblöcken verloren hat, da die Blocke neu eingefügt wurden und die Attributswerte übertragen wurden.

Mein Ansatz war nun die direkte Manipulation bestehender Attributsreferenzen. Die Blöckreferenzen werden mit der neuen Blockdefinition verglichen und die bestehenden Attributsreferenzen werden laut den Einstellungen der neuen Attributsdefinitionen im neuen Block abgeändert.

Attribute die in der neuen Blockdefinition fehlen, werden in den bereits eingefügten Blöcken gelöscht.

Ablauf Block mit neuer Darstellung definieren und bestehende Definition überschreiben.

Anschliessend Funktion aufrufen und einen der bestehenden Blöcke in der Zeichnung klicken.

Einschränkung!!!
Es ist bisher noch nicht möglich neue Attribute hinzuzufügen.
Ansatz für so eine Funktion wäre das kopieren und Abändern einer bereits bestehenden AttributsReferenz in der BlockReferenz.

Anbei der Programmcode ...

Public Sub AttDefNeuLesen()

    Dim objBlockDef As AcadBlock
    Dim objBlockRef As AcadBlockReference
   
    Dim varAttrefs As Variant
    Dim objAttRef As AcadAttributeReference
    Dim objAttDef As AcadAttribute

    Dim objEntity As AcadEntity
    Dim objEntityBlockdef As AcadEntity
    Dim strBlockname As String
   
   
    Dim pt1 As Variant
    Dim ptBlockRef As Variant
    Dim ptAttDef As Variant
    Dim ptAttRef(2) As Double
   
    Dim AttDefGefunden As Boolean

    Dim i1 As Integer
   
    'Eine Blockreferenz wählen
    ThisDrawing.Utility.GetEntity objBlockRef, pt1, "Block wählen: "
   
    'Blocknamen auswerten
    strBlockname = objBlockRef.Name
   
    'Alle Objekte im Modellbereich durchlaufen
    For Each objEntity In ThisDrawing.ModelSpace
        If objEntity.ObjectName = "AcDbBlockReference" Then 'Prüfen, ob Element Block ist
            Set objBlockRef = objEntity 'Wenn Ja dann Blockref-Zeiger auf Element
           
            If UCase(objBlockRef.Name) = UCase(strBlockname) Then  'Prüfen, ob Blockrefenz mit gesuchtem übereinstimmt
       
                If objBlockRef.HasAttributes Then  'Wenn Ja dann prüfen, ob Block Attribute hat
                    varAttrefs = objBlockRef.GetAttributes  'Attribute des Blocks einlesen
                   
                    For i1 = LBound(varAttrefs) To UBound(varAttrefs)  'Alle Attribute durchlaufen
                   
                        Set objAttRef = varAttrefs(i1)  'AttRef-Zeiger auf aktuelle Attributreferenz
                       
                        Set objBlockDef = ThisDrawing.Blocks(objBlockRef.Name)  'Blockdef-Zeiger auf Blockdefinition
                       
                        AttDefGefunden = False
                       
                        For Each objEntityBlockdef In objBlockDef  'Alle Elemente der Blockdefinition durchlaufen
                       
                            If objEntityBlockdef.ObjectName = "AcDbAttributeDefinition" Then    'Prüfen, ob Attributsdefinition gefunden
                           
                                Set objAttDef = objEntityBlockdef  'Wenn Ja Attdef-Zeiger auf aktuelle Attributsdefinition
                               
                                If objAttDef.TagString = varAttrefs(i1).TagString Then  'Prüfen, ob gesuchtes Attribut gleich der Aktuellen Definition ist
                               
                                    ptBlockRef = objBlockRef.InsertionPoint 'Einfügepunkt Blockreferenz
                                   
                                    ptAttDef = objAttDef.InsertionPoint 'Einfügepunkt Attributsdefinition
                                   
                                 
                                    ptAttRef(0) = ptBlockRef(0) + ptAttDef(0) * objBlockRef.XScaleFactor    'Neue Position des Attributes ermitteln
                                    ptAttRef(1) = ptBlockRef(1) + ptAttDef(1) * objBlockRef.YScaleFactor    'Koordinate Attributsdefinition + Koordinate Blockreferenz x Maßstab
                                    ptAttRef(2) = ptBlockRef(2) + ptAttDef(2) * objBlockRef.ZScaleFactor
                                   
                                   
                                    With objAttRef  'Neue Werte an Attribut schreiben
                                        .color = objAttDef.color                'Farbe
                                        .Linetype = objAttDef.Linetype          'Linientyp
                                        .LineWeight = objAttDef.LineWeight      'Linienbreite
                                        .Layer = objAttDef.Layer                'Layer
                                        .Alignment = objAttDef.Alignment        'Textausrichtung
                                        .InsertionPoint = ptAttRef              'Einfügepunkt
                                        .Height = objAttDef.Height * objBlockRef.YScaleFactor 'Texthöhe
                                        .ScaleFactor = objAttDef.ScaleFactor    'Textweite
                                        .StyleName = objAttDef.StyleName        'Textstil
                                        .InsertionPoint = ptAttRef              'Einfügepunkt
                                        .Rotation = objAttDef.Rotation          'Ursprungsdrehung wie in Definition
                                        .Rotate objBlockRef.InsertionPoint, objBlockRef.Rotation    'Attribut nachträglich drehen, wie Blockdrehung
                                    End With
                                   
                                    AttDefGefunden = True 'Markierung, das AttDef gefunden wurde
                                End If
                            End If
                        Next
                        If Not AttDefGefunden Then objAttRef.Delete 'Wenn Attdef in neuem Block fehlt, AttRef löschen
                    Next i1
                End If
            End If
        End If
    Next
    Exit Sub
   
Error:
    MsgBox "Sie haben keinen gültigen Block gewählt!"
End Sub

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz