| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Linien und Kreise (1226 mal gelesen)
|
Sue21 Mitglied Studentin
Beiträge: 5 Registriert: 10.12.2005
|
erstellt am: 06. Jan. 2006 19:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, als Prüfungsvorbereitung habe ich folgende AutoLISP-Programmieraufgaben gelöst, bin mir aber mit der Richtigkeit nicht ganz sicher: 1. Schreiben Sie ein AutoLISP-Programm, welches den Benutzer auffordert, eine Linie oder einen Kreis zu picken. Falls eine Linie gepickt wurde, ist deren Länge zu ermitteln und auszugeben. Falls ein Kreis gepickt wurde, sind der waagerecht und senkrecht stehende Durchmesser zu zeichnen. Danach ist das Programm jeweils zu beenden. Wurde weder Linie noch Kreis gepickt oder der Eingabebefehl abgebrochen, ist das Programm mit der Mitteilung "Falsch gepickt" zu beenden. Meine Lösung: Code:
(defun c:aufg1 () (setq elem (car(entsel "\nBitte Linie oder Kreis wählen"))) (if elem (progn (setq e_liste (entget elem) typ (cdr(assoc 0 e_liste)) ) (cond ;Unterprogramm-Aufruf ((= typ "LINE") (linie e_liste)) ((= typ "CIRCLE") (kreis e_liste)) (T(print "Falsch gepickt")) );cond );progn (progn (print "Falsch gepickt") );progn );if (princ) );Ende Hauptprogramm(defun linie (e_liste) ; 1. UP (setq ap (cdr(assoc 10 e_liste)) ; Anfangspunkt ep (cdr(assoc 11 e_liste)) ; Endpunkt laenge (distance ap ep) ) (princ laenge) (princ) );defun (defun kreis (e_liste) ; 2. UP (set mp (cdr(assoc 10 e_liste)) ; Mittelpunkt rad (cdr(assoc 40 e_liste)) ; Radius p1 (polar mp 0 rad) p2 (polar mp pi rad) p3 (polar mp (/ pi 2) rad) p4 (polar mp (/ pi -2) rad) ; kann man hier statt (-pi/2) auch ; pi*1.5 also (* pi 1.5) schreiben? ) (command "linie" p1 p2 "") (command "linie" p3 p4 "") (princ) );defun
Wie wird das mit dem Eingabebefehl abbrechen (also ESCAPE- oder ENTER-Taste drücken) realisiert? Die 2. Aufgabe folgt im nächsten Beitrag. Vielen Dank! MfG Sue Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sue21 Mitglied Studentin
Beiträge: 5 Registriert: 10.12.2005
|
erstellt am: 06. Jan. 2006 19:40 <-- editieren / zitieren --> Unities abgeben:
2. Schreiben Sie ein AutoLISP-Programm, welches den Benutzer auffordert, eine Linie oder einen Kreis zu picken. Falls ein Text gepickt wird, ist die Meldung "Text gepickt" auszugeben, der Text ist zu löschen und das Programm zu beenden. Wurde weder Linie noch Kreis gepickt (eventuell also auch gar kein Objekt) ist das Programm mit der Meldung "Fehler" zu beenden. Wurde eine Linie gepickt, ist ein Kreis zu zeichnen, dessen Mittelpunkt der Anfangspunkt der Linie ist, der Endpunkt der Linie soll auf der Kreisperipherie liegen. Wurde ein Kreis gepickt, ist ein zu dem gepickten Kreis konzentrischer Kreis zu zeichnen, der den halben Flächeninhalt des gepickten Kreises hat. Anschließend ist das Programm jeweils zu beenden. Meine Lösung: Code:
(defun c:aufg2 () (setq elem (car(entsel "\nBitte Linie oder Kreis wählen"))) (if elem (progn (setq e_liste (entget elem) typ (cdr(assoc 0 e_liste)) ) (cond ((= typ "TEXT") (print "Text gepickt") (command "löschen" elem "") ) ((= typ "LINE") (linie e_liste)) ((= typ "CIRCLE") (kreis e_liste)) (T(print "Fehler")) );cond );progn (progn (print "Fehler") );progn );if (princ) );Ende Hauptprogramm(defun linie (e_liste) (setq ap (cdr(assoc 10 e_liste)) ep (cdr(assoc 11 e_liste)) laenge (distance ap ep) ) (command "kreis" ap laenge) (princ) );Ende UP 1 (defun kreis (e_liste) (setq mp (cdr(assoc 10 e_liste)) rad (cdr(assoc 40 e_liste)) rad2 (sqrt(* 0.5 rad rad)) ) (command "kreis" mp rad2) (princ) );Ende UP 2
Den Radius des zu zeichnenden Kreises habe ich mir folgendermaßen überlegt: A2 = 1/2 A1 PI * r2² = 1/2 * PI * r1² -> r2 => Wurzel aus 1/2*r1² Der Radius ist also nicht einfach nur der halbe Radius des ersten Kreises wie man vielleicht auf den ersten Blick denken könnte, oder? MfG Sue Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danielboukreev Mitglied
Beiträge: 27 Registriert: 10.03.2005
|
erstellt am: 06. Jan. 2006 21:14 <-- editieren / zitieren --> Unities abgeben: Nur für Sue21
Hallo Generell: zunächst würde ich (wie ja schon in deinem letzten Thread beantwortet) die verwendeten Variablen lokalisieren, siehe hierzu auch die Lisp-Hilfe unter "defun" (local variables). Zu Aufg. 1: Zu deiner Frage mit dem Abbruch der Funktion: schau mal unter www.cadwiesel.de - dort dann Bauklötze und dann Error. Bezgl. (/ PI 2) und (* Pi 1.5): Nachdem, was ich in Mathematik bezgl. Einheitskreis gehört hab, dürfte das relativ egal sein, ob ich jetzt im Uhrzeigersinn um 1/4 Pi herumgehe oder entgegen dem Uhrzeigersinn um 1,5* PI. Im weiteren ist mir noch ein Fehler in der Funktion kreis aufgefallen - es sollte doch (setq mp... heißen - den Unterschied zwischen (set und (setq siehe ebenfalls in der Hilfe. zu Aufg. 2: funktioniert und stimmt so - man könnte auch hier mit der Error Funktion arbeiten. Elemente können eleganter und auch sehr leicht mit (entdel gelöscht werden Gruß daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 18.1, LibreOffice 5+
|
erstellt am: 07. Jan. 2006 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für Sue21
Hallo Sue, möchte Dir hier nur Deine Überlegung zum Radius bestätigen. Es ist so, wie Du es schreibst. Als Beispiel zäume ich das Pferd mal von hinten auf: r=5: A=r²*PI=78,54 r=10: A=314,16 Doppelter Radius ist also NICHT gleich doppelter Fläche. Das Quadrieren macht sich bemerkbar. Zahlenspielerei: Teile mal die 314,16 durch zwei (da doppelter Radius) und das Ergebnis nochmal durch zwei. Jetzt das gleiche mit r=1,5*5=7,5: A=176,71. Geteilt durch 1,5² ergibt wieder die 78,54... Wie gesagt, Spielerei . Ach so, falls es was hilft: Die Fläche läßt sich auch über den Durchmesser d (=zweifacher Radius) ermitteln: A=PI*d²/4. Schönes Wochenende noch! Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sue21 Mitglied Studentin
Beiträge: 5 Registriert: 10.12.2005
|
erstellt am: 07. Jan. 2006 16:38 <-- editieren / zitieren --> Unities abgeben:
Danke! Eine Frage noch: Muss ich bei der cond-Anweisung nach der öffnenden Klammer und der Bedingungsliste mehrere mögliche Anweisungslisten mit der progn-Funktion (progn ...) zusammenfassen (wie bei 'if') oder diese ohne auflisten (siehe oben beim Testen des Elementtyps auf TEXT)? Ebenfalls noch ein erholsames Wochenende! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 07. Jan. 2006 17:30 <-- editieren / zitieren --> Unities abgeben: Nur für Sue21
Ein Zusammenfassen mit Progn ist nicht nötig. in der Lisphilfe von AutoCAd steht dazu doch auch: Zitat:
cond Serves as the primary conditional function for AutoLISP(cond [(test result ...) ...]) The cond function accepts any number of lists as arguments. It evaluates the first item in each list (in the order supplied) until one of these items returns a value other than nil. It then evaluates those expressions that follow the test that succeeded. ...
------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 16. Jan. 2006 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für Sue21
noch eine kleiner Hinweis : beim Teilen durch 2 immer so schreiben (/ pi 2.0) bei PI ist es egal, ist aber die zu teilende Zahl zufällig eine Ganzzahl, kann ein unerwartetes Ergebnis daherkommen (/ 155 2) -> 77 (/ 155 2.0) -> 77.5 ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |