| |
| 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: Nummern automatisch an Text anfügen (447 mal gelesen)
|
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2007,(Mechanical)
|
erstellt am: 21. Jan. 2008 08:43 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe MTexte/Text auf dem Bildschirm. Kann ich es mit Lisp schaffen das ich einen Befehl kreiere der folgendes bewirkt: 1.Beim starten des Befehls fragt er mich nach einer Nummer danach klicke ich nach der Reihe Mtexte/Texte an, bei jedem klick auf einen Mtext/Text wird die Nummer um eins erhöht und dann dem Mtext/Text angefügt. MFG THE_ONE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Jan. 2008 08:52 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2007,(Mechanical)
|
erstellt am: 21. Jan. 2008 11:23 <-- editieren / zitieren --> Unities abgeben:
Hallo! So habe es jetzt endlich fertig!
Code: (defun c:addnumber (/ START_NUMBER Object stringeintrag stringelement x) (initget 5) ;lässt kein NULL (also nur ENter drücken) und keine negativen Zahlen zu (if (setq START_NUMBER (getint "Enter a number:")) ;liest einen Integer ein (progn (initget 0) (while (setq Selection (entsel "Wähle Text")) ;solange bis der User Enter drückt ;entsel liefert eine Liste mit zwei Elementen: 1stes Element ist der Name, ;zweites Element ist die Cursorposition an der der Cursor war als das Element ausgewählt wurde (setq Object (entget (car Selection) )) ;liefert das angeklickte Objekt (Text) (setq stringeintrag (assoc 1 Object));=(1 . stringelement) (setq stringelement (cdr (assoc 1 Object)));=nur der String des Objektes (setq x (strcat (substr stringelement 1 (- (strlen stringelement) 1)) (rtos START_NUMBER 2 0) "}"));Nummer hinzufuegen (setq Object (subst (cons 1 x) stringeintrag Object));ersetze alten Eintrag durch den neuen (entmod Object) ;Update Database - schreibe das Object neu (setq START_NUMBER (1+ START_NUMBER));number um 1 erhöhen, fuer fortlaufende Nummerierung );while );progn );if );defun c
Was kann ich da noch verbessern, funktionieren tut es ja schon. Z.B.: Was könnte ich machen, das wenn der User nicht einen Text auswählt sondern irgendwas anderes ,dass mein Programm nicht abricht sondern einfach weiter macht in der Schleife. Kenne mich leider mit LISP nicht so gut aus, wäre daher nett wenn ihr mir bitte helfen könntet. MFG THE_ONE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Jan. 2008 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
Schön zusammenkopiert .. sogar Zweisprachig in eine, Programm. Aber probier mal das Code:
(defun c:addnumber (/ START_NUMBER Object stringeintrag stringelement x) (initget 5) (if(setq START_NUMBER (getint "Gib eine Zahl ein:")) (progn (while(and(setq Selection (entsel "\nWähle Text")) (setq Object (entget (car Selection) )) (or(member(cdr(assoc 0 Object)) '("TEXT" "MTEXT")) (prompt "\nKein Textobjekt gewählt\n") ) ) (setq stringeintrag (assoc 1 Object)) (setq stringelement (cdr (assoc 1 Object))) (setq x (strcat (substr stringelement 1 (- (strlen stringelement) 1)) (rtos START_NUMBER 2 0) "}" ) ) (setq Object (subst (cons 1 x) stringeintrag Object)) (entmod Object) (setq START_NUMBER (1+ START_NUMBER)) ) ) ) )
... kann aber bei Mtexten zu Problemen kommen, da der Mtext seinen Textstring durchaus im GC3 haben kann ... ich würde da eher auf ActiveX zurückgreifen. Aber ich denke, wie man eine Fehl-Auswahl umgeht ist aus dem Code ersichtlich. ------------------ - 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 |
THE_ONE Mitglied Student, Alter:23
Beiträge: 299 Registriert: 27.04.2005 AMD XP 2000, 512MB-RAM, WIN XP Pro Readon 9600Pro VIZ 2005, Autocad 2007,(Mechanical)
|
erstellt am: 21. Jan. 2008 12:16 <-- editieren / zitieren --> Unities abgeben:
Hallo! Danke für deine Hilfe! Hab jetzt das ganze so optimiert wie ich das haben will. Die Funktion soll erst abrechen wenn Enter gedrückt wird bei einem falschen Objekt wird einfach eine neue Abfrage gestartet. Außerdem muss man zwischen MTEXT und TEXT unterscheiden! Code: (defun c:addnumber (/ START_NUMBER Object stringeintrag stringelement x) (initget 5) ;lässt kein NULL (also nur Enter drücken) und keine negativen Zahlen zu (if (setq START_NUMBER (getint "Enter a number:")) ;liest einen Integer ein (progn (initget 0) (while(and (setq Selection (entsel "\nWähle Text")) ;solange bis der User Enter drückt (setq Object (entget (car Selection))) );and ;entsel liefert eine Liste mit zwei Elementen: 1stes Element ist der Name, ;zweites Element ist die Cursorposition an der der Cursor war als das Element ausgewählt wurde (if (member (cdr(assoc 0 Object)) '("TEXT" "MTEXT")) (progn (setq Object (entget (car Selection) )) ;liefert das angeklickte Objekt (Text) (setq stringeintrag (assoc 1 Object));=(1 . stringelement) (setq stringelement (cdr (assoc 1 Object)));=nur der String des Objektes (if (member (cdr(assoc 0 Object)) '("MTEXT")) (setq x (strcat (substr stringelement 1 (- (strlen stringelement) 1)) (rtos START_NUMBER 2 0) "}"));MTEXT (setq x (strcat stringelement (rtos START_NUMBER 2 0) ));TEXT );if MTEXT OR TEXT (setq Object (subst (cons 1 x) stringeintrag Object));ersetze alten Eintrag durch den neuen (entmod Object) ;Update Database - schreibe das Object neu (setq START_NUMBER (1+ START_NUMBER));number um 1 erhöhen, fuer fortlaufende Nummerierung );if true (prompt "\nKein Textobjekt gewählt")) ;if false );while );progn );if );defun c
MFG THE_ONE PS.: Was ist GC3?? [Diese Nachricht wurde von THE_ONE am 21. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 21. Jan. 2008 14:15 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
Hallo, "...PS.: Was ist GC3??..." schau mal in der Hilfe unter Gruppencodes bzw. Gruppencodes für Objekte nach. IMHO können lange mtext auf zwei GC gesplittet sein (ab einer bestimmten Zeichnemenge) Mfg Heiko 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: 21. Jan. 2008 17:18 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|