Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  VBA - Blöcke, Attribute

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
Autor Thema:  VBA - Blöcke, Attribute (326 mal gelesen)
mb12
Mitglied
EDV

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

Beiträge: 5
Registriert: 26.11.2002

erstellt am: 26. Nov. 2002 13:37    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

Hallo NG,
Ich möchte ganz banal aus einem bestehenden Block ("Plankopf")
den Wert des ITEM (_Plannummer) ändern.

Die Hilfe Beispiele sind immer in der Form ausgelegt, dass ein neues Attribut hinzugefügt wird. Ich möchte ein bestehende Attribut ändern.

D.h. Der TextString von (_Plannummer) ist "TEST".

Ich möchte diesen auf...  "555" ändern.

Könnt Ihr mir helfen ???

Ich habe es so versucht...

Public Const StrPlanKopf As String = "testplankopf"

Private Function GetBlockReferences(Block As String) As Boolean
Dim BlockList As New Collection
Dim ACADObject As AcadEntity
GetBlockReferences = False
       
    ' Get list of available Block references
    For Each ACADObject In ThisDrawing.ModelSpace
        If ACADObject.ObjectName = "AcDbBlockReference" Then
            If UCase(ACADObject.Name) = UCase(Block) Then
                GetBlockReferences = True
                Exit Function
            End If
            'MsgBox ACADObject.Name
        End If
    Next
   
End Function

Private Sub start()
Dim wichblock As AcadBlock
Dim x As Object
Dim attribObj As AcadAttribute
   
    If GetBlockReferences(StrPlanKopf) = False Then
        MsgBox "Kein Plankopf gefunden!"
        Exit Sub
    End If
   
   
    Set wichblock = ThisDrawing.Blocks.Item(StrPlanKopf)
   
    For Each x In wichblock
        If x.ObjectName = "AcDbAttributeDefinition" Then
            Set attribObj = x
            Select Case UCase(attribObj.TagString)
           
                Case "_PLANNUMMMER"
                    MsgBox attribObj.TagString, vbInformation, attribObj.TextString
                   
                    Dim s As String
                   
                    s = InputBox("Neue Plannummer:")
                    attribObj.Verify = True
                   
                    attribObj.TextString = s
                    attribObj.Update
            End Select
        End If
    Next
End Sub


Danke für Eure Tips

Manfred Büttner

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

wkopp@ccc.gr
Mitglied
senior electrical designer


Sehen Sie sich das Profil von wkopp@ccc.gr an!   Senden Sie eine Private Message an wkopp@ccc.gr  Schreiben Sie einen Gästebucheintrag für wkopp@ccc.gr

Beiträge: 432
Registriert: 02.04.2002

erstellt am: 26. Nov. 2002 14: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 Nur für mb12 10 Unities + Antwort hilfreich

Hallo Manfred,

leider sagst Du uns nicht mit welcher Version Du arbeitest. Ich setz jetzt einfach mal ACAD 2000 oder hoeher voraus. Wenn Du die Express-Tools hast, kannst Du es auch einfacher machen. Block als Zeichnung oeffnen, das gewuenschte Attribut modifizieren, danach speichern. Nun in der eigentlichen Zeichnung den Block wieder einfuegen (ueber Browse, nicht den Block im Zeichnungsspeicher verwenden), Frage nach Neudefinition mit ja beantworten. Den neuen Block irgendwo am Rand plazieren, dann den Befehl von den Express-Tools "Block synchronisieren" anwenden und schon ist der alte Block mit den neuen Attribut-Definitionen aktualisiert, nun kann der neu eingefuegte Block wieder geloescht werden.
Hope it helps

------------------
Gruss aus dem sonnigen Athen
Wolfgang

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

mb12
Mitglied
EDV

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

Beiträge: 5
Registriert: 26.11.2002

erstellt am: 26. Nov. 2002 14:11    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

Hallo Wolfgang,

nein, das hilft nicht, denn:

Im Papierbereich (es geht um einen Plankopf) gibt es sagen wir einmal 10 Layouts. In jedem dieser Layout ist mind. ein Plankopf enthalten.

Ich möchte nun folgendes realisieren...
Der Benutzer ruft das VBA- Makro auf.
Er wird gebeten eine Auswahl zu treffen (Selection-Set), sodass auch nur dieser Plankopf geändert wird....

Das Makro liest aus dem definierten Plankopf (StrPlankopf) die Plannummer aus (diese ist eindeutig).

Es öffnet sich eine Userform, die z.B. die Plandaten darstellt.
(Relationale DB mit Änderungsindexen zum einen und Versandinformationen zum anderen).

