| |
| 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: Text kopieren und ändern (1046 mal gelesen)
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 29. Sep. 2005 09:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispler Bin Anfänger Habe einen Text 111/9 will ihn kopieren und die neun um eine erhöhen. Nach abfrage bekomme ich das zurück "111/9" wie muss ich das umwandeln um den Text bearbeiten zu können bzw. die 9 auf 10 umwandeln. _$ (setq letzteob (cdr (assoc 1 abfrage))) "111/9" danke heinz
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 29. Sep. 2005 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 29. Sep. 2005 09:52 <-- editieren / zitieren --> Unities abgeben:
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 29. Sep. 2005 11:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Tunelbauer einen Frage Was macht diese Befehl VL-PRINC-TO-STRING will auch den Ablauf vestehn was ich da schreibe. danke heinz will ja mal weiter gehn. Das er mir ,von diesen Text "200.1/22" auch mal die 1 erhöht als dan 2/22 wird, danke heinz ------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 29. Sep. 2005 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Dieses vl-princ-to-string gibt Daten aus einem AutoLISP-Ausdruck in der Form wieder, wie es mittels princ am Bildschirm ausgegeben werden würde. (Starte mal deinen vlide, drück dort F1 und lies nach - dort sind alle AutoLISP-Ausrücke erklärt; inkl. Beispiele; dann wird es verständlicher) ------------------ Grüsse Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cad-intensiv Mitglied CAD-Anbieter
Beiträge: 31 Registriert: 14.06.2005
|
erstellt am: 29. Sep. 2005 12:13 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Zitat: Original erstellt von Dober Heinz: Hallo Lispler Bin Anfänger Habe einen Text 111/9 will ihn kopieren und die neun um eine erhöhen. Nach abfrage bekomme ich das zurück "111/9" wie muss ich das umwandeln um den Text bearbeiten zu können bzw. die 9 auf 10 umwandeln.
Hallo Heinz,
das sollte doch in dem gerade von Dir absolvierten LISP Seminar in Wien behandelt worden sein, oder hat Herr Berger das versäumt? Wenn Du mir sagst, wo Du dabei noch Probleme hast, dann kann vielleicht auch ich Dir hier weiter helfen. IMO das entscheidende Problem dabei besteht darin, zu erkennnen, welche Zahl dabei Du hochzählen willst, denn in Deinem Text stehen mehrere Ziffern, und Du musst beispielsweise erkennen, dass Texte der Form "200/1" in "200/2" geändert werden sollen, Texte der Form "200/9" aber in "200/10". Dabei geht es also nicht nur um simples Hochzählen, sondern um das Erkennen der Bedeutung des Textes, konkret darum, wie viele Zeichen am Ende des Textes eine Zahl bilden, die hochgezählt werden soll. Ob die letzten Zeichen Deines Textes als Zahl interpretiert werden können, und wieviele Zeichen dabei benutzt werden, kannst Du mit den Funktionen SUBSTR und NUMBERP testen. Dabei gehst Du in einer Schleife vom letzten Zeichen des Textes aus schrittweise rückwärts: (numberp (read (substr teststring (- (strlen teststring) counter)))) Wenn Du counter nun bei 0 beginnen lässt und in der Schleife hochzählst, dann wird dabei geprüft, ob das letzte Zeichen eine Zahl ist, oder ob die letzten beiden Zeichen eine Zahl sind, die letzten 3 Zeichen usw.. Das machst Du solange, bis das Resultat keine Zahl mehr ergibt, und die zuletzt gewonnene Zahl ist dann die richtige, die Du um eins hochzählen kannst. Die Funktion zum Erkennen der Zahl, die am Ende eines Strings steht, sieht also so aus: Zitat:
(defun str-zahl-am-ende (teststring / zaehler stringende zahl-am-ende) (setq zaehler 0) (while (numberp (read (setq stringende (substr teststring (- (strlen teststring) zaehler))))) (setq zahl-am-ende (read stringende)) (setq zaehler (1+ zaehler)) ) zahl-am-ende )
Falls der String keine Zahl am Ende hat, wird NIL zurück gegeben. Damit solltest Du erst mal weiter kommen, hoffe ich. Davon abgesehen würde mich interessieren, ob der Kurs Dir was gebracht hat. Grüßle Robert
------------------ Lisp-Seminare in Wien am 25. und 26. Sep 2005 und später in München, Frankfurt, Köln , Berlin ... -> Infos unter cad-intensiv@gmx.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 29. Sep. 2005 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Zitat: Original erstellt von Dober Heinz: Hallo Lispler Bin Anfänger Habe einen Text 111/9 will ihn kopieren und die neun um eine erhöhen. Nach abfrage bekomme ich das zurück "111/9" wie muss ich das umwandeln um den Text bearbeiten zu können bzw. die 9 auf 10 umwandeln. _$ (setq letzteob (cdr (assoc 1 abfrage))) "111/9" danke heinz
ich würds so machen (setq a1 "115/1") (setq a2 (fsplit a1 "/")) ; -> (115 1) (strcat (itoa (car a2 )) "/" (itoa (1+ (cadr a2)))) ;------------------------------------------------------------------------------ ; Fuktion Split für Zahlen ; wandelt einen string in eine liste um ; (fsplit "1 2 3 4" " ") -> '(1 2 3 4) ;------------------------------------------------------------------------------ (defun fSplit (String Separator / ) (setq String (replace String Separator " ")) (setq String (strcat "(list " String ")")) (eval (read String)) )
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 29. Sep. 2005 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
hab noch eine zweiote benötigte Hilfsroutine vergessen ;------------------------------------------------------------------------------ ; Replace Funktion ersetzten eines Suchstrings durch den ReplaceString ; ;------------------------------------------------------------------------------ ; -> String zu durchsuchender String ; -> Searchstring zu suchender/ersetztender string ; -> ReplaceString string mit dem ersetzt wird ;------------------------------------------------------------------------------ (defun Replace (String SearchString ReplaceString / ) (while (/= String (vl-string-subst ReplaceString SearchString String)) (setq String (vl-string-subst ReplaceString SearchString String)) ) String )
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 29. Sep. 2005 13:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Cad-intensiv Wir haben das im Kurs nur besprochen, und darum frage ich auch ihr im Forum wie das am besten geht und ich will bei jeder Zeile wissen was ich du und was Programm macht. nur so kann ich es lernen, wen ich versteh was ich mache danke dir für Angebot komme gern zurück auf angebot mfg heinz und danke an alle für hilfe du mir ziemlich schwer, kann kein englich und muss mir alles ausdeutschen. habe mir alle befehle, die momentan brauche rausgeschreiben mit beschreiben. damit geht es schon besser aber manche sachen sind wir noch nicht so klar wie ich den Text "220/1.1" umwandle und letzte Zahl um eins erhöhe. ------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 29. Sep. 2005 16:25 <-- editieren / zitieren --> Unities abgeben:
|
cad-intensiv Mitglied CAD-Anbieter
Beiträge: 31 Registriert: 14.06.2005
|
erstellt am: 29. Sep. 2005 16:44 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Zitat: Original erstellt von Dober Heinz:
damit geht es schon besser aber manche sachen sind wir noch nicht so klar wie ich den Text "220/1.1" umwandle und letzte Zahl um eins erhöhe.
Naja, es kommt halt prinzipiell drauf an, welche Texte da so auf einen zukommen können, und was die alles enthalten können. Die Frage ist schon mal die, ob in diesem Fall die letzte Zahl die letzte "1" ist, oder ob das die "1.1" ist. Meine oben gezeigte Funktion gibt letzteres zurück. Diese 1.1 auf 2.1 hochzuzählen ist simpel, und diese dann wieder in einen String zurück zu verwandeln ist es auch. Wenn Du diesen hochgezählten String dann wieder mit dem "200/" vereinen willst, dann musst Du natürlich wissen, ab welcher Position die Zahl beginnt - dazu kannst Du meine Funktion so verändern, dass sie nicht nur die Zahl, sondern auch die Position zurück gibt - die steckt ja implizit in der Variablen counter drin. Oder noch besser: Du lässt aus dieser obigen Funktion die Zahl und den Anfangsstring zurück geben, also beispeilsweise als Liste ("200/" 1.1) - damit kannst Du dann nämlich gleich alle Kopien fortlaufend von 1.1 als Startwert aus hochzählen.
Gruß Robert ------------------ Lisp-Seminare in Wien am 25. und 26. Sep 2005 und später in München, Frankfurt, Köln , Berlin ... -> Infos unter cad-intensiv@gmx.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 29. Sep. 2005 18:58 <-- editieren / zitieren --> Unities abgeben:
hallo cad-intensiv Ja das will ich gerade machen deinen Vorschlag einzubauen. ist nicht leicht als Anfänger gebe aber nicht auf, da ich noch nicht alles Versteh. ich will mir zwei Lisps bauen einmal wo er mir nur die letzte Hochzählt (222.1/1 wird 222.1/2) und eins wo er mir das Vorletzte Hochzählt(222.1/1 wird 222.2/1) danke für Antwort
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 29. Sep. 2005 19:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Cad-in wenn ich mir meinen Text so einlese ist das überhaupt ein string den ich bearbeiten kann. (setq textw (car (entsel))) (setq abfrage (entget textw)) (setq letzteob (cdr (assoc 1 abfrage))) mf heinz
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cad-intensiv Mitglied CAD-Anbieter
Beiträge: 31 Registriert: 14.06.2005
|
erstellt am: 29. Sep. 2005 21:55 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Zitat: Original erstellt von Dober Heinz: Hallo Cad-inwenn ich mir meinen Text so einlese ist das überhaupt ein string den ich bearbeiten kann. (setq textw (car (entsel))) (setq abfrage (entget textw)) (setq letzteob (cdr (assoc 1 abfrage)))
Du solltest mehr prüfen und solltest die Variablen so benennen, dass sie wenigstens irgend was mit dem Inhalt zu tun haben und nicht völlig falsche Namen haben. Beispiel: Code:
(if (and (setq text-entityname (car (entsel "\nTextelement wählen: "))) (setq text-entgetlist (entget text-entityname)) (= "TEXT" (cdr (assoc 0 text-entgetlist))) ) (progn (setq text-inhalt (cdr (assoc 1 text-entgetlist))) .... ) )
Hier steht dann in der Variablen text-inhalt ganz garantiert ein String. Gruß Robert ------------------ Lisp-Seminare in Wien am 25. und 26. Sep 2005 und später in München, Frankfurt, Köln , Berlin ... -> Infos unter cad-intensiv@gmx.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 18. Okt. 2005 14:29 <-- editieren / zitieren --> Unities abgeben:
@Fuchsi Habe dein Lisp getestet (setq aus (car(entsel))) (setq umw (entget aus)) (setq txt (cdr (assoc 1 umw))) (setq a2 (fSplit txt "/")) (strcat (itoa (car a2 )) "/" (itoa (1+ (cadr a2)))) (defun fSplit (String Separator /) (setq String (replace String Separator " ")) (setq String(strcat "(list " String ")")) (eval (read String)) )
(defun Replace (String SearchString ReplaceString /) (while (/=String (vl-string-subst ReplaceString SearchString String)) (setq String (vl-string-subst ReplaceString SearchString String)) ) String ) bekomme aber folgende Meldung
"150/1" ; Fehler: no function definition: /=STRING danke ------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 18. Okt. 2005 14:56 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 18. Okt. 2005 15:04 <-- editieren / zitieren --> Unities abgeben:
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002 Autocad 2021/64B Win10 WORKSTATION Intel(R) CPU E5-1620 3.60GHz 32 GB Ram 64 Bit-Betriebssystem HP Designjet T7200 Grafik NVIDIA Quadro P4000 ZWCAD2021
|
erstellt am: 19. Okt. 2005 06:44 <-- editieren / zitieren --> Unities abgeben:
@Fuchsi Habe mir das Lisp nochmal umgebaut um diese Zahlen zu erhöhen 1/2 wird 2/3 das funkt mal. Aber mit Text M1/2 geht das Lisp nicht. Sollte M2/3 werden (setq aus (car(entsel))) (setq umw (entget aus)) (setq txt (cdr (assoc 1 umw))) (setq a2 (fSplit txt "/")) (setq fertig(strcat (itoa (1+ (car a2 ))) "/" (itoa (1+ (cadr a2))))) (defun fSplit (String Separator /) (setq String (replace String Separator " ")) (setq String(strcat "(list " String ")")) (eval (read String)) )
(defun Replace (String SearchString ReplaceString /) (while (/= String (vl-string-subst ReplaceString SearchString String)) (setq String (vl-string-subst ReplaceString SearchString String)) ) String )
weis nicht wiklich was (defun Replace macht) kann es mir nicht daher nicht umschreiben, kannst mir nochmal helfen. danke
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |