| |
| 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: Lisp Programmierung (ein Dorf in China?) (1304 mal gelesen)
|
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007
|
erstellt am: 30. Jul. 2007 16:33 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich lese schon lange dieses Forum, und es hat mir auch schon öfters geholfen. Da ich nun absolut keinen plan hab, melde ich mich auch mal zu wort. Ich suche eine einfach verständliche anleitung zu lisp. Kann auch ruhig in englisch sein. PS.: Sollte es das falsche Forum sein, so bitte ich das zu entschuldigen, und den Thread in das richtige Forum zu verschieben. Des weiteren hab ich vor, Menübuttons so zu gestalten, dass ich einfach draufklicke, und dass dann ein komplettes layout gezeichnet wird. Jedoch wird das layout immer mist.
Der Befehl für den Button sieht so aus (nur n auszug): Code: ^C^C_rectang;0,0;@1189,841;;_rectang;....
Das Semikolon wird ja als enter gewertet. Und da ich ein Standard layout mit rechtecken, und linien für faltmarken, ... zeichnen will, erschien mir das am sinnvollsten, da ich nicht eine extra lisp datei dazupacken muss. Auch da würd ich mich über hilfe freuen. Danke im voraus Andreas
------------------ Garten ist eine Kunstnatur Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
Grebe Mitglied
Beiträge: 536 Registriert: 16.12.2002
|
erstellt am: 31. Jul. 2007 09:35 <-- editieren / zitieren --> Unities abgeben: Nur für Obi-Wahn
Zu deinem Layout-Problem: 1. Was heisst "Layout wir nix" ? Sitzen die Linien nicht da wo sie sitzen sollten ? Könnte daran liegen, dass in den Optionen und Benutzereinstellungen die Priorität für Koordinateneingabe auf Objektfang steht. Dann könnte der Objektfang zuschlagen. Besser auf tastatureingabe umstellen. 2. Ein Diesel-Makro kann nur eine bestimmte Länge haben - evtl. stösst Du da an Grenzen. Dann besser ein Skript erstellen und das per Makro ausführen lassen. 3. Warum erstellst du nicht eine DWT, die Deinen Wünschen entspricht ? Die kannst Du direkt in Acad zeichen und fügst sie dann als neues Layout ein ? Mathias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007 P4m Single Core - 1.6 GHz 100 GB HDD 1 GB RAM -------- AutoCAD Architectural Desktop 2007
|
erstellt am: 31. Jul. 2007 10:09 <-- editieren / zitieren --> Unities abgeben:
@Rabbit: Thx, ich werd mir diesel mal anschauen. @Grebe: Zu 1: Ja, die Linien sind nicht da wo sie sein sollten (die rechtecke), jedoch werden die einzellinien für die Faltmarken garnicht gezeichnet. Zu 2: Kann man lisps in eine Menüdatei einbinden, sodass beim laden der menüdatei die lisp extrahiert wird? Oder zumindest einen befehl/befehle ausführen, der die lisp dann läd? Denn ich möchte das ganze möglichst "narrensicher" ausführen, da nicht jeder mit laden von menüdateien oder lisps klarkommt. Zu 3: ich erstelle eine Menüdatei (CUI und MNU inkl. Grafik-dll) in der ich einige Tools zusammenfasse, die im CAD zwar vorhanden sind, jedoch nicht jeder gleich findet. Die Menüdatei wird dann auf meiner HP veröffentlicht. Daher funktioniert das schonmal nicht, da jeder ein anderes layout hat. Weiters arbeite ich auch mal in einer komplett leeren Zeichnung ohne voreinstellungen oder brauche in einer zeichnung noch ein zusätzliches layout, und da wäre es einfacher einfach einen Button zu klicken, anstatt ein layout markieren, kopieren oder duplizieren und das überflüssige rauslöschen. Abgesehen davon, hab ich nur A0 vorlagen eingestellt, weil ich die bis auf ausnahmen permanent benutze. Wenn ich jetzt aber z.b. ein A2 brauche, ist ein button praktisch. Ich werd mal die Optionen checken, und schauen ob die einstellungen auf Objektfang stehen.
------------------ Garten ist eine Kunstnatur Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 06. Aug. 2007 18:54 <-- editieren / zitieren --> Unities abgeben: Nur für Obi-Wahn
|
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007 P4m Single Core - 1.6 GHz 100 GB HDD 1 GB RAM -------- AutoCAD Architectural Desktop 2007
|
erstellt am: 07. Sep. 2007 18:02 <-- editieren / zitieren --> Unities abgeben:
@Rabbit: Danke, dein Code hat mir schon etwas geholfen... Ich hab nun endlich die Zeit gefunden, mich meinem "Projekt" wieder zu widmen, und hab heute den Code für das A0 layout erstellt.
Code: (setq OldOsmode (getvar "OSMODE")) (setvar "OSMODE" 0) (command "_rectang" '(0 0) '(1189 841)) (command "_rectang" '(20 10) '(1179 831)) (command "_line" '(0 594) '(20 594) "") (command "_line" '(0 297) '(20 297) "") (command "_line" '(210 10) '(210 0) "") (command "_line" '(319.5 0) '(319.5 10) "") (command "_line" '(429 0) '(429 10) "") (command "_line" '(619 0) '(619 10) "") (command "_line" '(809 0) '(809 10) "") (command "_line" '(999 0) '(999 10) "") (command "_line" '(1179 594) '(1189 594) "") (command "_line" '(1179 297) '(1189 297) "") (command "_line" '(210 841) '(210 831) "") (command "_line" '(319.5 831) '(319.5 841) "") (command "_line" '(619 831) '(619 841) "") (command "_line" '(809 831) '(809 841) "") (command "_line" '(999 831) '(999 841) "") (command "_line" '(429 841) '(429 831) "") (command "_line" '(0 68.5) '(10 68.5) "") (command "_line" '(0 228.5) '(10 228.5) "") (command "_line" '(0 148.5) '(20 148.5) "") (command "_line" '(0 297) '(20 400.619) "") (command "_line" '(103.699 831) '(105 841) "") (command "_zoom" "g") (setvar "OSMODE" OldOsmode)
ich hab ihn zwar mit mehr glück als verstand zusammengeschustert, aber nachdem ich hier das Lisp-Handbuch für R14 gefunden hab, versteh ich ihn sogar.... :) However, ich will mich daran machen, nicht nur bei 0,0 das layout einzufügen, sondern eine abfrage nach den koordinaten starten, bei denen das teil eingefügt werden soll. Einfügepunkt währe dann die linke untere ecke des Layouts. Weiters hab ich mich dazu durchgerungen, wenn alles fertig ist einen installer zu schreiben, und deswegen spiel ich eine extra .lsp dazu, in der alles steht. Doch nun steh ich an. Ich frage mit der Zeile:
Code: (setq EFGPT (getpoint "\nEinfügepunkt angeben <0,0>"))
Den einfügepunkt ab. Ich habs im CAD getestet, und da ist dann in der befehlszeile z.b. die ausgabe:(10.56 120.45 0.0) um die einzelnen werte jedes objekts des layouts hinzuzufügen, dachte ich daran, den string bei jedem leerzeichen zu teilen, die klammern zu entfernen und dann mit den koordinaten zu addieren. Also meine Fragen:
Wie bekomm ich aber die koordinaten in einzeine variablen, und wie rechne ich dann mit denen? Ich komm zwar mit einfachen Zahlen klar (+ 2 5 7) aber kann ich die variablen genauso handhaben? Wie teile ich den string in die koordinaten auf? und wie entferne ich die klammern aus dem string? Danke Andreas PS.: Danke Theodor. Muss ich mir mal ansehen... ------------------ Garten ist eine Kunstnatur Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 07. Sep. 2007 18:30 <-- editieren / zitieren --> Unities abgeben: Nur für Obi-Wahn
getpoint liefert keinen String, sondern eine Liste zurück... guck dir mal das an : (setq P (getpoint "\nPunkt")) (setq P2 '(10 30 40)) (mapcar '+ P P2) ansonsten ... verschieb doch einfach das BKS entsprechend und setzt es nach deinem Programm zurück.. da du eh alles mit commands abdeckst..
------------------ - 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 |
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007
|
erstellt am: 08. Sep. 2007 13:59 <-- editieren / zitieren --> Unities abgeben:
Achso. Danke. Ich hab jetzt die Lisp fertig, das einzige was mich dabei stört ist, dass, da ich zuerst den Objektfang ausschalte, nacher beim einschalten des Objektfangs der Variablenwert in der Befehlszeile steht. (Einfügepunkt angeben <0,0>:175) Das 175 soll entfernt werden, da es die benutzer verwirren könnte... Kann man das nicht einfach nach nirgendwo umleiten, wie z.b. bei Batch? (ping 127.0.0.1 > nul) Ich hab mal die lisp als Anhang genommen, da der ganze code doch schon etwas länger ist... konstruktive kritik ist übrigens herzlich wilkommen...
------------------ Garten ist eine Kunstnatur Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007
|
erstellt am: 08. Sep. 2007 15:43 <-- editieren / zitieren --> Unities abgeben:
Optimal. Danke. Lieg ich richtig, dass die ausgabe des letzten befehls der funktion als bestätigung ausgegeben wird? Oder hat das einen anderen Grund, dass der Objektfangvraiablenwert erschienen ist? ------------------ Garten ist eine Kunstnatur Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied | |
Obi-Wahn Mitglied Student
Beiträge: 31 Registriert: 30.07.2007
|
erstellt am: 10. Sep. 2007 11:37 <-- editieren / zitieren --> Unities abgeben:
Ok. Ich hab mir den teil von defun durchgelesen, aber bin soweit wie vorher. AKA: Ich hab keinen plan von freigeben der Variablen. Aber anderes Thema: Um den Sourcecode zu kürzen, hab ich mir gedacht, ich definier eine funktionsvariable und überprüfe, welche variable weitergegeben wurde. Doch anscheinend ist es so, dass je einfacher der gedanke wird, desdo komplizierter wird die ausführung... Ich hab den code mal testweise mit einem rechteck bestückt und hochgeladen, aber beim funktionsaufruf (egal ob mit A0 A1 A2 oder A3) springt er bis zum ende durch, und beendet das programm. Der aufruf erfolgt testweise in der Befehlszeile per "(LAY A0)" Könnte mir vll. jemand nen tip geben, wo ich am schlauch steh? Danke Andreas ------------------ Garten ist eine Kunstnatur [Diese Nachricht wurde von Obi-Wahn am 10. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 10. Sep. 2007 11:43 <-- editieren / zitieren --> Unities abgeben: Nur für Obi-Wahn
Dein veschachteltetes if ist ja nutze doch die Funktion cond dafür. Und ganz ehrlich: die Rahmen würd ich einmal zeichen und die dwg dann per DC als Block in die aktuelle Zeichnung ziehen. ------------------ - 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: 10. Sep. 2007 12:33 <-- editieren / zitieren --> Unities abgeben: Nur für Obi-Wahn
Ich habe deinen Code mal ein wenig gekürzt. Du kannst sehen, dass es noch andere Möglichkeiten gibt, als irgendwelche Unterscheidungen. Ich habe einfach eine Format-Liste definiert, und durchsuche die dann eben nach dem vom Benutzer eingegebenen Format. Wird's gefunden - alles gut - und wenn nicht gibts eine Meldung.
Code:
(defun c:LAY ( / antw EFGPT FMT FMT-LISTE) (initget "A0 A1 A2 A3 A4") (setq FMT-LISTE '(("A4" 210.0 297.0) ("A3" 420.0 297.0) ("A2" 594.0 420.0) ("A1" 840.0 594.0) ("A0" 1189.0 840.0) ) antw (getkword "\nFormat [A0/A1/A2/A3/A4] <A4>: ") FMT (if antw antw "A4") antw (getpoint "\nEinfügepunkt angeben: ") EFGPT (if antw antw '(0.0 0.0 0.0)) ) (if (assoc FMT FMT-LISTE) (command "_rectang" EFGPT (mapcar '+ EFGPT (cdr(assoc FMT FMT-LISTE)))) (alert "Kein gültiges Papierformat!") ) (princ) )
Bei Fragen ... 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 |