Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Blocktausch und Datentransfer

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 präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
Autor Thema:  Blocktausch und Datentransfer (3087 mal gelesen)
steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 30. Sep. 2008 17:06    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

Windows 2000 +SP4, ACAD 2000

Ich mußte mal wieder das alte CAD reaktivieren, da bei LT-Versionen die VBA-Schnittstelle fehlt.
Aus einem CAE-System wurden Pläne exportiert. Diese dwg-Zeichnungen haben Zeichnungsrahmen. Die Zeichnungsrahmen sind als Blöcke angelegt. Diese enthalten Attribute mit Daten, die per Dialog editierbar sind.
Folgende Punkte sind zu erledigen

    - Erkennen des Rahmens,
    - Auslesen der Attribute,
    - externe Speicherung der Daten,
    - Löschen des Rahmens,
    - Einsetzen eines neuen Rahmens (Block),
    - Eintragen einiger Daten aus den vorher gespeicherten Daten.

Ich bin eher in Excel zuhause, also mit den ACAD-Objekten nicht so vertraut. Das Schmökern in der Literatur und diesem Forum hat folgendes Testmakro hervorgebracht:

Code:
Public Sub test_block_attr()
    'alle Bloecke der aktuellen Zeichnung und deren Attribute ermitteln
    'Ausgabe der Namen und Werte in Textdatei
   
Dim Pfad As String
Dim Block As AcadBlock
Dim BlockVerweis
Dim Attribut
Dim Attribut_Tag As String      'Bezeichner
Dim Attribut_Prompt As String  'Eingabeaufforderung
Dim Attribut_Text As String    'Wert
Dim TextKette As String
Dim Antwort As Integer


    Pfad = "C:\...\testausgabe.txt"
   
    Open Pfad For Output As #1

   
    MsgBox ThisDrawing.Name
   
    ThisDrawing.PurgeAll
   
   
    For Each Block In ThisDrawing.Blocks
   
        If Left(Block.Name, 1) <> "*" _
            And InStr(1, Block.Name, "|") = 0 _
            And Block.IsXRef = False Then
           
            Print #1, Block.Name
           
            Set BlockVerweis = ThisDrawing.Blocks(Block.Name)
                       
            For Each Attribut In BlockVerweis
               
                If TypeName(Attribut) = "IAcadAttribute" Then
                   
                    TextKette = "    " & _
                                Attribut.TagString & ";" & _
                                Attribut.PromptString & ";" & _
                                Attribut.TextString & ";" & _
                                Attribut.Invisible & ";" & _
                                Attribut.Constant & ";" & _
                                Attribut.Verify
                               
                    Print #1, TextKette
                                           
                End If
               
            Next
                           
            If Block.Name = "SF_INHALT_SLP_CU" Then
                ThisDrawing.Blocks(Block.Name).Delete
            End If
               
        End If
            'wenn Block
                'nicht externe Referenz
                'nicht anonym
   
    Next Block

    Close #1

End Sub


Der Stil läßt sicher zu wünschen übrig. Ich bitte um Nachsicht.
Das Auflisten der Blöcke und Attribute scheint zu funktionieren.
Bei den Attributen werden Tag und Prompt erkannt und ausgegeben. Aber es werden nicht immer die Texte (TextString) zu den Attributen ausgegeben. Im ACAD-Dialog sind diese erkennbar und editierbar. Ich habe auch versucht, per VBA einen TextString zu verändern. In der Zeichnung und im Dialog sind keine Änderungen zu erkennen. Löse ich das obige Makro erneut aus, wird in der Textdatei der geänderte Wert ausgegeben. Man könnte meinen, es gäbe 2 Datensätze in Parallelwelten. Warum man die Blöcke 'normal' ansprechen kann, aber an die Attribute nur über den Verweis auf den Block herankommt, ist mir schleierhaft.
Das andere Problem ist das Löschen des Blocks. Es schlägt fehl, weil mit IAcadBlock etwas nicht stimmen soll. Das Löschen habe ich auch mit

Code:
ThisDrawing.Blocks.Item(Block.Name).Delete
und auch einfach nur
Code:
Block.Delete
versucht. Auch nicht besser.

Was läuft hier falsch?

Die nächste Hürde wäre das Einsetzen und Füllen des neuen Rahmens. Würde ich nicht als schwierig einschätzen, aber das dachte ich bei den bisherigen Schritten auch.

PS: Schickes Forum

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

wronzky
Ehrenmitglied V.I.P. h.c.
CAD-Dienstleistungen für Architekten



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

Beiträge: 2154
Registriert: 02.05.2005

CAD:
AutoCAD 2.6 bis 2014
ADT 2005 - ACA 2013
Arcibem
System:
Windows NT, 2000, XP
Internet-Startseite:
http://www.archi.de

erstellt am: 30. Sep. 2008 17:24    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 steffen.katzschke 10 Unities + Antwort hilfreich

Hallo Steffen,
schau Dir doch mal DIESE ERLÄUTERUNG zu Blöcken an. Du wirst sehen, dass Du nicht die BLOCK-Tabelle durchwühlen musst, sondern die Zeichnungselemente nach INSERTs. Dann haben die Attribute auch einen Wert.

