| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Variable mit Backslash speichern und wieder einlesen (534 / mal gelesen)
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 01. Okt. 2023 16:29 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte eine Variable in eine Datei speichern und wieder einlesen, diese mache ich schon seit fast 30 Jahren so und klappt prima. Jetzt stehe ich vor dem Problem das ich einen Backslash mit speichern möchte und das klappt leider nicht. In einer edit_box gebe ich "\X2.01" ein um die Zahl "2.01" unter der Masslinie zu Plazieren. Beim schließen des Fensters werden die Werte in eine Datei geschrieben. (setq SUFF_L (get_tile "SUFF_L")) ergibt "\\X2.01" also 2 Backslash ist auch OK und wird dann auch so weiter im Programm verarbeitet. Dann schreibe ich mit (write-line (strcat "(setq SUFF_L \"" SUFF_L "\")") EIN) in die Datei. In der Datei steht dann (setq SUFF_L "\X2.01") mit einem "\" Beim nächsten Programmaufruf möchte ich gerne den Letzten Wert wieder als Vorgabe haben. Lade ich diese Datei wieder mit (load MeineDatei.ini) und prüfe ich die Variable "SUFF_L" steht dort schon der Wert "X2.01", also ist beim laden schon der "\" verschunden, fülle ich die edit_box mit dem Wert steht dort natürlich nur "X2.01". Als schnell Lösung könnte ich natürlich beim schreiben in die Datei ein "\" voran stellen. (write-line (strcat "(setq SUFF_L \"\\" SUFF_L "\")") EIN) Was ist aber wenn ich weitere Steuerzeichen mit einem "\" in der edit_box habe? Oder muß ich den ganzen Text aus der edit_box auf "\" unter suchen und gegeben Falls alle "\" gegen "\\" austauschen? Ich habe natürlich die Hilfe rauf und runter durchsucht und etliches ausprobiert aber leider ohne Erfolg. Hat da jemand einen Tipp für mich? Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Okt. 2023 20:50 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Zum einen könntest du, wenn nichts dagegen spricht, (doppel)Backslash einfach gegen Slash tauschen. Ansonsten deine "Schnelllösung", natürlich aufgebohrt für den Fall das es mehrere Backslashs gibt. Zum anderen die Frage: Warum überhaupt die SETQ- Anweisung in die Datei schreiben? Die Info warum du das machst, statt einfach nur dem Textwert, die liegt uns nicht vor - daher die Frage. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 01. Okt. 2023 21:55 <-- editieren / zitieren --> Unities abgeben:
Die Textüberschreibung mag keinen Slash nur einen "\\" die "2.01" sollen ja unter die Maßlinie und dafür muß ich halt den "\\" haben der ja erzeugt wird wenn ich das DCL-Fenster schieße. Zitat: Zum anderen die Frage: Warum überhaupt die SETQ- Anweisung in die Datei schreiben? Die Info warum du das machst, statt einfach nur dem Textwert, die liegt uns nicht vor - daher die Frage.
Das habe ich mir vor vielen Jahren angewöhnt um Datanorm Setsätze zu erzeugen, da bei uns Elektrikern z.B. eine Ausschaltung immer die gleichen Bauteile haben, die Artikelnummern beim Großhandel aber für jeden Hersteller anders sind. Z.B. der Schalter von Gira hat die Nr. 1234 und der Schalter von Berkerhat die Nr. 4567 um die Datensätze zu erstellen tausche ich die INI-Datei für die Hersteller einfach aus und kann somit Datensätze mit unterschiedlichen Schalterhersteller erstellen. Das geht sehr schnell und hat sich bewährt. Als Beispiel für Gira: (setq WECHSEL "3031305") (setq AUS_2POL "3031307") (setq KONTROLL "3031311") (setq KONTROLL_2P "3031312") (setq KREUZ "3031306") Als Beispiel für Berker: (setq WECHSEL "3019970") (setq AUS_2POL "3019966") (setq KONTROLL "3019970") (setq KONTROLL_2P "3019966") (setq KREUZ "3019971") Darum die setq Anweisung in der Datei. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Okt. 2023 22:35 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Slash, da hatte ich wohl einen Aussetzer, sorry. Da ich ohnehin von den SETQ weg wollte, habe ich das wohl nicht recht bedacht. Eine Lösung mit "ordentlicher" schreib-ini, lese-ini Funktion würde das Problem mit dem Backslash nicht umgehen. Muss halt gemacht werden, oder ich habe Tomaten auf den Augen, was ich gerade nicht ausschließen kann. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 02. Okt. 2023 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Zitat: Original erstellt von Niggemann: Als Beispiel für Gira: (setq WECHSEL "3031305") (setq AUS_2POL "3031307") (setq KONTROLL "3031311") (setq KONTROLL_2P "3031312") (setq KREUZ "3031306") Als Beispiel für Berker: (setq WECHSEL "3019970") (setq AUS_2POL "3019966") (setq KONTROLL "3019970") (setq KONTROLL_2P "3019966") (setq KREUZ "3019971") Darum die setq Anweisung in der Datei.
Das funktioniert aber genau so gut mit Weglassen des 'SETQ wie (WECHSEL "3031305") (AUS_2POL "3031307") usw., und noch besser wäre es, diese Daten nur einmal in der DWG zu speichern, und zwar als Assoc-Liste: ((WECHSEL "3031305") (AUS_2POL "3031307") ... ) Und das kannst Du für den Fall, dass Produkte verschiedene Hersteller in einer einzigen DWG Verwendung finden, noch zu einer Assoc-Liste erweitern, die auch die Hersteller berücksichtigt: ( (GIRA (WECHSEL "3031305") (AUS_2POL "3031307") ... ) (BERKER (WECHSEL "3019970") (AUS_2POL "3031307") ... ) ) Nachtrag, weil nicht jeder das weiß: Falls Du das dann überhaupt noch brauchst, kannst Du alle Deine Variablen für einen Hersteller (beispielsweise (setq hersteller 'BERKER)) dann aus dieser Assoc-Liste mit einer einzigen Anweisung setzen, beispielsweise (mapcar 'SETQ (cdr (assoc hersteller datenliste))) [Diese Nachricht wurde von archtools am 02. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 02. Okt. 2023 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo Niggemann, ich habe einganz ähnliches Problem, DCL-Dateien als Textdatei zu schreiben, dan nutze ich folgende Funktion: Code:
;;;Backslash hinzufügen (defun Text2Dcl:Slash (string / A) (vl-list->string (cons 34(reverse(cons 34(reverse (apply 'append (mapcar '(lambda(A) (if (member A '(92 34)) (list 92 A) (list A))) (vl-string->list string))))))) ))
Bei Backslashes und Anführungszeichen werden automatisch Backslashe hinzugefügt. In Deinem Fall könntest Du das wie folgt nutzen: (strcat "(setq SUFF_L "(Text2Dcl:Slash "\\X2.01")")") In der Befehlszeile kannst Du das wie folgt testen: Befehl: (strcat "(setq SUFF_L "(Text2Dcl:Slash "\\X2.01")")") "(setq SUFF_L \"\\\\X2.01\")" Befehl: (eval(read(strcat "(setq SUFF_L "(Text2Dcl:Slash "\\X2.01")")"))) "\\X2.01" Befehl: !Suff_l "\\X2.01" Vielleicht hilft es ja, ich finde das mit den Sonderzeichen immer ziemlich furchtbar. ------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 02. Okt. 2023 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo Also wenn (setq SUFF_L (get_tile "SUFF_L")) das ergibt "\\X2.01" dann so scheiben (write-line (vl-prin1-to-string SUFF_L) EIN) In der Datei steht dann das "\\X2.01" und lesen (setq SUFF_L (read-line EIN)) ergibt wieder "\\X2.01" hoffe ich hatte jetzt keinen Denkfehler und habe die frage richtig verstanden.
------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 02. Okt. 2023 14:26 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 02. Okt. 2023 20:07 <-- editieren / zitieren --> Unities abgeben:
Problem gelöst Abendteuerlich aber es geht Speichern: (write-line (strcat "SUFF_L " (vl-prin1-to-string SUFF_L)) EIN) Ergebnis: "SUFF_L \"\\\\X\\\\C1;2.10\"" Lesen in einer while, da ich noch mehr Variablen in der INI-Datei hab (while (setq Z (read-line AUS)) (if (vl-string-search "SUFF_L" Z) (setq SUFF_L (read (strcat (vl-string-trim "SUFF_L" Z))))) ) Ergebnis: "\\X\\C1;2.10" In der edit_box steht dann: "\X\C1;2.10" und weil es so schön funktioniert hab ich den Masstext unter der Bemassungslinie in rot ausgegeben, etwas Spass mus ja sein. Warum ich wieder auf setq gegangen bin ist ganz einfach beim aufrufen des DCL-Fenster mache ich diese Abfrage: (if (not SUFF_L) (set_tile "SUFF_L" (setq SUFF_L "\\X2.01"))(set_tile "SUFF_L" SUFF_L)) Ist die INI-Datei beschädigt oder fehlt wird ein Standart Wert gesetzt ansonsten der Wert aus der INI-Datei, beim schliessen des Fensters wird dann die INI-Datei neu erstellt und steht beim nächsten Aufruf wieder zur Verfügung. Wer eine schöner Lösung dafür hat, ich bin für alles offen. Mit den Sonderzeichen bin ich auch der Meinung einfach furchtbar. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Okt. 2023 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
nochmal dazu. obwohl du deine Lösung hast. Deine ini Struktur erschließt sich mir nicht ganz warum schreibst du nicht alles untereinander Vari. Name darunter der Wert. Oder gleich als dottet pair oder gar als XML-Datei. das nur am Rande. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Okt. 2023 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Dieser erste Gedanke klingt gut, aber beim zweiten <ob hier zutreffend oder nicht> Schreib mal dotted pairs, bedenke TEXT UND ZAHL Werte, und ggf auch so ein Text: "012345" Schon hast du dasselbe Thema. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Okt. 2023 11:00 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
So ! (setq SUFF_L "\\X2.01") (setq SUFF_L "012343") (setq SUFF_L(read(vl-prin1-to-string(vl-list* 'SUFF_L SUFF_L)))) Editiert so muss es dann mit set sein (setq SUFF_L "\\X2.01") (setq SUFF_L "012343") (setq temp(read(vl-prin1-to-string(vl-list* 'SUFF_L SUFF_L)))) (set (car temp)(cdr temp))) ------------------ Gruß Wolfgang [Diese Nachricht wurde von Meldin am 03. Okt. 2023 editiert.] [Diese Nachricht wurde von Meldin am 03. Okt. 2023 editiert.] [Diese Nachricht wurde von Meldin am 03. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 03. Okt. 2023 14:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, meine INI-Datei sieht so aus: ;Datei nicht edetieren sie gehöhrt zu BBM.LSP N_KOMMA_L "2" PRAE_L "" SUFF_L "\\X\\C1;2.10" N_KOMMA_W "2" PRAE_W "" SUFF_W "" N_KOMMA_D "2" PRAE_D "" SUFF_D "" HOEHE "0.8" Bitte bedenke das ich Handwerker bin und es so am besten nach vollziehen und lesen kann wenn ich später mal in die Datei rein schaue so hab ich alles in einer Zeile und brauche auch nur eine Zeile bearbeiten. Noch ein Hinweis zu "read", read kann ab ACAD2004 nur noch 4000 Zeichen lesen vor ACAD2004 waren es wohl mehr. Lt. Readme von ACAD2004 Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Okt. 2023 14:47 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Und mit meinem Vorschlag würde sie so aussehen. Macht doch kaum einen Unterschied (N_KOMMA_L . "2") (PRAE_L . "") (SUFF_L . "\\X\\C1;2.10") (N_KOMMA_W . "2") (PRAE_W . "") (SUFF_W . "") (N_KOMMA_D . "2") (PRAE_D . "") (SUFF_D . "") (HOEHE . "0.8") ------------------ Gruß Wolfgang [Diese Nachricht wurde von Meldin am 03. Okt. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 03. Okt. 2023 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Zitat: Original erstellt von Meldin: Und mit meinem Vorschlag würde sie so aussehen. Macht doch kaum einen Unterschied (N_KOMMA_L . "2") (PRAE_L . "")
Ich verwende praktisch nie Dotted Pairs für meine Datenhaltung. Sinn macht das doch sowieso nur dann, wenn man wie in den DXF-Daten der Entities auch Listen als Daten haben will, und sich dafür den Overhead eigener Listen sparen will. Man kann sowohl auf (8 . "MYLAYER") als auch auf (10 1 2 3) gleichermaßen mit CDR zugreifen, und kriegt im einen Fall den Layernamen, im anderen die Liste eines 3D-Punkts zurück. Man kann aber genau so gut (8 "MYLAYER") und (10 (1 2 3)) verwenden, und jeweils mit CADR auf die Werte zugreifen. (10 (1 2 3)) ist bzgl der internen Datenhaltung halt nicht ganz so sparsam wie (10 1 2 3). Das Ganze hat mit dem Aufbau von Listen in Lisp zu tun. Eine Liste besteht intern immer aus einem Pointer auf das erste Listenelement und einem Pointer auf den ganzen Rest. Jede Liste wird intern immer als Dotted Pair (car . cdr) gespeichert. Der Vorteil der Dotted Pairs war früher mal, als man den Arbeitsspeicher eines Rechners in kByte gemessen hat, einigermaßen relevant. Heute nicht mehr. Heute ist es mir wichtiger, die Datenhaltung leicht nachvollziehbar zu gestalten. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Okt. 2023 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Ja, genau darum ging es, eine Strucktur da wie von Niggemann beschriebe er diese auch als Klartext lesen will, ob der Punkt dazwischen jetzt den unterschied macht, glaube ich auch nicht. Viel wichtiger von dem String gehampel weg zu einer Liste. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 03. Okt. 2023 16:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, du hast recht der Unterschied macht nichts aus. Ich verstehe aber nicht die Vor- und Nachteile der beiden Varianten am Ende habe ich doch eh 9 Variablen in der DWG. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Okt. 2023 16:55 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Du kannst sofort deine Daten aus einer Liste in eine variable legen ohne das due mit so einem Konstrukt Zitat: (while (setq Z (read-line AUS)) (if (vl-string-search "SUFF_L" Z) (setq SUFF_L (read (strcat (vl-string-trim "SUFF_L" Z)))) ) )
anfängst danach zu suchen, was meines Erachtens viel störanfälliger ist. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 03. Okt. 2023 17:20 <-- editieren / zitieren --> Unities abgeben:
|