| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: wenn entsel leer (357 / mal gelesen)
|
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3367 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: 08. Mai. 2023 11:18 <-- editieren / zitieren --> Unities abgeben:
Servus, hab mir eine LSP zusammengestrickt das anhand von Texten einen neuen Block erstellt. (Schachttexte abgreifen und Schachtblock erstellen) Das Problem wenn die Info fehlt und ich keinen Text wähle bricht das LSP ab. Soll aber wenn kein Objekt gewählt ist auf "0" gesetzt werden. Code: (defun c:Schacht( / sb textw1 textw2 textw3 ) ;Zum Abgreifen von Schacht Texten zu Block (setq sb(entget(car(entsel"\nAuswählen Bezeichnung:"))) textw1(cdr(assoc 1 sb))) (setq sb(entget(car(entsel"\nAuswählen DOK:"))) textw2(cdr(assoc 1 sb))) (setq sb(entget(car(entsel"\nAuswählen SOHLE:"))) textw3(cdr(assoc 1 sb))) (princ textw1)(princ textw2)(princ textw3) (command "_insert" "1schacht" (getpoint) "" "" "" textw1 textw2 textw3) )
------------------ <----- Bitte Systeminfo eintragen, warum siehst du hier. Schöne Grüsse aus der Steiermark Bernd P. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1389 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 08. Mai. 2023 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Hallo Bernd, das (car(entsel"\nAuswählen DOK:")) funktioniert noch wenn du nichts wählst aber das entget mag das nicht. Also:
Code: (if (setq dummy (car (entsel "\nAuswählen DOK:"))) (entget dummy) (print "nichts gewählt") )
------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3367 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: 08. Mai. 2023 13:24 <-- editieren / zitieren --> Unities abgeben:
Danke! (if (setq dummy (car (entsel "\nAuswählen Bezeichnung:"))) (setq sb (entget dummy) textw1(cdr(assoc 1 sb)))(setq textw1 0)) ------------------ <----- Bitte Systeminfo eintragen, warum siehst du hier. Schöne Grüsse aus der Steiermark Bernd P. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1740 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: 08. Mai. 2023 22:34 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Noch ein kleine Ergänzung zu Andreas seiner Antwort. Ich finde, solche Abfragen sind immer gut geeignet, um mit AND und OR alles zu verbinden. Dadurch kann z.B. ganz einfach gleich eine Alert-Meldung zu zu einem fehlerhaften Wert ausgegeben werden. Code:
(if (and (or(= 1 2) (alert "Das ist falsch") ) ....) (progn ...
Ich habe das für Dein Beispiel mal zusammen getippert, ob's läuft, weiß ich nicht, aber das Prinzip sollte erkennnbar sein.
Code:
(defun c:Schacht (/ sb textw1 textw2 textw3 obj) ;Zum Abgreifen von Schacht Texten zu Block (if (and (or (and (setq obj (car (entsel "\nAuswählen Bezeichnung:"))) (setq sb (entget obj)) (or (= "TEXT" (cdr (assoc 0 sb))) (alert "Info: das gepickte Objekt war kein Text.") ) (setq textw1 (cdr (assoc 1 sb))) ) (setq textw1 "<Bezeichnung>") ) (or (and (setq obj (car (entsel "\nAuswählen DOK:"))) (setq sb (entget obj)) (or (= "TEXT" (cdr (assoc 0 sb))) (alert "Info: das gepickte Objekt war kein Text.") ) (setq textw2 (cdr (assoc 1 sb))) ) (setq textw2 "<0.00>") ) (or (and (setq obj (car (entsel "\nAuswählen SOHLE:"))) (setq sb (entget obj)) (or (= "TEXT" (cdr (assoc 0 sb))) (alert "Info: das gepickte Objekt war kein Text.") ) (setq textw3 (cdr (assoc 1 sb))) ) (setq textw3 "<0.00>") ) ) (progn (princ textw1) (princ textw2) (princ textw3) (command "_insert" "1schacht" (getpoint) "" "" "" textw1 textw2 textw3) ) ) )
Ich glaube, wenn die eigentliche Abfrage in einer gesonderte Funktion gepackt wird, dann ist es deutlicher:
Code:
(defun c:Schacht (/ textw1 textw2 textw3 ) ;Zum Abgreifen von Schacht Texten zu Block (if (and (setq textw1(Schacht:Abfrage "\nAuswählen Bezeichnung:" "<Bezeichnung>")) (setq textw2(Schacht:Abfrage "\nAuswählen DOK:" "<0.00>")) (setq textw3(Schacht:Abfrage "\nAuswählen SOHLE:" "<0.00>")) ) (progn (princ textw1) (princ textw2) (princ textw3) (command "_insert" "1schacht" (getpoint) "" "" "" textw1 textw2 textw3) ) ) )(defun Schacht:Abfrage (EntselMsg DummyString / obj sb textw ) (or (and (setq obj (car (entsel EntselMsg))) (setq sb (entget obj)) (or (= "TEXT" (cdr (assoc 0 sb))) (alert "Info: das gepickte Objekt war kein Text.") ) (setq textw (cdr (assoc 1 sb))) ) (setq textw DummyString) ) textw )
------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool [Diese Nachricht wurde von joern bosse am 08. Mai. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 839 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 09. Mai. 2023 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Zitat: Original erstellt von joern bosse: Noch ein kleine Ergänzung zu Andreas seiner Antwort. Ich finde, solche Abfragen sind immer gut geeignet, um mit AND und OR alles zu verbinden.
Für Fortgeschrittenere: in den meisten Fällen kann man dann auch auf die IF Konstruktion verzichten und erzielt mehr Übersicht im Code und höhere Performance: Anstelle Code:
(if (setq en (car (entsel)) (setq el (entget en)) )
geht auch das: Code:
(and (setq en (car (entsel)) (setq el (entget en)) )
Und natürlich geht das auch in weitaus komplexeren Situationen, in denen z.B. eine OR Konstruktion ein komplexes COND ersetzen kann. Hier beispielsweise eine INIT-Abfrage, in der eine globale Variable entweder schon gesetzt ist, oder in der Reihenfolge aus einem Dictionary der DWG gelesen wird, oder aus einem RegDB-Eintrag, oder einer INI-Datei:
Code:
(or ::GLOBVAR (setq ::GLOBVAR (readfromdictionary "::GLOBVAR")) (setq ::GLOBVAR (readfromregdb "::GLOBVAR")) (setq ::GLOBVAR (readfrominifile "::GLOBVAR")) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1389 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 09. Mai. 2023 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd P
Ja, herrlich, das sind natürlich Programmkonstruktionen die man am Anfang vielleicht nicht sofort durchschaut. Sobald bei AND ein Ausdruck nil ist wird nicht weitergemacht. Sobald bei OR ein Ausdruck nicht nil ist wird nicht weitergemacht. Bin ich auch drüber gestolpert aber dann hatte ich ja Axels Seiten gefunden ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |