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

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 30. Sep. 2008 17:06 <-- editieren / zitieren --> Unities abgeben:         
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

 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 / zitieren --> Unities abgeben:          Nur für steffen.katzschke
|
steffen.katzschke Mitglied Planungsingenieur

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 30. Sep. 2008 17:42 <-- editieren / zitieren --> Unities abgeben:         
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

 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 / zitieren --> Unities abgeben:          Nur für steffen.katzschke
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

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 01. Okt. 2008 09:31 <-- editieren / zitieren --> Unities abgeben:         
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

 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 / zitieren --> Unities abgeben:          Nur für steffen.katzschke
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

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 01. Okt. 2008 12:05 <-- editieren / zitieren --> Unities abgeben:         
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

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 06. Okt. 2008 12:45 <-- editieren / zitieren --> Unities abgeben:         
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
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 06. Okt. 2008 12:50 <-- editieren / zitieren --> Unities abgeben:          Nur für steffen.katzschke
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

 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 / zitieren --> Unities abgeben:          Nur für steffen.katzschke
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

 Beiträge: 13 Registriert: 08.03.2005
|
erstellt am: 07. Jan. 2009 13:01 <-- editieren / zitieren --> Unities abgeben:         
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 >>)
 |