Grüsse, Henning

------------------
Henning Jesse
VoxelManufaktur
Computer-Dienstleistungen für Architekten und Ingenieure

  http://www.voxelman.de

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

steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 30. Sep. 2008 17:42    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

Erst mal danke. Ich nehme es als Lektüre auf den Heimweg mit.
Ich habe das Makro aus Beispielen zusammengestückelt. Warum machen es die anderen so?
Und warum habe ich bei einigen Attributen Werte und bei anderen nicht?

Aber, erst die Lektüre!

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2855
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2025
Plateia, Canalis
Visual Basic

erstellt am: 30. Sep. 2008 22:16    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 steffen.katzschke 10 Unities + Antwort hilfreich

Hallo Steffen,

da hast Du Dir ja was vorgenommen und das alles ohne, oder nur mit geringen, Kenntnissen der AutoCAD Internas. Aber nicht verzweifeln, mit etwas suchen kannst Du Dir einiges hier im Form "klauen". 

Nun zu Deinen Fragen:
- Erkennen des Rahmens
Ist dieser ein Block mit bestimmten Namen? (Vermutlich "SF_INHALT_SLP_CU" ?)
Soll er im Modell oder in einem / allen Layouts gesucht werden?

- Auslesen der Attribute
hatten wir schon mal hier

- externe Speicherung der Daten
wenn benötigt wie in Excel, das kennst Du ja
ansonsten, wenn Du die Werte gleich im neuem Rahmen brauchst -> Variable

- Löschen des Rahmens,
wenn Du das Element gefunden hast: block.delete

- Einsetzen eines neuen Rahmens (Block)
Beispiel dazu :hier

- Eintragen einiger Daten aus den vorher gespeicherten Daten.
Vergleiche hier
Kannst Du aber auch gleich mit vorherigem Verbinden, nach dem Einfügen die Attribute abfragen und dem Attribut (Name = .Tagstring ) den Wert ( .Textstring = "was auch immer") zuweisen.
Zum Verständnis der Programmierung hilft vielleicht dieser Beitrag

Viel Spaß,
Klaus 

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

steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 01. Okt. 2008 09:31    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

Moin!

Kurzer Zwischenstand:
Der erste Hinweis war sehr aufschlußreich. Der Hintergrund ist einfach nötig. Ich bin kein Freund der sogenannten Kochbücher, aber anders ist das Verhältnis von Aufwand und Nutzen oft nicht vertretbar.
Ich habe also gestern in der Definition rumgerührt und nicht in der Referenz. Eben habe ich mal den Block (Referenz) gelöscht und neu eingefügt. Und siehe da, der TextString, den ich gestern per VBA geändert habe, war eingetragen. Folglich habe ich gestern wohl die Voreinstellung des Attributes in der Blockdefinition geändert und nicht den 'individuellen' Wert in der Referenz. Vermutlich scheiterte gestern das Löschen, weil ich versucht habe, die Definition zu löschen, aber noch eine Referenz dieser Definition vorhanden war.
Das Beispiel aus dem 2. Hinweis habe ich bei mir implementiert und der Test ist fast zufriedenstellend. TagString und TextString liefern die erwarteten Ergebnisse. Aber an Prompt komme ich nicht mehr ran. Die Zuordnung TagString-Prompt bekomme ich wohl nur aus der Blockdefinition. Schade, aber machbar.
Ich werde noch ein wenig weiterwerkeln. Wenn nichts dazwischen kommt, kann ich heute abend Bericht erstatten.

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2855
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2025
Plateia, Canalis
Visual Basic

erstellt am: 01. Okt. 2008 09: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 Nur für steffen.katzschke 10 Unities + Antwort hilfreich

Hi,
Zitat:
Aber an Prompt komme ich nicht mehr ran.

prompt ist doch nur die Eingabeaufforderung der Attributswerte in der Befehlszeile wenn Du den Block manuell (oder über Sendcommand) in die Zeichnung einfügst. An den kommst Du m.E. wirklich nur über den Blocks-Container. Für das automatische Einfügen per Programm brauchst Du den nicht.

Grüße,
Klaus

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

steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 01. Okt. 2008 12:05    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

TagText lautet bspw. "CODE_60", aber Prompt "Gliederungsebene1". Letzteres ist einfach angenehmer.

