Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Attribute Synchronisieren mit .Net

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:  Attribute Synchronisieren mit .Net (1216 mal gelesen)
Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 01. Feb. 2013 12:47    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 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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 01. Feb. 2013 12:57    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 Theo37 10 Unities + Antwort hilfreich

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



Projektbearbeiter (m/w/d) für Stadtentwicklungs- / Stadterneuerungsprojekte (Architekten, Landschaftsarchitekten, Regionalplaner, Stadtplaner)

Die BIG Städtebau GmbH ist spezialisiert auf die Konzeptionierung und Durch­führung inno­vativer Stadt­entwicklungs­projekte. Als erfahrener Sanierungs­träger haben wir das Ziel, attraktive Lebens­räume für alle zu schaffen. Als Teil der BIG-BAU sind wir Vorreiter in der Verknüpfung der Bereiche Stadt-, Flächen- und Projekt­entwicklung. Wir sind immer auf der Suche nach klugen Köpfen, die mit uns neue Wege beschreiten und an Heraus­forderungen wachsen....

Anzeige ansehenProjektmanagement
Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 19. Feb. 2013 11:51    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

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 >>)

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