Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD ObjectARX und .NET
  Blockdefinition bearbeiten

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 wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
Autor Thema:  Blockdefinition bearbeiten (2925 mal gelesen)
Gloem
Mitglied
Geoinformatiker


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

Beiträge: 181
Registriert: 07.12.2007

Windows 10 - 64 Bit, mindestens 16 GB RAM
<P>AutoCAD Map 2020, VBA, Dot-Net

erstellt am: 24. Jun. 2011 12:44    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,

ich möchte mit einem Dot-Net-Programm sämtliche Attribute aus meinen Blöcken entfernen. Das Ändern der Blockdefinitionen ist auch nicht das Problem nur wie aktualisier ich die Blockreferenzen in meiner Zeichnung jetzt?

Hat ja jemand ne Idee (Attsync oder ähnliches geht auch nicht, da ja keine attributierten Blöcke mehr in der Zeichnung vorhanden sind

Code:

        Dim trans As Transaction = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction
        Try
            Dim blockTable As BlockTable = CType(Application.DocumentManager.MdiActiveDocument.Database.BlockTableId.GetObject(OpenMode.ForWrite), BlockTable)
            Dim blockTableEnumerator As SymbolTableEnumerator = blockTable.GetEnumerator

            While blockTableEnumerator.MoveNext
                Dim blockDefinition As BlockTableRecord = CType(blockTableEnumerator.Current.GetObject(OpenMode.ForWrite), BlockTableRecord)
                blockDefinition.Annotative = AnnotativeStates.False

                For Each ObjectId As ObjectId In blockDefinition
                    Dim entity As Entity = CType(ObjectId.GetObject(OpenMode.ForWrite), Entity)
                    If (TypeOf entity Is AttributeDefinition) Then
                        Dim attributeDefinition As AttributeDefinition = CType(entity, AttributeDefinition)
                        attributeDefinition.Erase()
                    End If
                Next

            End While

            trans.Commit()

        Catch ex As Exception
            Throw ex

        Finally
            trans.Dispose()
        End Try


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


Ex-Mitglied

erstellt am: 24. Jun. 2011 12:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Du musst aus der Blockdefinition die BlockReferenzen finden, für jede BlockReferenz die AttributeCollection durchscannen und die enthaltenen Attribute löschen.

Code:
Friend Shared Sub delAttributes(ByRef BlDef As DatabaseServices.BlockTableRecord, ByRef TrAct As DatabaseServices.Transaction)
  If (BlDef IsNot Nothing) AndAlso (Not BlDef.IsErased) Then
    'hole alle Referenzen für diese Blockdefinition
    Dim tBlRefs As DatabaseServices.ObjectIdCollection = BlDef.GetBlockReferenceIds(True, True)
    If (tBlRefs IsNot Nothing) AndAlso (tBlRefs.Count > 0) Then
      'dann gehen wir alle Blockreferenzen durch
      For Each tBlRefID As DatabaseServices.ObjectId In tBlRefs
        If (tBlRefID.IsValid) AndAlso (Not tBlRefID.IsErased) Then
          Dim tBlRef As DatabaseServices.BlockReference = CType(TrAct.GetObject(tBlRefID, DatabaseServices.OpenMode.ForRead), DatabaseServices.BlockReference)

          'jetzt gucken wir, ob dieser Blockreferenz über Attributreferenzen verfügt
          If (tBlRef.AttributeCollection IsNot Nothing) AndAlso (tBlRef.AttributeCollection.Count > 0) Then
            'jetzt alle Attributreferenzen löschen
            For Each tAttRefID As DatabaseServices.ObjectId In tBlRef.AttributeCollection
              If (tAttRefID.IsValid) AndAlso (Not tAttRefID.IsErased) Then
                TrAct.GetObject(tAttRefID, DatabaseServices.OpenMode.ForWrite).Erase()  'und tschuess
              End If
            Next
          End If
        End If
      Next
    End If
  End If
End Sub


- alfred -

------------------
www.hollaus.at

Gloem
Mitglied
Geoinformatiker


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

Beiträge: 181
Registriert: 07.12.2007

Windows 10 - 64 Bit, mindestens 16 GB RAM
<P>AutoCAD Map 2020, VBA, Dot-Net

erstellt am: 24. Jun. 2011 13: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

Wenn ich den Quellcode richtig verstehe wähle ich eine Blockdefinition aus und das Programm sucht alle Referenzen von der Definition und löscht in den Referenzen alle Attribute.

Wenn ich das nicht richtig mache, könnten da ja immer noch Diskrepanzen zwischen Blockdefintion und Referenz entstehen, oder?
Gibt es nicht irgendeine Möglichkeit attsync oder einen tollen anderen Befehl aufzurufen und AutoCAD aktualisiert die Referenzen einfach. Also so als wenn die Definition noch ein Attribut hat und attsync ausgeführt werden würde?

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


Ex-Mitglied

erstellt am: 24. Jun. 2011 13:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Wenn ich den Quellcode richtig verstehe wähle ich eine Blockdefinition aus und das Programm
>> sucht alle Referenzen von der Definition und löscht in den Referenzen alle Attribute.

Richtig verstanden , ich hab's so für Dich gemacht, da Du in Deinem Code-Snippet die BlockDefinition ja schon in der Hand hast.


>> Wenn ich das nicht richtig mache, könnten da ja immer noch Diskrepanzen zwischen Blockdefintion
>> und Referenz entstehen, oder?

Ja, neu eingefügte Blöcke werden dann keine Attribute aufweisen, bestehende werden noch immer Ihre Attribute besitzen.


>> Attsync oder ähnliches geht auch nicht, da ja keine attributierten Blöcke mehr in der Zeichnung vorhanden sind

Dann füge temporär einen Block mit Attributen ein, dann lässt sich _ATTSYNC starten.
BATTMAN kannst Du Dir vielleicht auch mal ansehen (hat aber das gleiche Problem, auch dazu muss ein Block mit Attributen in der DWG vorhanden sein.


HTH, - alfred -

------------------
www.hollaus.at

Gloem
Mitglied
Geoinformatiker


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

Beiträge: 181
Registriert: 07.12.2007

Windows 10 - 64 Bit, mindestens 16 GB RAM
<P>AutoCAD Map 2020, VBA, Dot-Net

erstellt am: 24. Jun. 2011 14:10    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

Ok, vielen Dank für deine superschnelle Antwort

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