Ändert nun der Benutzer einen Wert...  (z.B. de Plannummer, oder den Masstab) möchte ich diese Daten zurücklesen und nur in diesen Block schreiben....

--> Mit meinem Makro kann ich zwar den Textstring ändern, dieser wird aber nicht angezeigt :-[


Vielleicht kannst Du mir doch noch weiterhelfen...?

Danke

Manfred Büttner

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

wkopp@ccc.gr
Mitglied
senior electrical designer


Sehen Sie sich das Profil von wkopp@ccc.gr an!   Senden Sie eine Private Message an wkopp@ccc.gr  Schreiben Sie einen Gästebucheintrag für wkopp@ccc.gr

Beiträge: 432
Registriert: 02.04.2002

erstellt am: 26. Nov. 2002 14:14    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 Nur für mb12 10 Unities + Antwort hilfreich

Hi Manfred,

nun, mein Loesungsvorschlag war ein Schuss ins Blaue. Aber nun versteh ich besser was Du meinst: Aber leider hab ich keine Loesung dafuer, aber einen Link zu einem Acad-Programmer Forum, ich schau da aus Neugierde ab und zu rein (bin ne Null im lispeln), ich denke das Du da sehr schnell ne Loesung bekommst. Der Link ist: http://www.industrie24.com/bbs/list.php?f=5

Ich hoffe dass Dir dies besser weiterhilft

------------------
Gruss aus dem sonnigen Athen
Wolfgang

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

RoSiNiNo
Mitglied
Konstrukteur


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

Beiträge: 1126
Registriert: 09.10.2002

Autodesk Building Design Suite Premium 2021
Windows 10 Pro 64bit
HP Workstation Z620, 24GB
GeForce GTX 970

erstellt am: 26. Nov. 2002 14:18    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 Nur für mb12 10 Unities + Antwort hilfreich

Versuch es einmal damit
Code:
Public Sub AttChangeTest()
   
    Dim blockObj As AcadBlockReference
    Dim Atts As Variant
    Dim Count As Integer
    Dim AttText As String
   
    'Zuerst Block blockObj wählen, wie immer du das auch machen möchtest
   
    If blockObj.HasAttributes = False Then Exit Sub
    Atts = blockObj.GetAttributes
   
    For Count = UBound(Atts) To 0 Step -1
        ' Wir lesen die Daten
        Select Case Format(Atts(Count).TagString, ">")
            Case "_PLANNUMMMER"
                'Deine Abfragen
                'Zum Beispiel
                AttText = ThisDrawing.Utility.GetString(0, "Neue Plannummer: ")
                Atts(Count).textString = AttText
                GoTo ENDE
        End Select
       
    Next Count
ENDE:

End Sub


Hoffe dir geholfen zu haben


------------------
Roland

[Diese Nachricht wurde von RoSiNiNo am 26. November 2002 editiert.]

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

mb12
Mitglied
EDV

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

Beiträge: 5
Registriert: 26.11.2002

erstellt am: 26. Nov. 2002 14:39    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

Ich danke Euch für Eure schnellen Infos...
diese Lösung klappt: (nur falls noch eine(r) das Problemchen hat)

Option Explicit

Public Const Def_StrPlanKopfName As String = "testplankopf"
Public Const Def_StrPlannummer As String = "_plannummmer"

Public Sub showAttribut()
Dim ActObj As Object
Dim pickedPoint
Dim i As Integer

On Local Error Resume Next
Do
ThisDrawing.Utility.GetEntity ActObj, pickedPoint, "Block wählen"
If TypeName(ActObj) = "Nothing" Then
    Exit Do
Else

If UCase$(ActObj.ObjectName) = "ACDBBLOCKREFERENCE" Then
    If UCase$(ActObj.Name) = UCase$(Def_StrPlanKopfName) Then
        If ActObj.HasAttributes = True Then
        Dim nvarAttrib As Variant
        nvarAttrib = ActObj.GetAttributes
            For i = LBound(nvarAttrib) To UBound(nvarAttrib)
           
                Select Case nvarAttrib(i).TagString
               
                    Case UCase$(Def_StrPlannummer)
                        'MsgBox "AttributReferenz: " & nvarAttrib(i).TagString & vbCrLf & "AttributDaten: " & nvarAttrib(i).TextString
                        Dim s As String
                        s = InputBox("Neue Plannummer: ", "Alte Plannummer: " & nvarAttrib(i).TextString)
                        nvarAttrib(i).TextString = s
               
                End Select
           
            Next
        End If
    End If
End If
Set ActObj = Nothing
End If
Loop
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)2023 CAD.de | Impressum | Datenschutz