Extrahieren der Daten und Löschen der Blockreferenz funktioniert so weit. PurgeAll bereinigt aber nicht alles. Die eingeschachtelten Blöcke scheinen nicht erfasst zu werden.
Ich habe mal vorher den Rahmen per Hand als separate Datei zur Seite gelegt. Dann habe ich in einer vollständigen Zeichnung per VBA den Rahmen entfernt, die Datei mit PurgeAll bereinigt und versucht, den 'externen' Rahmen als Block einzufügen. Ich vermute, der Block hat Blöcke in sich, die auch noch in der zu behandelnden Zeichnung vorhanden sind. Es gab jedenfalls eine Meldung mit "... multiple read...". Es folgte Absturz. Also habe ich die zu behandelnde Zeichnung nach PurgeAll noch per Hand bereinigt. Dann funktionierte das Einfügen, aber mit der Fehlermeldung "Objekt oder With-Variable nicht vorhanden". Die Zeichnung schien aber in Ordnung und eingerahmt.
Da ich ohnehin nur mit Kopien arbeite, werde ich wohl die Strategie ändern:

    - Auslesen der Daten aus dem Rahmen,
    - externes Speichern der Daten (auch zu Doku-Zwecken),
    - Kopieren der Zeichnungsinhalte innerhalb des Rahmens in Tmp-Datei,
    - Öffnen einer Datei mit neuem leeren Rahmen,
    - Schreiben ausgewählter Daten in den Rahmen,
    - Einfügen des Zeichnungsinhaltes aus Tmp-Datei,
    - Speichern der Zeichnung unter neuem Pfad.

Auf diese Weise umgehe ich den Ärger mit eventuellen anderen Zusätzen, wie z.B Logos, Bemerkungen am Zeichnungsrand und weiteren Überraschungen.

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

steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 06. Okt. 2008 12:45    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

Ich habe immer noch Probleme bei der Identifizierung der Attribute bei einer Blockreferenz. Ich habe in einem Block mehrere Attribute mit demselben TagString. Anhand dieser Eigenschaft kann ich also nicht sicher sagen, was ich gerade in der Hand halte. Eine Positionsangabe wie InsertionPoint gibt es wohl nicht. Wie kann man sich orientieren?

Gibt es eigentlich eine Art Objekt- und Eigenschaften-Explorer für die aktuelle Zeichnung?

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13530
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 06. Okt. 2008 12:50    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 steffen.katzschke 10 Unities + Antwort hilfreich

 
Zitat:
Original erstellt von steffen.katzschke:

Gibt es eigentlich eine Art Objekt- und Eigenschaften-Explorer für die aktuelle Zeichnung?

such mal nach DBVIEW.arx

die allegemeine Struktur der Objekte , deren Eigenschaften und Methoden ist in der HILFE -> ActiveX and VBA-Reference ->Object Model .. ganz gut beschrieben.

------------------
      - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2855
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2025
Plateia, Canalis
Visual Basic

erstellt am: 07. Okt. 2008 17:54    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 steffen.katzschke 10 Unities + Antwort hilfreich

Hallo Steffen,

Zitat:
Original erstellt von steffen.katzschke
Ich habe in einem Block mehrere Attribute mit demselben TagString.

Nicht schön - habe heute aber noch eine bessere Zeichnung bekommen. Alle Blockattribute waren im Tagstring leer.
Folge: Nicht zu bearbeiten
Lösung: Per Makro den TagStrings neue Namen gegeben, dann kann man auch mit AttSync und ähnlichem damit arbeiten.
Gleiche TagStrings solltest Du vermeiden bzw. korrigieren

Grüße,
Klaus

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

steffen.katzschke
Mitglied
Planungsingenieur


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

Beiträge: 13
Registriert: 08.03.2005

erstellt am: 07. Jan. 2009 13:01    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

Ich bin's noch mal:

Das Thema ist bei mir längst Geschichte, aber ich wollte hier wenigstens kurz abschließen.
Wirtschaftlich ein Desaster, aber hoffentlich lehrreich.
Ich bin in kleinen Schritten voran gegangen und habe sorgsam an einfachsten Beispielen geübt. Als ich endlich alles zusammen hatte und es auf eine richtige Zeichnung losgließ, fiel mir alles aus dem Gesicht. Zeichnung öffnen, Teil ausschneiden und exportieren, Zeichnung schließen, Vorlage (Rahmen) öffnen, Export wieder importieren ... alles super. Allerdings waren bei dem importierten Zeichnungsteil einige Linien anders dargestellt. Wertlos. Ich habe gar nicht versucht zu verstehen, was da passiert ist. Layer, Linienstyle, Voreinstellungen... ? Stattdessen bin ich in alte Gewohnheiten zurückgefallen und habe mir in Excel-VBA einen Script-Generator gebastelt. Nicht die feine Art, Zeichnungen zu handhaben, aber das Trial&Error-Prozedere blieb überschaubar. Bei dieser Variante habe ich die Originalzeichnung um Rahmen und Randnotizen erleichtert und den Rahmen der Vorlage importiert. Das Ganze habe ich dann unter neuem Pfad gespeichert. Ich habe auch nicht die Daten von einem Rahmen in den anderen übertragen, sondern vorher aus dem CAE gewonnen (wo die Zeichnung ja ursprünglich herstammt) und im Script verbacken.
Fazit: Interessanter Exkurs, aber man sollte schon die höheren Weihen erhalten haben, bevor man sich auf so etwas einlässt. Leider arbeiten wir nur noch sehr selten mit AutoCAD, so dass ich mir dieses Hobby leider verkneifen muss.

Der DB-Viewer hat bei mir übrigens nicht funktioniert. Ich vermute, dass unser AutoCAD zu alt ist.

Auf jeden Fall Dank an alle, die mitgedacht und versucht haben, einem Blinden die Farbe zu erklären.

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