| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Getstring mit Vorgabe (3548 mal gelesen)
|
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3424 Registriert: 07.06.2001 W10-64bit, AMD Ryzen 7 3700X,32GB RAM, Sapphire Pulse Radeon RX 570 8G G5, Canon TX-3000 MFP, Maus Cherry MW4500, Sub:Infrastructure Design Suite, Office 365
|
erstellt am: 11. Mai. 2006 11:47 <-- editieren / zitieren --> Unities abgeben:
Hi Hab mir das Lisp gebastelt. siehe unten Darin soll der Block "Kanal_Schacht" eingefügt und die Eingabe der Attribute erfolgen. Das Problem ist das ich den Vorherwert der vorherigen Eingabe bei Strang bzw Schacht gerne hätte. Code: (defun c:Kanal_Schacht (/ punkt Strang Schacht) (prompt "<Schachtmitte>: ") (setq punkt (getpoint)) (if (= Strang_vorher nil) (setq Strang (getstring T "<Strang>: " )) (setq Strang (getstring T "<Strang vorher>: " Vorherwert) ) (setq Strang_vorher Strang) (if (= Schacht_vorher nil) (setq Schacht (getstring T "<Schacht>: " )) (setq Schacht (getstring T "<Schacht vorher>: " Vorherwert) ) (setq Schacht_vorher Schacht) (command "_insert" "_Kanal_Schacht" punkt "1" "" "" Strang Schacht) )
------------------ "Warum Einfach es geht auch kompliziert". Schöne Grüsse aus der Steiermark Bernd P. Bitte Supportangaben eintragen, warum siehst du hier Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Mai. 2006 11:54 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
sowas? (if(= (type Strang_vorher) 'Str) (or(/=(setq Strang (getstring T (strcat"<" Strang_vorher">: ")))"") (setq STRANG Strang_vorher) ) (or(/=(setq Strang (getstring T "<Strang>: "))"") (setq STRANG "Strand") ) ) ------------------ - 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 |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 11. Mai. 2006 11:55 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Hallo Bernd, entweder du arbeitest mit globalen Variablen oder du gehst z.B. über das BlackBoard. Dies ist ein Zwischenspeicher der Zeichnungsübergreifend zur Verfügung steht. Du solltest die BB-Variablen aber eindeutig benennen, nicht dass irgendeine andere Applikation kommt, und dir diese überschreibt. In diesem Thread findest du beide Varianten bereits ausprogrammiert. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 11. Mai. 2006 12:20 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Toll, hab wieder zu lange rumgemacht :-( Hier mein Senf: Code:
(defun C:KANAL_SCHACHT (/ PUNKT SCHACHT STRANG) ;; (prompt "<Schachtmitte>: ") ;; Die Aufforderung kann man direkt in die GETXX Funktion bringen ;; Angaben in "<>" sind traditionell für "Vorgabe wenn Enter" gedacht. ;; Was ist, wenn der User keinen Punkt klickt? Dies muß abgefangen werden. (if (not (setq PUNKT (getpoint "\nSchachtmitte: "))) (princ "\nEy, Du sollst 'n Punkt klicken... Funktionsende.") (progn ;_ fasst nachfolgendes zu einem Ausdruck zusammen ;; typische Stilblüte in Lisp, hab' ich am Anfang auch zu hauf gemacht ;-) ;; (= Strang_vorher nil) (if (not STRANG_VORHER) (setq STRANG (getstring 't "\nStrang: ")) (if (= (setq STRANG (getstring 't (strcat "\nStrang neu eingeben, ENTER für vorherige Eingabe <" STRANG_VORHER ">: " ) ) ) "" ) (setq STRANG STRANG_VORHER) ) ) (setq STRANG_VORHER STRANG) (if (not SCHACHT_VORHER) (setq SCHACHT (getstring 't "\nSchacht: ")) (if (= (setq SCHACHT (getstring 't (strcat "\nSchacht neu eingeben, ENTER für vorherige Eingabe <" SCHACHT_VORHER ">: " ) ) ) "" ) (setq SCHACHT SCHACHT_VORHER) ) ) (setq SCHACHT_VORHER SCHACHT) (command "_insert" "_Kanal_Schacht" PUNKT "1" "" "" STRANG SCHACHT) ;; Zum testen gewesen: ;;(princ (strcat "\nStrang: >" Strang "< Schacht: >" Schacht "<")) (princ "\nOK, fertsch!") ) ) (princ) )
...------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3424 Registriert: 07.06.2001 W10-64bit, AMD Ryzen 7 3700X,32GB RAM, Sapphire Pulse Radeon RX 570 8G G5, Canon TX-3000 MFP, Maus Cherry MW4500, Sub:Infrastructure Design Suite, Office 365
|
erstellt am: 11. Mai. 2006 12:26 <-- editieren / zitieren --> Unities abgeben:
@Brischke Die Überschreibung der Werte is eigentlich egal, da ich sie nur zum setzten der Schächte brauche. Nach der 1 Eingabe sind sie wieder auf Kurs @Cadmium funktioniert @Marc mit Error und allen drum und dran THXbin garnich so schnell beim beantworten, wie du beim Lispl´n thanks@ALL ------------------ "Warum Einfach es geht auch kompliziert". Schöne Grüsse aus der Steiermark Bernd P. Bitte Supportangaben eintragen, warum siehst du hier 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: 11. Mai. 2006 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
'ne ganz einfache Sache wäre es auch die Systemvariablen Users1-5 zu nutzen Code:
(defun c:Kanal_Schacht (/ punkt Strang Schacht tmp) (setq punkt (getpoint "\n<Schachtmitte>: ")) (setq strang (getvar "USERS5") Schacht (getvar "USERS4") ) ;_ end of setq (if (= strang "") (if (setq Strang (getstring T "\n<Strang>: ")) (setvar "users5" strang) ) ;_ end of if (setq Strang (if (and (> (strlen strang) 0) (= (setq tmp (getstring T (strcat "\n<Strang vorher>: " strang " ")) ) ;_ end of setq "" ) ;_ end of = ) ;_ end of and strang tmp ) ;_ end of if ) ;_ end of setq ) ;_ end of if (if (= Schacht "") (if (setq Schacht (getstring T "\n<Strang>: ")) (setvar "users4" Schacht) ) ;_ end of if (setq Schacht (if (and (> (strlen Schacht) 0) (= (setq tmp (getstring T (strcat "\n<Strang vorher>: " Schacht " ") ) ;_ end of getstring ) ;_ end of setq "" ) ;_ end of = ) ;_ end of and Schacht tmp ) ;_ end of if ) ;_ end of setq ) ;_ end of if (command "_insert" "_Kanal_Schacht" punkt "1" "" "" Strang Schacht) ;_ end of command )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 12. Mai. 2006 21:39 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Hallo Das Problem ist ja eigentlich schon hinreichend geklärt worden... Trotzdem möcht' ich auch noch meinen Senf dazugeben, da ich beim lesen des Threads auf die Idee gekommen bin meine 'Input-BIBO' mal wieder zu erweitern. Hab mir für z.B. für getstring eine Variante gebastelt, die Vorgabewerte verarbeitet. Eingaben mit Vorgabewerten kommen ja immer wieder vor. Die Überwachung von Leereingaben ist auch immer so eine Standard Aufgabe, die meistens in einem 'if-Schachtelhaufen" endet. Hier meine Version: Code:
;;; Einfache Variante ohne Fehlermeldungen (defun c:kanal_schacht (/ blkname punkt) (setq blkname "_Kanal_Schacht") ;; Evaluierung von 'and' wird gestoppt, wenn ein Argument 'nil -> hier Programmende (and (setq punkt (getpoint "\nSchachtmitte")) (strp>0 (setq *strang* (getstring= "Strang" *strang*))) (strp>0 (setq *schacht* (getstring= "Schacht" *schacht*))) ;; prüfen, ob Block verfügbar (or (tblsearch "BLOCK" blkname) (findfile blkname)) ;; wenn alles OK -> einfügen (command "_-insert" blkname punkt "1" "" "" *strang* *schacht*) ) (princ) )
Code:
;;; Mit Fehlermeldungen (defun c:kanal_schacht (/ blkname punkt) (setq blkname "_Kanal_Schacht") ;; Evaluierung von 'and' wird gestoppt, wenn ein Argument 'nil -> hier Programmende (and (errmsg-ifnot (setq punkt (getpoint "\nSchachtmitte")) "Kein Punkt gewählt") (errmsg-ifnot (strp>0 (setq *strang* (getstring= "Strang" *strang*))) "Kein Strang angegeben") (errmsg-ifnot (strp>0 (setq *schacht* (getstring= "Schacht" *schacht*))) "Kein Schacht angegeben") ;; prüfen, ob Block verfügbar (errmsg-ifnot (or (tblsearch "BLOCK" blkname) (findfile blkname)) (strcat "Block \"" blkname "\" nicht verfügbar") ) ;; wenn alles OK -> einfügen (command "_-insert" blkname punkt "1" "" "" *strang* *schacht*) ) (princ) )
Hier die BIBO-Funktionen Code:
;;;-------------------------------- ;;; GETSTRING= - wie getstring nur mit Vorgabe ;;;-------------------------------- (defun getstring= (anfrage vorgabe / ntext) (if (not vorgabe) (setq vorgabe "") ) (setq ntext (getstring (strcat "\n" anfrage " <\"" vorgabe "\">: "))) (if (zerop (strlen ntext)) vorgabe ntext ) ) ;;; ------------------------------- ;;; ERRMSG-IFNOT - Gibt errmsg +" - Programm wird beendet" aus, wenn val = 'nil ;;; Hilfsfunktion für 'AND-Konstrukt' bei Eingabeüberprüfung ;;; Rückgabe: val ;;; ------------------------------- (defun errmsg-ifnot (val errmsg /) (if (not val) (princ (strcat "\n" errmsg " - Programm wird beendet")) ) val ) ;;;-------------------------------- ;;; STRP>0 - prüft, ob str = Type String und KEIN Leerstring ;;;-------------------------------- (defun strp>0 (str /) (and (= 'str (type str)) (/= "" str)))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sponk-mg Mitglied
Beiträge: 38 Registriert: 10.10.2011
|
erstellt am: 21. Okt. 2011 13:05 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Meine Frage ist wahrscheinlich noch viel einfacher zu beantworten. Wo ist mein Denkfehler? Die commands sollen nur dann ausgeführt werden, wenn in der Eingabezeile von AutoCAD Ja eingegeben wird. (if (= Eing Ja) ; Flurkarte: Gebäude (setq Eing (getstring "\nGrenzen löschen \"Ja\" eingeben: ")) (progn (setq lac (ssget "_X" '((0 . "polyline")(8 . "BB-BW-LIN" )(62 . 256)))) (command "_erase" lac "") (command "Pause" 250) ) ) Danke für den Beistand.
Martin 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. Okt. 2011 13:13 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
|
sponk-mg Mitglied
Beiträge: 38 Registriert: 10.10.2011
|
erstellt am: 21. Okt. 2011 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
|
sponk-mg Mitglied
Beiträge: 38 Registriert: 10.10.2011
|
erstellt am: 22. Okt. 2011 16:47 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Eine Frage muss ich noch nachschieben. Bezieht sich allein auf das Entity Polyline bzw. pline. Ich hab häufiger Probleme, dass mit polyline oder pline keine Polylinien selektiert werden. Mit line, text, mtext funktioniert jede Auswahl bestens. Nur mit polyline oder pline gibt's Probleme. Gibt's noch andere Bezeichnungen für Polylinien oder muss man noch den Platzhalter "*" vor polyline oder pline setzen? Das genannte Bsp. funktioniert mit line wie gewünscht. Mit polyline leider nicht. (initget "Ja Nein") (if(/= (getkword "\nGrenzen löschen ? [Ja / Nein] <Ja> : ") "Nein") (progn (if(setq lac (ssget "_X" '((0 . "polyline")(8 . "BB-BW-LIN" )(62 . 256)))) (command "_erase" lac "") ) ) ) Danke schön. Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 22. Okt. 2011 19:33 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003 Win 10 bzw. 11 / 64 Pro AutoCAD MAP 3D 2023 BricsCAD 24
|
erstellt am: 25. Okt. 2011 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
|