| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: backslash in Zeichenkette (781 / mal gelesen)
|
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 01. Sep. 2016 16:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, bei mir Funktioniert das Taschen des "/" in "\" in einer zeichenkette nicht. Ich weiß es ist schon viel darüber geschrieben worden, aber da ich nur gelegentlich in Lisp schreibe, verzweifle ich gerade. Ich möchte den Hyperlink eines Objektes auslesen (klappt soweit) und dann die Zieldatei mit dem _shell + copy Befehl kopieren. Aber die "/" in "\" vertauscht, und ich bekomme das Umtauschen nicht auf die Reihe. Bitte helft mir auf die Sprünge: Hier der Code: (defun c:Test( / Hyper Str i la str2 ) ;Hyperlink auslesen (setq Hyper (cdr(assoc "PE_URL"(cdr(assoc -3(entget (car(entsel "\nObjekt picken:")) (list "PE_URL")))))) Hyper (car Hyper) ;auf ersten Eintrag reduzieren Hyper (cdr Hyper) ;auf rechten Teil des ersten Eintrags reduzieren Str (strcat "copy " Hyper " c:/lh_fmc") ) ; kopiert aus: http://www.advanced.autolisp.info/strings2.html ; Variablen ersetzt (setq i 1) (setq la(strlen "/")) (setq str2 "") (while(<= i(strlen str)) (if (=(substr str i la)"/") (progn (setq str2(strcat str2 "\\")) (setq i(+ i la)) ) (progn (setq str2(strcat str2(substr str i 1))) (setq i(1+ i)) ) ) ) str2 ;Ende Kopie (command "_shell" str) (print str) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Sep. 2016 16:25 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Alleine durch das lesen im Forum verstehe ich zwar nicht wiso das nötig ist, aber ich antworte halt einfach mla nur auf dein Problem: Auf der verlinkten Seite gibt es doch bereits eine fertige Funktion, warum nutzt du diese denn nicht? Wenn die Funktion STR-SUBST geladen ist, dann: (setq str (str-subst str "\\" "/")) oder (setq str (str-subst str "/" "\\")) Was auch immer du haben möchtest. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Sep. 2016 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Jetzt habe ich gesehen was du gemacht hast.. du hast den Inhalt der Funktion kopiert, ohne recht zu wissen wofür das letzte "str2" gut ist. Auch wenn es schrecklich ist, dein Code leicht geändert: (defun c:Test( / Hyper Str i la str2 ) ;Hyperlink auslesen (setq Hyper (cdr(assoc "PE_URL"(cdr(assoc -3(entget (car(entsel "\nObjekt picken:")) (list "PE_URL")))))) Hyper (car Hyper) ;auf ersten Eintrag reduzieren Hyper (cdr Hyper) ;auf rechten Teil des ersten Eintrags reduzieren Str (strcat "copy " Hyper " z:/lh_fmc") ) ; kopiert aus: http://www.advanced.autolisp.info/strings2.html ; Variablen ersetzt (setq i 1) (setq la(strlen "/")) (setq str2 "") (while(<= i(strlen str)) (if (=(substr str i la)"/") (progn (setq str2(strcat str2 "\\")) (setq i(+ i la)) ) (progn (setq str2(strcat str2(substr str i 1))) (setq i(1+ i)) ) ) ) ; str2 <== weg damit ;Ende Kopie (alert (strcat ; Testeintrag Start "Hyper: " Hyper "\nStr: " Str "\nStr2: " Str2 ) ); Testeintrag Ende (command "_shell" str); <== möchtest du hier nicht viel lieber der str2 haben? (print str); <== möchtest du hier nicht viel lieber der str2 haben? ) Da man "str-subst" aber öfters benötigt, speichert man es als Funktion, wie auf der HP, und greift dann so darauf zu: (str-subst str neu alt) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 01. Sep. 2016 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Code: (setq Hyper (cdr(assoc "PE_URL"(cdr(assoc -3(entget (car(entsel "\nObjekt picken:")) (list "PE_URL")))))) Hyper (car Hyper) ;auf ersten Eintrag reduzieren Hyper (cdr Hyper) ;auf rechten Teil des ersten Eintrags reduzieren pos 0 ) (while(setq pos(VL-STRING-SEARCH "\\" Hyper pos)) (setq Hyper(vl-string-subst "/" "\\" Hyper pos)) ) (setq Str (strcat "copy " Hyper " c:/lh_fmc"))
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 01. Sep. 2016 16:55 <-- editieren / zitieren --> Unities abgeben:
Danke, das mit dem kopieren hast Du richtig gesehen (ich hatte deswegen den Link dabei geschrieben) Der Fehler war wirklich STR2 (ich hatte das nicht richtig gesehen) Schöner ist natürlich die Funktion "str-subst" kommplett zu lassen, aber das habe ich nicht ans laufen bekommen. So klappt es jetzt, Morgen kommt der Feinschliff. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 01. Sep. 2016 16:59 <-- editieren / zitieren --> Unities abgeben:
Hallo CADwiesel, die Variante funktionert bei mir leider nicht: Fehlermeldung: Fehlerhafte Zeichenfolge für ssget-Modus Aber der Fehler liegt wahrscheinlich bei mir, teste ich auch noch mal, aber jetzt muss ich abrechen und meine Kinder abholen, Danke Euch Profis!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 02. Sep. 2016 08:58 <-- editieren / zitieren --> Unities abgeben:
Hat einen Moment gedauert, natürlich funktioniert die Version von CADwiesel auch: Hier der ganze Code: (defun c:CF( / Hyper Str pos anz) ;Hyperlink auslesen und Zieldatei kopieren (setq Hyper (cdr(assoc "PE_URL"(cdr(assoc -3(entget (car(entsel "\nObjekt picken:")) (list "PE_URL")))))) Hyper (car Hyper) ;auf ersten Eintrag reduzieren Hyper (cdr Hyper) ;auf rechten Teil des ersten Eintrags reduzieren pos 0 ) (while(setq pos(VL-STRING-SEARCH "/" Hyper pos)) ;speichert in pos die Position von / im String (setq Hyper(vl-string-subst "\\" "/" Hyper pos)) ;tauscht / gegen \\ im String ) ;die Schleife wird so oft durchlaufen bis kein / mehr im String vorhanden ist. (setq Str (strcat "copy " Hyper " c:\\lh_fmc")) (command "_shell" str) ) in der Zeile setq Hyper(vl-string-subst "\\" "/" Hyper pos)) waren die Strings für das Ersetzen vertauscht.
So jetzt kann ich noch die Feinheiten machen, z.B. prüfen ob es die zu kopierende Datei überhaubt gibt etc... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |