Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Linien und Kreise

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Linien und Kreise (1107 mal gelesen)
Sue21
Mitglied
Studentin

Sehen Sie sich das Profil von Sue21 an!   Senden Sie eine Private Message an Sue21  Schreiben Sie einen Gästebucheintrag für Sue21

Beiträge: 5
Registriert: 10.12.2005

erstellt am: 06. Jan. 2006 19:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Sehen Sie sich das Profil von Sue21 an!   Senden Sie eine Private Message an Sue21  Schreiben Sie einen Gästebucheintrag für Sue21

Beiträge: 5
Registriert: 10.12.2005

erstellt am: 06. Jan. 2006 19:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von danielboukreev an!   Senden Sie eine Private Message an danielboukreev  Schreiben Sie einen Gästebucheintrag für danielboukreev

Beiträge: 27
Registriert: 10.03.2005

erstellt am: 06. Jan. 2006 21:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue21 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue21 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von Sue21 an!   Senden Sie eine Private Message an Sue21  Schreiben Sie einen Gästebucheintrag für Sue21

Beiträge: 5
Registriert: 10.12.2005

erstellt am: 07. Jan. 2006 16:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von CAD-Huebner an!   Senden Sie eine Private Message an CAD-Huebner  Schreiben Sie einen Gästebucheintrag für CAD-Huebner

Beiträge: 9732
Registriert: 01.12.2003

One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11

erstellt am: 07. Jan. 2006 17:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue21 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 16. Jan. 2006 13:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue21 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz