Autor
|
Thema: Attribute aus AutoCAD in Array auslesen und verarbeiten (1052 mal gelesen)
|
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002 AutoCAD 2021 64-bit Windows 10 64-bit Home Premium AMD Phenom II X6 1055T, 2,8GHz, 8GB RAM
|
erstellt am: 06. Jul. 2003 10:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich schreibe gerade ein Programm, mit dem ich gleiche Attribute in mehreren AutoCAD-Zeichnungen ändern kann (z.B. im Zeichnungskopf das Datum oder der Bearbeiter usw.) Dazu lese ich Attribute eines Blockes aus einer Referenzzeichnung mit "GetAttributes" in einen Array ein. Diese Attribute werden in einem Formular in Textboxen eingetragen (ähnlich wie bei dem Formular welches mit dem befehl DDATTE in AutoCAD erscheint). In diesem Formular kann ich, je nach Attributanzahl, vorwärts und rückwärts blättern und mir die aus dem Block ausgelesenen Attribute anzeigen lassen. Jetzt zu meinem Problem: Ich möchte per Checkbox diejenigen Attribute in dem Formular markieren, welche ich ändern möchte. Diese markierten Attribute werden weiter verarbeitet, alle anderen Attribute werden nicht mehr benötigt. Wie kann ich dies in dem aus der Zeichnung ausgelesenen (ursprünglichen) Array realisieren? D.h. die nicht mehr benötigten Attribute sollten aus dem Array entfernt werden und die in den Textboxen geänderten Attributwerte sollten die ursprünglichen Attributwerte im Array überschreiben, damit ich mit diesem modifizierten Array die Attribute in weiteren Zeichnungen ändern kann. Wer hat einen Tipp oder kann weiter helfen?? Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rigobert Mitglied Konstrukteur
Beiträge: 239 Registriert: 21.11.2001 SWX 2021 zu Risiken und Nebenwirkungen fragen Sie besser gar nicht erst. Visual Studio 2019
|
erstellt am: 07. Jul. 2003 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangSCH
Hallo Wolfgang, klingt doch eigentlich alles machbar. Habe selber mal eine ähnliche Routine geschrieben, den Code der die Attribute ausliest und ändert hab ich mal aufgelistet, vielleicht hilft´s ja. Sonst beschreib mal genauer wo was hakt.. hier der Code : Public Function SetCustomer(Kundenname As String, Kommissionsnummer As String) As String Rem hier wird Autocad angewiesen in das Schriftfeld Rem den Kundennamen und die Kommissionsnummer einzutragen. Rem zusätzlich wird der Dateiname und das Plotdatum in den Zeichnungsrahmen eingefügt Dim mspace As AcadModelSpace ' Modelbereich Dim SFeldBlock As AcadBlock ' die Beschreibung des Blocks Schriftfeld in der aktuellen Zeichnung Dim SFeldBlockref As AcadBlockReference ' das Schriftfeld im Modellbereich Dim varAttributes As Variant ' Array in dem die Attribute abgelegt (und verändert ) werden Dim FullName As String On Error GoTo Fehlerbehandlung Set ACAD = GetObject(, "AutoCAD.Application") Set activeDoc = ACAD.ActiveDocument FullName = activeDoc.FullName Set mspace = ACAD.ActiveDocument.ModelSpace For i = 0 To mspace.Count - 1 If mspace.Item(i).ObjectName = "AcDbBlockReference" Then Select Case mspace.Item(i).Name Case "XYZ-TITLE" ' aktuelles Zeichenformat Set SFeldBlockref = mspace.Item(i) ' z.B.: 123-456-789 varAttributes = SFeldBlockref.GetAttributes varAttributes(8).TextString = Kommissionsnummer varAttributes(7).TextString = Kundenname varAttributes(20).TextString = Date & " " & Time varAttributes(21).TextString = "Dateiname : " & FullName Exit For End Select End If Next i ACAD.Update Fehlerbehandlung: If Err.Number = 0 Then SetCustomer = "SetCustomer : Kein Fehler" Else SetCustomer = "SetCustomer : " & Err.Description Err.Clear End If End Function Gruß Rigo
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 07. Jul. 2003 08:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Rigo, danke für Deine schnelle Antwort. Das Auslesen der Attribute in ein Array ist nicht das Problem. Ich möchte die Attributbezeichnung aus dem Array in einem Formular in Textboxen darstellen, darin ändern und nur die geänderten Attribute wieder weiterverarbeiten. Also z.B. im Array Block Kopfdaten (Revision, Revisiondsdatum, Bearbeiter usw.) werden im Formular die Elemente Array.TagString (Bearbeiter) und Array.TagText (Klaus Mustermann) usw. in der Textbox dargestellt. Dann möchte ich einige dieser Eintragungen in der Textbox ändern und diese Änderungen in weiteren Zeichnungen mit den gleichen Attributen auch anwenden. Ich stelle mir vor die Elemente TagString und TagText in Varable zu speichern und diese in Textboxen darzustellen, darin zu ändern und weiter zu verarbeiten. Wie bekomme ich jedoch die Elemente aus dem Array in die Variablen, also z.B. Array(0).TextString in Attrib(0), Array(1).TextString in Attrib(1) usw. Das funktioniert bei mir nicht. Oder hast Du eine andere Idee wie ich mein Vorhaben realisieren kann?? Gruß Wolfgang
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rigobert Mitglied Konstrukteur
Beiträge: 239 Registriert: 21.11.2001 SWX 2021 zu Risiken und Nebenwirkungen fragen Sie besser gar nicht erst. Visual Studio 2019
|
erstellt am: 07. Jul. 2003 09:38 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangSCH
Hallo Wolfgang, habe einfach mal in den Code folgende Zeilen eingefügt, '******************************************************************* Dim attrib(0 To 9) As String ' Deine Variable für die Texte '******************************************************************* '******************************************************************* ' hier werden die Inhalte der Attribute den VAriablen zugewiesen und ' anschliessend in ein MsgBox angezeigt For j = 0 To 9 attrib(j) = varAttributes(j).TextString Next j For j = 0 To 9 MsgBox "attrib(" & j & ") = " & attrib(j) Next j '******************************************************************* Das hat bei mir einwandfrei funktioniert. Vielleicht hilft´s Dir ja weiter. hier der neue Code : Public Function SetCustomer(Kundenname As String, Kommissionsnummer As String) As String Rem hier wird Autocad angewiesen in das Schriftfeld Rem den Kundennamen und die Kommissionsnummer einzutragen. Rem zusätzlich wird der Dateiname und das Plotdatum in den Zeichnungsrahmen eingefügt Dim mspace As AcadModelSpace ' Modelbereich Dim SFeldBlock As AcadBlock ' die Beschreibung des Blocks Schriftfeld in der aktuellen Zeichnung Dim SFeldBlockref As AcadBlockReference ' das Schriftfeld im Modellbereich Dim varAttributes As Variant ' Array in dem die Attribute abgelegt (und verändert ) werden Dim FullName As String '************************************************************ Dim attrib(0 To 9) As String ' Deine Variable für die Texte '************************************************************ On Error GoTo Fehlerbehandlung Set ACAD = GetObject(, "AutoCAD.Application") Set activeDoc = ACAD.ActiveDocument FullName = activeDoc.FullName Set mspace = ACAD.ActiveDocument.ModelSpace For i = 0 To mspace.Count - 1 If mspace.Item(i).ObjectName = "AcDbBlockReference" Then Select Case mspace.Item(i).Name Case "XYZ-TITLE" ' dies sollte der Name Deines Blocks sein Set SFeldBlockref = mspace.Item(i) ' z.B.: 123-456-789 varAttributes = SFeldBlockref.GetAttributes '******************************************************************* ' hier werden die Inhalte der Attribute den VAriablen zugewiesen und ' anschliessend in ein MsgBox angezeigt For j = 0 To 9 attrib(j) = varAttributes(j).TextString Next j For j = 0 To 9 MsgBox "attrib(" & j & ") = " & attrib(j) Next j '******************************************************************* varAttributes(8).TextString = Kommissionsnummer varAttributes(7).TextString = Kundenname varAttributes(20).TextString = Date & " " & Time varAttributes(21).TextString = "Dateiname : " & FullName Exit For End Select End If Next i ACAD.Update Fehlerbehandlung: If Err.Number = 0 Then SetCustomer = "SetCustomer : Kein Fehler" Else SetCustomer = "SetCustomer : " & Err.Description Err.Clear End If End Function
Gruß Rigo
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 07. Jul. 2003 10:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Rigo, danke für Deine schnelle Hilfe. Ich habe beim Deklarieren des Arrays einen Fehler gemacht. Dank Deinem Beispiel klappt es jetzt auch bei mir. Jedoch besteht noch folgendes Problem: Du hast den Array mit Konstanten deklariert (Dim attrib(0 To 9) As String). Ich kann zwar die Anzahl der Attribute im Array ermitteln (AnzAttr = UBound(attrib), benötige für die Deklaration jedoch eine Konstante (Du gehst von 9 Attributen aus). Die "9" kann jedoch nicht durch die Variable AnzAttr ersetzt werden. Da verlangt der Rechner eine Konstante! Wie kann ich das realisieren, da ich im Voraus nicht weiss, wieviel Attribute sich im Array befinden. Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rigobert Mitglied Konstrukteur
Beiträge: 239 Registriert: 21.11.2001 SWX 2021 zu Risiken und Nebenwirkungen fragen Sie besser gar nicht erst. Visual Studio 2019
|
erstellt am: 07. Jul. 2003 11:23 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangSCH
Hallo Wolfgang, das müßte eigentlich mit nachfolgendem Code funktionieren : Dim attrib() As String ' Deine Variable für die Texte wenn Du dann die Anzahl der Attribute weißt, kannst Du das Feld neu definieren mit :
Redim attrib(0 to Anzahl) as String das sollte dann funktionieren..
Viel Erfolg Gruß Rigo ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 07. Jul. 2003 11:26 <-- editieren / zitieren --> Unities abgeben:
|
Rigobert Mitglied Konstrukteur
Beiträge: 239 Registriert: 21.11.2001 SWX 2021 zu Risiken und Nebenwirkungen fragen Sie besser gar nicht erst. Visual Studio 2019
|
erstellt am: 07. Jul. 2003 11:52 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangSCH
|