| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Attribute Synchronisieren mit .Net (1216 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 01. Feb. 2013 12:47 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, eine frage zum Wochende. Ich ersetze in einer Zeichnung eine Blockdefinition durch eine Externe Zeichnung. Klappt soweit ganz gut. Wenn es ein Dynamischer Block ist, dann Update ich danach die Blockreferenzen. Aber was mache ich wenn die neue Blockdefinition Attribute enthält? Diese müssten dan Synchronisiert werden. Wie krieg ich das hin? Danke Theo Sub ReadDWGakt(Datei As String, Block As String) Dim TDB As Database Dim NewBlockID As ObjectId Dim NewBlock As BlockTableRecord Dim Blockref As BlockReference TDB = New Database(False, True) TDB.ReadDwgFile(Datei, IO.FileShare.None, True, "") NewBlockID = Mydb.Insert(Block, TDB, False) Using TrAct As Transaction = tAcadDoc.TransactionManager.StartTransaction() NewBlock = TrAct.GetObject(NewBlockID, OpenMode.ForRead) If NewBlock.IsDynamicBlock Then NewBlock.UpdateAnonymousBlocks() If NewBlock.HasAttributeDefinitions Then SYNCHRONISIEREN() End Using If TDB IsNot Nothing Then TDB.CloseInput(True) : TDB.Dispose() : TDB = Nothing Myeditor.Regen() MsgBox(Block & " wurde erfolgreich ersetzt.") End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 01. Feb. 2013 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo, schau mal hier, da ist bestimmt auch das beantwortet, was du suchst (suchen wäre auch eine Empfehlung, bevor man jede Frage, die man auf den Lippen hat, auch postet) Grüße! Holger ------------------ Holger Brischke FREIE SCHULUNGSPLÄTZE -- C#.NET-Schulung im Mai 2013 Bei Interesse bitte melden! CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 19. Feb. 2013 11:51 <-- editieren / zitieren --> Unities abgeben:
Hi Holger, Suchen ist ja immer gut. Nur in diesem Fall habe ich nichts gefunden. Darum hab ich mal nen eignen Lösungsansatz verwirklicht. Ich lösche einfach die alten Attribute und erstelle neue. Bestimmt etwas heikel, aber es scheint zu funktionieren (wobei ich noch nicht viel getestet habe). Wenn jemand Verbesserungsvorschläge zu dem Code unten hat, würden mich sehr interesiern. Wenn es jemand selber verwenden möchte, gern (aber ohne jede Garantie) Gruß, Theo Public Class Synchro Structure Attri Dim Text As String Dim Tag As String End Structure Dim MyEditor As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim dbdoc As Database = acDoc.Database <Autodesk.AutoCAD.Runtime.CommandMethod("AttSyn")> _ Public Sub AttSyn() Dim MyID As ObjectId Dim Editorresult As PromptEntityResult Dim myPDO As New PromptEntityOptions("Bitte einen Block mit Attributen wählen: ") Dim MyBlock As BlockReference Dim Myname As String Dim Myblockrecord As BlockTableRecord Dim MyBlockIds As ObjectIdCollection Dim Myblockref As BlockReference Dim MyNewAttriCol As Collection = New Collection Dim MyAttref As AttributeReference Dim MyEnt As Entity Dim a As Integer Dim TempValue As String Dim TempTag As String Dim MyAttriDef As AttributeDefinition Dim MyOldEinträge() As Attri Dim Eintrag As Attri Dim DelID As ObjectId Dim IsDyn As Boolean myPDO.SetRejectMessage("Bitte einen Block mit Attributen wählen!") myPDO.AddAllowedClass(GetType(BlockReference), False) Editorresult = MyEditor.GetEntity(myPDO) If Editorresult.Status = PromptStatus.None Then Exit Sub If Editorresult.Status = PromptStatus.Cancel Then Exit Sub If Editorresult.Status = PromptStatus.OK Then MyID = Editorresult.ObjectId Using TrAct As Transaction = dbdoc.TransactionManager.StartTransaction() MyBlock = CType(TrAct.GetObject(MyID, OpenMode.ForRead, False, True), Entity) Myblockrecord = TrAct.GetObject(MyBlock.DynamicBlockTableRecord, OpenMode.ForRead) If Myblockrecord.HasAttributeDefinitions Then ' holen der Attributdeffinitionen aus der Blockdef For Each MyID In Myblockrecord MyEnt = TrAct.GetObject(MyID, OpenMode.ForRead, False, True) If TypeOf MyEnt Is DatabaseServices.AttributeDefinition Then MyNewAttriCol.Add(MyEnt) Next Myname = Myblockrecord.Name 'holen der Blockreferenzen If Myblockrecord.IsDynamicBlock Then MyBlockIds = GetDynamicBlockRefIDs(Myname, dbdoc.BlockTableId) IsDyn = True Else MyBlockIds = Myblockrecord.GetBlockReferenceIds(True, False) IsDyn = False End If 'für jede Blockreferenz For Each MyID In MyBlockIds Myblockref = TrAct.GetObject(MyID, OpenMode.ForWrite) ReDim MyOldEinträge(Myblockref.AttributeCollection.Count - 1) 'Speichern der alten AttributWerte For a = 0 To Myblockref.AttributeCollection.Count - 1 Try MyAttref = TrAct.GetObject(Myblockref.AttributeCollection(a), OpenMode.ForRead, True, True) Eintrag.Tag = MyAttref.Tag Eintrag.Text = MyAttref.TextString MyOldEinträge(a) = Eintrag Catch Eintrag.Tag = "" Eintrag.Text = "" MyOldEinträge(a) = Eintrag End Try Next 'Löschen der alten Attribute For Each DelID In Myblockref.AttributeCollection MyAttref = TrAct.GetObject(DelID, OpenMode.ForWrite, True, True) MyAttref.Erase() Next 'Erstellen der neuen Attribute For Each MyAttriDef In MyNewAttriCol 'Holen des Alten Wertes wenn vorhanden TempValue = MyAttriDef.TextString TempTag = MyAttriDef.Tag For a = 0 To MyOldEinträge.Length - 1 Eintrag = MyOldEinträge(a) If Eintrag.Tag.ToUpper = TempTag.ToUpper Then TempValue = Eintrag.Text MyOldEinträge(a).Tag = "" MyOldEinträge(a).Text = "" TempTag = " " End If Next 'Neues Attribut erstellen Dim MynewAttref As AttributeReference = New AttributeReference MynewAttref.SetAttributeFromBlock(MyAttriDef, Myblockref.BlockTransform) MynewAttref.TextString = TempValue Myblockref.AttributeCollection.AppendAttribute(MynewAttref) TrAct.AddNewlyCreatedDBObject(MynewAttref, True) Next Next 'Die Dynamik wieder herstellen falls es ein dynamischer Block ist If IsDyn Then Myblockrecord.UpdateAnonymousBlocks() Else MsgBox("Dieser Block hat keine Attribute") End If TrAct.Commit() End Using End If End Sub End Class Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|