| |  | 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
 
 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 / zitieren --> Unities abgeben:         
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 / zitieren -->
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
 
 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 / zitieren --> Unities abgeben:         
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 / zitieren -->
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
 
 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 / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |