| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Text kopieren und hochzählen (3347 mal gelesen)
|
Stefan Michel Mitglied
Beiträge: 40 Registriert: 01.06.2006
|
erstellt am: 27. Mai. 2007 01:38 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem. Ich möchte einen Text kopieren und dabei hochzählen lassen. Das Lisp dazu habe ich soweit fertig und es funktioniert. Ich weiss, dass es hier im Forum schon etliche Threads dazu gibt, nichtsdestotrotz möchte ich eigentlich gerne meinen eigenes programm dazu haben. Da ich beim kopieren gerne die Ziffer am Zeiger hängend haben möchte kommt quasi nur der Orignal "_copy"-Befehl von autocad in frage. Nun habe ich ein Problem mit der Schleife. Ich habe mir schon den Kopf zermattert wie ich eine Schleife programmiere wenn ich im "copy"-Befehl keinen zweiten Punkt anklicke sondern eben nur auf Return (so wie man in der Regel im normalen AutoCAD den Mehrfachkopiebefehl auch beenden würde nämlich mit der ReturnTaste). Eigentlich sollte mein Lisp laufen, aber wenn ich statt eine Punktes die Returntaste drücke wird der Befehl nicht beendet obwohl die beiden variablen "letztesobjekt" "vorletztesobjet" in diesem Fall gleich sind und der While-Befehl eigentlich ein NIL bekommen sollte. Hier mal meine Lisp: (defun c:test () (setq oldobjekt (car(entsel"\nText wählen:"))) (setq punkt1 (getpoint"\nStartpunkt wählen:")) (setq oldtext (assoc 1(entget oldobjekt))) (setq oldtextreal (atof (cdr oldtext))) (while (/= vorletztesobjekt letztesobjekt) (setq vorletztesobjekt (entlast)) (command "_copy" oldobjekt "" punkt1 PAUSE) (setq letztesobjekt (entlast)) (setq oldtextreal (+ oldtextreal 1)) (setq newtext (cons 1 (rtos oldtextreal))) (entmod(subst newtext oldtext (entget(entlast))))
);end while ) kann mir bitte irgendjemand sagen, wo hier der Fehler liegt? vielen Dank vorab Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1760 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: 27. Mai. 2007 11:32 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
Hallo Stefan, ich bin folgendermaßen an das Problem herangegangen: Wenn im Command-Befehl der zweite Punkt der Verschiebung abgefragt und nur mit ENTER bestätigt wird, dann wird automatisch der erste Punkt der Verschiebung verwendet. Die Basispunktkoordinaten der Kopie sind also genau doppelt so groß wie die des ersten Basispunktes. Das war für mich dann das Kriterium, das zuletzt erstellte Objekt wieder zu löschen und die While-Schleife zu verlassen. Insgesamt habe ich den Code noch ein wenig geändert, z.B. bin ich der Meinung, das der erste Punkt der Verschiebung der Basispunkt des Textes sein sollte, naja, probier Dich mal durch und such die Stücken raus, die Du verwenden kannst. Code:
(defun c:test1 ( / LASTOBJ N OLDOBJEKT ) (if (setq oldobjekt (car(entsel "\nText wählen:"))) (progn (setq n 1) (while (or (= n 1) lastobj) (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause) (if (/=(distance (cdr(assoc 10 (entget(entlast)))) (mapcar '(lambda(A) (* A 2.0)) (cdr (assoc 10 (entget oldobjekt))))) 0.0) (entmod (subst (cons 1 (itoa(+(atoi(cdr(assoc 1 (entget oldobjekt))))n))) (assoc 1 (entget (entlast))) (entget(setq lastobj(entlast))))) (progn (entdel (entlast)) (setq lastobj nil))) (setq n (+ n 1)))) (alert "Sie haben keinen Text ausgewählt.")))
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stefan Michel Mitglied
Beiträge: 40 Registriert: 01.06.2006
|
erstellt am: 04. Jun. 2007 21:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, ich bin leider jetzt erst dazugekommen, mir deinen beitrag genauer anzuschauen. ausprobiert habe ich ihn noch nicht, ich bin sicher dass er funktioniert aber ich würde ihn auch gerne kapieren. Dies ist momentan leider noch nicht so ganz der fall! Naja, bei zeilen mit 9 geöffneten klammern ist dass sicherlich auch nicht ganz so einfach! Nun hab ich aber mal ein paar fragen zu deinem code: also ich verstehe das erste if ja noch ganz gut, wenn auf etwas geklickt wird läuft der ganze mittelteil ab, wenn auf nichts geklickt wird kommt die fehlermeldung ganz unten. Wenn also ein objekt angeklickt wird wird als erstes N auf 1 gesetzt. Und jetzt happerts bei mir! was soll bei der While-Schleife das (or(= n 1)lastobj)?? im ersten durchlauf ist N=1 also läuft die Schleife durch! was soll aber das (or lastobj). Kannst du mir das genauer erklären? DANKE vorab Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1760 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: 04. Jun. 2007 22:19 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
Hallo Stefan, ich habe den Code mal mit Kommentarzeilen versehen, ich hoffe man kann es dadurch verstehen (ist nämlich ganz schön schwer sowas in Worte zu fassen) Code:
(defun c:test1 ( / LASTOBJ N OLDOBJEKT ) (if (setq oldobjekt (car(entsel "\nText wählen:"))) (progn (setq n 1) ;;;nur für die erste Runde der WHILE-Schleife, ;;;weil die Variable LASTOBJ dann auf jeden Fall NIL ist ;;;(als lokal festgelegt) (while (or ;;;wenn (= n 1);;;entweder 1. Runde ;;;oder lastobj);;;wenn 2. Runde oder höher und LASTOBJ ;;;ungleich nil ist ;;;dann kopieren (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause) ;;;wenn der Abstand (if (/=(distance (cdr(assoc 10 (entget(entlast)))) ;;;vom Basispunktes des neuen Objektes => Kopie ;;;zum doppelten Koordinatenwert des alten Objektes (mapcar '(lambda(A) (* A 2.0)) (cdr (assoc 10 (entget oldobjekt))))) 0.0);;;ungleich Null ist ;;;=> dann ist ein im copy-Befehl ein neuer ;;;Basispunkt ausgewählt worden ;;;und deswegen (entmod (subst (cons 1 (itoa(+(atoi(cdr(assoc 1 (entget oldobjekt))))n))) (assoc 1 (entget (entlast))) ;;;entmode den Textwert des neuen Textes mit dem ;;;Wert des alten Textes +1 (entget(setq lastobj(entlast))))) ;;;wobei der Variablen LASTOBJ auch (entlast) zugewiesen wird ;;;LASTOBJ ist also ungleich nil und somit kommt es in der ;;;WHILE-Schleife zu einem weiteren Durchlauf. (progn ;;;wenn der Abstand aber Null ist, dann wurde der ;;;copy-Befehl ;;;nur mit ENTER bestätigt (entdel (entlast)) ;;;und das zuletzt erstellte Objekt wird wieder gelöscht (setq lastobj nil)) ;;;und der Variablen LASTOBJ wird nil zugewiesen, ;;;dann wird die WHILE-Schleife kein weiteres mal durchlaufen ) (setq n (+ n 1)) ;;;der WErt von N wird hochgezählt, damit die WHILE-Schleife ;;;weiß, das Sie jetzt ;;;die Variable LASTOBJ prüfen muss => N ist ungleich 1 )) (alert "Sie haben keinen Text ausgewählt.")))
------------------ viele Grüße
Jörn [Diese Nachricht wurde von joern bosse am 04. Jun. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 05. Jun. 2007 09:11 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
Hallo Stefan, vielleicht hilft dir folgendes weiter: Diese Funktion: (defun work_beginRightClick (dummy1 dummy2) (setq rechtsklick t) ) wird aufgerufen durch einen Reactor der auf die rechte Maustaste reagiert : (setq beginRightClick (vlr-mouse-reactor nil '((:vlr-beginRightClick . work_beginRightClick) ) ) ) Vor Programmende Reactor wieder löschen : (vlr-remove beginRightClick) Mit der Variablen "rechtsklick" kannst du dann auswerten ob du die rechte Maustaste gedrückt hast. Vielleicht nicht das eleganteste, aber Funktion geht vor Schönheit. Vielleicht hilfts ja weiter ?
Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkusGa Mitglied
Beiträge: 10 Registriert: 02.07.2001 Windows 7 Pro AutoCAD 2008 MEP, AutoCAD LT 2013, AutoCAD Building 2013 Standard Intel I5, 16 GB RAM
|
erstellt am: 28. Mai. 2013 19:34 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
Hallo zusammen, ich muss mal den alten Beitrag wieder hochholen . Das Lisp ist ungefähr die Lösung für mein Problem. Ich würde gerne einen Text kopieren und diesen dabei hochzählen lassen. Ergebniss soll sein z. B. 1.1 1.2 1.3 ... 1.10 1.11 Enden wird das ganze unter 1.100. Von Jörn habe ich schon ein leicht geänderte Lisp bekommen, hier fängt die Zählerrei aber bei 0.1 an und geht bis 0.9 und macht dann bei 1.x weiter. Leider ist Jörn zur Zeit unterwegs und kann mir nicht weiterhelfen, könntet Ihr dies vielleicht übernehmen? Lieben Gruß Markus PS: Das ist der neue Code von Jörn: Code: (defun c:test2 ( / LASTOBJ N OLDOBJEKT) ;;;!!!DIMZIN wird nicht automatisch wieder zurückgestellt!!! (setvar "DIMZIN" 3) if (setq oldobjekt (car(entsel "\nText wählen:"))) (progn (setq n 0.1) (while (or (= n 0.1) lastobj) (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause) (if (/=(distance (cdr(assoc 10 (entget(entlast)))) (mapcar '(lambda(A) (* A 2.0)) (cdr (assoc 10 (entget oldobjekt))))) 0.0) (entmod (subst (cons 1 (rtos(+(atof(cdr(assoc 1 (entget oldobjekt))))n)2 1)) (assoc 1 (entget (entlast))) (entget(setq lastobj(entlast))))) (progn (entdel (entlast)) (setq lastobj nil))) (setq n (+ n 0.1)) )) (alert "Sie haben keinen Text ausgewählt."))
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: 28. Mai. 2013 20:29 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1760 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: 30. Mai. 2013 07:13 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
Hallo Markus, falls der Link von Heinz nicht geholfen hat hier nochmal ein bißchen geänderter Code: Code:
(defun c:test2 ( / LASTOBJ N OLDOBJEKT) ;;;!!!DIMZIN wird nicht automatisch wieder zurückgestellt!!! (setvar "DIMZIN" 3) if (setq oldobjekt (car(entsel "\nText wählen:"))) (progn (setq n 1) (while (or (= n 1) lastobj) (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause) (if (/=(distance (cdr(assoc 10 (entget(entlast)))) (mapcar '(lambda(A) (* A 2.0)) (cdr (assoc 10 (entget oldobjekt))))) 0.0) (entmod (subst (cons 1 (strcat(itoa(fix(atof(cdr(assoc 1 (entget oldobjekt))))))"."(itoa n))) (assoc 1 (entget (entlast))) (entget(setq lastobj(entlast))))) (progn (entdel (entlast)) (setq lastobj nil))) (setq n (+ n 1)) )) (alert "Sie haben keinen Text ausgewählt."))
Damit sollte jetzt auch 1.1, 1.2. .... 1.9, 1.10, 1.11 usw. funktionieren.
------------------ viele Grüße Jörn http://www.bosse-engineering.com Koordinatenausgabe Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkusGa Mitglied
Beiträge: 10 Registriert: 02.07.2001 Windows 7 Pro AutoCAD 2008 MEP, AutoCAD LT 2013, AutoCAD Building 2013 Standard Intel I5, 16 GB RAM
|
erstellt am: 04. Jun. 2013 14:11 <-- editieren / zitieren --> Unities abgeben: Nur für Stefan Michel
|