| |
| 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: LSP als Funktion mit Eingangswerten? (1778 mal gelesen)
|
FeR Mitglied
Beiträge: 150 Registriert: 27.10.2003 WinXP latest SP AutoCAD 2008+germanExpressTools SofiCAD, ProVI HP xw4400 CoreDuo 2.4GHz 2GB RAM NVIDIA Quadro NVS 285
|
erstellt am: 12. Jul. 2005 18:43 <-- editieren / zitieren --> Unities abgeben:
Klingt jetzt vielleicht dumm aber es geht folgende Aufgabenstellung: Ich starte einr Lsp -Routine und gebe in der selben Kommandozeile auch Argummente mit. Vielleicht ist es verständlicher wenn ich es in ein Beispiel packe: Ich möchte z.B o4 eingeben für offset um 4 units ohne das lästige o [Bestätigen] 4 [Bestätigen]. Mir passiert die Eingabe beim schnellen Tippen nur zu oft :-( Versteht mich einer? Ich denke es wird nicht gehen, ich würde mich gerne vom Gegenteil überraschen lassen. :-)
------------------ mfg FeR "gefundene Rechtschreibfehler dürfen behalten werden." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 12. Jul. 2005 19:01 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
|
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 12. Jul. 2005 19:04 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
Hi, also mir (was jetz nichts zu bedeuten hat) fällt mit weniger schreiben eher nichts dazu ein - das wird alles länger (ausser du definierst für jeden Fall der vorkommen kann ein defun C:... Code:
(defun c:_o4 () ;;; den _ rausnehmen (command "_offset" "4") )
Nur zielführend ist das in meinen Augen eher nicht... Die andere Möglichkeit wäre mit Parameter mitschicken... dadurch wirds aber nicht kürzer oder einfacher... Code:
(defun ox (abst) (command "_offset" abst) )
Aufruf mit (ox xy) - nur bringts halt nix... ------------------ Grüsse Thomas [Diese Nachricht wurde von tunnelbauer am 12. Jul. 2005 editiert.] 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: 12. Jul. 2005 19:05 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 12. Jul. 2005 19:34 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
einer als ACAD-Kommando definierten Funktion .. also mit (defun c:FUNCNAME(/).... können keine Parameter mitgegeben werden! Es geht nur (defun FUNCNAME (VAR1 / ) ..) mit z.B: (FUNCNAME 5) aufzurufen .. da haste dann die Klammern mit bei!!! Man kann aber innerhalb der Funktion Vorgaben setzten z.B. (or (setq VAR1 (getint "\nZahl eingeben<4>:")) (setq VAR1 4) ) bei "Ab-Entern" der getint-Funktion liefert dieselbe nil und der 2.Zweig von or wird abgearbeitet...
------------------ - 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 |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 12. Jul. 2005 19:59 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 12. Jul. 2005 20:02 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
Zitat: Original erstellt von CADmium: einer als ACAD-Kommando definierten Funktion .. also mit (defun c:FUNCNAME(/).... können keine Parameter mitgegeben werden!
Doch kann man, macht nur keinen Sinn! (defun c:test (a / ) (alert a)) (c:test "Hallo!") Henning
------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 12. Jul. 2005 20:25 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
So, nun die ultimative Lösung: in die acad.lsp eintragen: Code:
(setq za 1) (while (< za 100) (eval (read (strcat "(defun c:_O" (itoa za) " () (command \"_offset\" " (itoa za) " ))"))) (setq za (1+ za)) )
(den "_" nach c: rausnehmen!) definiert die Funktionen O1 O2...O99 Grüsse, Henning PS: wie kann man eigentlich verhindern dass c: gefolgt von "O" zu c wird? der haken Smilies in diesem Beitrag deaktivieren.funktioniert irgendwie nicht. ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure
http://www.voxelman.de [Diese Nachricht wurde von wronzky am 12. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 12. Jul. 2005 20:44 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
Zitat: Original erstellt von wronzky: Doch kann man, macht nur keinen Sinn! (defun c:test (a / ) (alert a)) (c:test "Hallo!")Henning
Tja, da hab ich mich etwas unkorrekt ausgedrückt. Mir ging's um den Aufruf als ACAD-Befehl.. TEST und Enter .. das wird nicht funzen ------------------ - 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 |
FeR Mitglied
Beiträge: 150 Registriert: 27.10.2003 WinXP latest SP AutoCAD 2008+germanExpressTools SofiCAD, ProVI HP xw4400 CoreDuo 2.4GHz 2GB RAM NVIDIA Quadro NVS 285
|
erstellt am: 13. Jul. 2005 07:58 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die vielen Antworten. Ich arbeite überall wo es geht mit Leerzeichen als Eingabe da die Taste einfach so schöööön groß ist @CADmium Danke für den Parametertipp! @wronzky witziger Lösungsansatz! Nochmals vielen Dank!
------------------ mfg FeR "gefundene Rechtschreibfehler dürfen behalten werden." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 13. Jul. 2005 18:20 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 14. Jul. 2005 11:53 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
@mapcar das mit dem errorhandler geht doch meines erachtens nicht, da ja kein Lisp-Fehler auftaucht, wenn Autocad meldet "Unbekannter Befehl". Daher denke ich der variabelste Weg ist über den Reactor vlr-command-reactor:vlr-unknownCommand. etwa so: Code:
(defun c:init-build-command () (vl-load-com) (if (not (reactor-is-active '((:vlr-unknownCommand . build-command)) ':vlr-command-reactor)) (setq build-command-reactor (vlr-command-reactor "my-new-command" '((:vlr-unknownCommand . build-command)))) ) ) (defun reactor-is-active (funktion typ / aktive_reactors result) (setq aktive_reactors (cdar (vlr-reactors typ))) (foreach n aktive_reactors (if (equal (vlr-reactions n) funktion) (setq result t)) ) (eval result) )
(defun build-command (reaktor parameter / command_to_build car_string cdr_string) (setq command_to_build (car parameter)) (setq car_string (strcase (substr command_to_build 1 1))) (setq cdr_string (strcase (substr command_to_build 2))) (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object))) (cond ((= car_string "O");offset (vla-SendCommand thisdrawing (strcat "_offset " cdr_string " ")) ) ) )
Wenn man jetzt O2 eingibt, wird der Reactor "unbekannter Befehl" ausgelöst, und an Autocad der Befehl "_offset" zurücgeschickt. Viel Konstrukt, aber es geht! Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 14. Jul. 2005 16:07 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
|
FeR Mitglied
Beiträge: 150 Registriert: 27.10.2003 WinXP latest SP AutoCAD 2008+germanExpressTools SofiCAD, ProVI HP xw4400 CoreDuo 2.4GHz 2GB RAM NVIDIA Quadro NVS 285
|
erstellt am: 14. Jul. 2005 16:25 <-- editieren / zitieren --> Unities abgeben:
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 19. Jul. 2005 11:29 <-- editieren / zitieren --> Unities abgeben: Nur für FeR
Nach dem Lob des Meisters war ich etwas beflügelt, und hab' in einer freien Minute noch versucht weitere Befehle, die es nicht gibt mit dem Reactor abzufangen. Wie z.B. S[zahl] für _scale, M[zahl] für _move (in X-Richtung) und N[zahl] für _move (in Y-Richtung). Ich denke, mit dem code kann jetzt jeder weiterbasteln, bis es gar keinen unbekannten Befehl mehr gibt. Code: (defun c:init-build-command () (vl-load-com) (if (not (reactor-is-active '((:vlr-unknownCommand . build-command)) ':vlr-command-reactor)) (setq build-command-reactor (vlr-command-reactor "my-new-command" '((:vlr-unknownCommand . build-command)))) ) ) (defun reactor-is-active (funktion typ / aktive_reactors result) (setq aktive_reactors (cdar (vlr-reactors typ))) (foreach n aktive_reactors (if (equal (vlr-reactions n) funktion) (setq result t)) ) (eval result) )
(defun build-command (reaktor parameter / command_to_build car_string cdr_string ss p1 sslen zaehler thisdrawing) (setq command_to_build (car parameter)) (setq car_string (strcase (substr command_to_build 1 1))) (setq cdr_string (strcase (substr command_to_build 2))) (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object))) (cond ((= car_string "O");offset (vla-SendCommand thisdrawing (strcat "_offset " cdr_string " ")) ) ((= car_string "M");move (x-direction) (vla-selectOnScreen (setq ss (vla-add (vla-get-selectionsets thisdrawing) (strcat "sstemp" (itoa (vla-get-count (vla-get-selectionsets thisdrawing))))))) (setq sslen (vla-get-count ss)) (setq zaehler 0) (vla-StartUndoMark thisdrawing) (while (< zaehler sslen) (vla-move (vla-item ss zaehler) (vlax-3d-point '(0 0 0)) (vlax-3d-point (list (atof cdr_string) 0 0))) (setq zaehler (1+ zaehler)) ) (setq ss (vla-delete ss)) (vla-endUndoMark thisdrawing) ) ((= car_string "N");move (y-direction) (vla-selectOnScreen (setq ss (vla-add (vla-get-selectionsets thisdrawing) (strcat "sstemp" (itoa (vla-get-count (vla-get-selectionsets thisdrawing))))))) (setq sslen (vla-get-count ss)) (setq zaehler 0) (vla-StartUndoMark thisdrawing) (while (< zaehler sslen) (vla-move (vla-item ss zaehler) (vlax-3d-point '(0 0 0)) (vlax-3d-point (list 0 (atof cdr_string) 0))) (setq zaehler (1+ zaehler)) ) (setq ss (vla-delete ss)) (vla-endUndoMark thisdrawing) ) ((= car_string "S");scale (vla-selectOnScreen (setq ss (vla-add (vla-get-selectionsets thisdrawing) (strcat "sstemp" (itoa (vla-get-count (vla-get-selectionsets thisdrawing))))))) (setq sslen (vla-get-count ss)) (if (> sslen 0) (setq p1 (vlax-3d-point (getpoint "Basispunkt angeben:\n")))) (setq zaehler 0) (vla-StartUndoMark thisdrawing) (while (< zaehler sslen) (vla-scaleentity (vla-item ss zaehler) p1 (atof cdr_string)) (setq zaehler (1+ zaehler)) ) (setq ss (vla-delete ss)) (vla-endUndoMark thisdrawing) ) ) )
Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |