| | | 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: Befehlsablauf in Lisp (1463 mal gelesen)
|
CeZet Mitglied
Beiträge: 95 Registriert: 28.08.2003
|
erstellt am: 06. Aug. 2004 15:53 <-- editieren / zitieren --> Unities abgeben:
Hi zusammen Ich habe am morgen bereit im AutoCAD-Forum einen Beitrag verfasst zum Thema Lisp oder Script für meine Wünsche. Anfangs versuchte ich es in Lisp, stieg dann aber mittags um wieder auf Script und muss nun damit auch wieder aufgeben, da es zuwenig kann für meine Bedürfnisse. Besser gesagt, ich müsste die Schnellauswahl im Script benützen können, geht aber nicht so wie ich gelesen habe. Das heisst, umsteigen auf Lisp. ich hoffe ihr helft mir bei meinen Startschwierigkeiten: Im grossen und ganzen geht es um einen Planaufbereitungsautomatismus. Burst-Befehl, Ursprung, Textstilstandard setzen, Layer verändern und einzelne Objekte verändern. 1.) Wie starte ich den Burst-Befehl in einem Lisp genau? Lisp in Lisp wäre das ja, und das ohne eigentliche Abfrage des Anwenders. Folgendes geht nicht leider: (defun c:Test ( ) (command "_burst" "ALLE" "") ) 2.) Ist es möglich die ganzen Abläufe auf Modell und Layout gleichzeitig anzuwenden? 3.)Wie bringe ich die Schnellauswahl in LISP hin? Ich möchte z.B. einen Objekttyp (z.B. Schraffur) auswählen und diesen löschen oder auf einen anderen Layer werfen. Wenn mir geholfen werden kann ist mein Weekend gerettet ;-) Grüsse CeZet [Diese Nachricht wurde von CeZet am 06. Aug. 2004 editiert.] 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: 06. Aug. 2004 21:05 <-- editieren / zitieren --> Unities abgeben: Nur für CeZet
zu 1 Starten tust du es so : (burst) falls nicht geladen, - erst laden (load "burst") aber dann wars das auch schon, da du keine Parameter uebergeben werden kannst. bleibt dir nur noch uebrig die burst lisp zu aendern. zu 2 - hm weiss nicht genau zu 3 z.B. so (setq as (ssget "X" ((0 . "HATCH")))) (if as (repeat (sslength as)(explode(ssname as 0))(setq as(ssdel(ssname as 0)))))
------------------ Gruß CADwiesel Besucht uns im CHAT
Urlaub bis 22.08.04 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 06. Aug. 2004 22:09 <-- editieren / zitieren --> Unities abgeben: Nur für CeZet
zu 1: der befehl burst ist eigentlich so definiert (defun c:burst (...) ... (defun burst(...) ) (burst) ) der korrekte Aufruf aus Lisp müßte demnach (c:burst) sein, da aber in c:burst nichts weiter geschieht als burst zu definieren und dann aufzurufen, funzt auch der vom Wiesel genannte Aufruf, auch mit der Einschränkung hinsichtlich der Parameterübergabe (der Auswahlsatz wird erst in der Routine erzeugt) 2. nicht so wie du willst 3.da hat Wiesel ein ' vergessen -> (setq as (ssget "X" '((0 . "HATCH")))) und explode ist nicht löschen, aber was solls das nur der Vollständigkeit halber. @Wiesel .. Geh mal besser tauchen und lispel erst in 2 Wochen wieder. ------------------ - Thomas -
[Diese Nachricht wurde von CADmium am 08. Aug. 2004 editiert.] 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: 09. Aug. 2004 00:41 <-- editieren / zitieren --> Unities abgeben: Nur für CeZet
Schönes Beispiel für das, was ich immer wieder (und ob's jemand hören will oder nicht) hier erzähle. So sollte ein Interface aussehen: (defun c:machwas() (machwas(objekte-wählen)) (princ) ) (defun machwas(objekte / ) (...) ) Hätte sich Adesk an diese einfachen Grundregeln gehalten, wäre das jetzt kein Problem. Lokale Funktionen wie in burst.lsp sind ein nettes Feature - aber da hat man etwas übertrieben: Alles lokal zu (defun c:burst()...) ist zuviel des Guten, so bleibt nur noch ein Befehl ohne Parameter übrig. Cadwiesel hat da durchaus Recht: burst.lsp ändern! Und zwar so, dass sie dem Schema oben entspricht. Also nur die Objektauswahl in (defun c:burst()...), alles Andere in (defun burst()...). Das sollte kein Problem sein, alles funktioniert nach wie vor, und man kann's auch von woanders benutzen. Das hier steht in burst.lsp oben drin: If you copy this computer program without permission of Autodesk, you are violating the law. Tja, musste alleine rausfinden;-) Gruß, Axel Strube-Zettler ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 09. Aug. 2004 08:19 <-- editieren / zitieren --> Unities abgeben: Nur für CeZet
@Axel : Volle Zustimmung, bloß bei mir sieht's immer so aus (defun machwas(objekte / ) (...) ) (defun c:machwas() (machwas(objekte-wählen)) (princ) ) Du siehst, dein Predigen hat zumindest bei mir Anklang gefunden! Tja, und zu burst ... wo fängt das Plagiat an ? -> aber dein Tipp zum "alleine Rausfinden" ist wohl das sicherste
------------------ - Thomas - 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: 09. Aug. 2004 19:20 <-- editieren / zitieren --> Unities abgeben: Nur für CeZet
Ich wollte eigentlich noch eine 100%ig Plagiatfreie Lösung liefern. Mein Ansatz: Genau das, was man immer macht, wenn solche 'Inkompatibilitäten' vorliegen: Man lädt die Datei 'burst.lsp', biegt aber temporär den load-Vorgang ein bisschen um, so dass das Ganze dann passt. Auf diese Weise kann man mal eine SCHEME-Funktion im LISP-Interpreter fahren oder umgekehrt. Naheliegend der Gedanke, die wenigen notwendigen Änderungen am burst-sourcecode 'on the fly' durchzuführen. Etwa so: Code:
(defun m-burst( / o_defun o_code r) (setq o_defun defun defun defun-q r(load"burst") o_code c:burst defun o_defun r(load"burst") ) ... Code manipulieren ... )
Wären noch ein paar Zeilen gewesen, und man hätte ein m-burst gehabt, das genau das macht, was gebraucht wird. Leider scheitert es mal wieder an den Fehlern im VLISP-Interpreter, die ich hier schon so oft beklagt habe. Teile des Lisp-Codes werden sonstwo evaluiert, aber nicht im Interpreter. Obwohl man defun den Wert von defun-q verpassen kann (setq defun defun-q) => #<SUBR @0af12974 DEFUN-Q>, wird weiterhin defun-ohne-q ausgeführt. Gegen solche groben Fehler im Interpreter ist man nun mal völlig machtlos. Schade - und eines Prä-Alpha-Releases würdig. Gruß, Axel Strube-Zettler ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|