Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Verbesserungsvorschläge gesucht!

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:  Verbesserungsvorschläge gesucht! (1361 mal gelesen)
THE_ONE
Mitglied
Student, Alter:23


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

Beiträge: 299
Registriert: 27.04.2005

AMD XP 2000, 512MB-RAM, WIN XP Pro
Readon 9600Pro
VIZ 2005, Autocad 2007,(Mechanical)

erstellt am: 05. Mrz. 2007 00:26    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!

Bin derzeit dabei mir Lisp beizubringen! Hab mal etwas lisp Code geschrieben und möchte wissen ob man da irgendwie was besser machen hätte können: 

Code:

(defun c:fz()
;Erzeugung eines Blechstreifen mit Löchern!
;Angaben in cm
  (setq rahmenlänge 81.0 materialdicke 0.3 )
  (setq anzahl_h_löcher 5 loch_durchmesser 0.5 hor_lochabstand 1.0)

  (setq spoint (GETPOINT "\nPlease select STARTPOINT location: "))
;Blechstreifen erzeugen 
  (command "_box" spoint (list (+ (car spoint) rahmenlänge) (+ (cadr spoint) (* hor_lochabstand 2)) (+ (last spoint) materialdicke)))
  (setq referenz (entlast))
 
;erstes Loch erzeugen
  (command "_cylinder" (list (+ (car spoint) (/ rahmenlänge (* anzahl_h_löcher 2.0))) (+ (cadr spoint) hor_lochabstand) (last spoint)))
  (command (/ loch_durchmesser 2.0) materialdicke)
  (setq erstes_loch (entlast))
;erzeugen und herauschneiden aller Löcher bis aufs Erste
  (setq i 0)
  (repeat (- anzahl_h_löcher 1) ;repeat
  (setq i (+ i 1))
  (command "_copy" erstes_loch "" point (list (+ (car point) (* (/ rahmenlänge anzahl_h_löcher) i)) (cadr point) (last point)))
  (command "_subtract" referenz "" (entlast) "")
  );end repeat
;erstes Loch herausschneiden
  (command "_subtract" referenz "" erstes_loch "")
  (setq referenz (entlast))
)


Ich bin ja hier um noch was zu lernen daher würde ich mich freuen wenn man mir Verbesserungsvorschläge machen würde, wenn es was zu verbessern, verkürzen gibt.

MFG THE_ONE

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

criecky
Mitglied
MENSCH


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

Beiträge: 251
Registriert: 13.01.2004

erstellt am: 05. Mrz. 2007 08:01    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 THE_ONE 10 Unities + Antwort hilfreich

hallo,

also nur mal die erste zeile bedüfte meiner meinung nach schon eine verändereung:

Code:
(defun c:fz()


neu:
Code:
(defun c:fz(/ rahmenlänge anzahl_h_löcher spoint)


du solltest alle variablen auch wieder aus den speicher löschen... siehe oben. ich würde auch umlaute in progtext vermeiden.

gruss criecky    


------------------
   
Softlan macht das Netzwerk weich!

www.cbyte.de

[Diese Nachricht wurde von criecky am 05. Mrz. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 05. Mrz. 2007 08:11    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 THE_ONE 10 Unities + Antwort hilfreich

und (setq spoint (GETPOINT "\nPlease select STARTPOINT location: "))
.. was passiert , wenn der User einfach ENTER drückt? .... also z.B:
(if (setq spoint (GETPOINT ..)

oder
(or(setq spoint (GETPOINT ..))
   (setq spoint '(0 0 0))
)
oder
(initget 1 )
(setq spoint (GETPOINT "\nPlease select STARTPOINT location: "))


und statt der copy-Sache würde ich _array nehmen
------------------
      - 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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 05. Mrz. 2007 08:18    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 THE_ONE 10 Unities + Antwort hilfreich

Auch Hallo,
in der Zeile (Command "_copy" muss meiner Meinung nach die Variable "SPOINT" verwendet werden und nicht "POINT"

in der letzten Zeile kannst Du anstelle von
(setq referenz (entlast))
auch nur (entlast) verwenden, die Funktion gibt in beiden Fällen das ENTLAST-Objekt wieder http://www.autolisp-tutorial.mapcar.net/stilfragen2.html

bei den Command-Befehlen würde ich anstellen von z.B. "_copy" "_.copy" immer einen Punkt vor dem Befehl verwenden, für den Fall, daß einer den Befehl neu definiert hat.

------------------
viele Grüße

Jörn

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 05. Mrz. 2007 09:15    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 THE_ONE 10 Unities + Antwort hilfreich

Hallo THE_ONE,
zum warm werden am Montag morgen habe ich den Code nochmal anders geschrieben (das soll nicht heißen, daß der Weg besser ist, aber wenn Du schon lernen willst, kannst Du den Code ja mal auseinander nehmen)

Ich habe die ganzen Maßangaben u.s.w. in eine "Dotted Pair"-Liste gepackt. Diese Art der Variablenverpackung finde ich persönlich übersichtlich, und ich könnte die ganze Liste in eine Textdatei schreiben und dann mit LOAD wieder laden (wenn ich z.B. Benutzereistellungen speichern will)

Code:

(defun c:fz( / liste referenz pkt)
;Erzeugung eines Blechstreifen mit Löchern!
;Angaben in cm
  (setq liste '((1 . 81.0) ;;;Rahmenlänge
        (2 . 0.3) ;;;Materialdicke
        (3 . 5)  ;;;Anzahl der Löcher
        (4 . 0.5) ;;;Lochdurchmesser
        (5 . 1.0))) ;;;Horizontaler Lochabstand
  (if(setq spoint (GETPOINT "\nPlease select STARTPOINT location: "))
    (progn
      ;Blechstreifen erzeugen
      (command "_box" spoint (mapcar '+ spoint (list(cdr(assoc 1 liste))
    (*(cdr(assoc 5 liste))2.0)
    (cdr(assoc 2 liste)))))
      (setq referenz (entlast))
      ;Startkoordinate erstes Loch
      (setq pkt (polar(polar spoint 0.0(/(/ (cdr(assoc 1 liste))(cdr(assoc 3 liste)))2.0))
      (* pi 0.5)(cdr(assoc 5 liste))))
      ;;;Löcher erzeugen
      (repeat (cdr(assoc 3 liste))
(command "_.cylinder" pkt (/(cdr(assoc 4 liste))2.0)(cdr(assoc 2 liste)))
(command "_subtract" referenz "" (entlast) "")
(setq pkt (mapcar '+ pkt (list (/ (cdr(assoc 1 liste))(cdr(assoc 3 liste))) 0.0))))
      referenz)
    (alert "Kein Startpunkt"))
  )


------------------
viele Grüße

Jörn

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

THE_ONE
Mitglied
Student, Alter:23


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

Beiträge: 299
Registriert: 27.04.2005

AMD XP 2000, 512MB-RAM, WIN XP Pro
Readon 9600Pro
VIZ 2005, Autocad 2007,(Mechanical)

erstellt am: 05. Mrz. 2007 10:35    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!

Herzlichsten Dank mal allen für die Verbesserungsvorschläge!
Was hab ich daraus gelernt:


  • Code:
    (defun c:fz(/ rahmenlänge anzahl_h_löcher spoint)

    alles was in der Klammer steht wird am Ende auch wieder gelöscht.
  • immer Punktbefehle verwenden denn sie könnten ja umbenannt worden sein ( danke an joern bosse, warum hat er es selbst dann nicht gemacht  ->  auch Profis passieren mal Fehler, oder ?)
  • mapcar lässt sich auch auf mehrere Listen anwenden, also zb. so:
    (mapcar 'funktion Liste1 Liste2 List3 Liste4 ...)
    mit den Bedingungen dass die Funktion auch soviele Argumente übernimmt, dass die Listen gleich groß sind und dass die Listen funktionskompatibel sind
  • Weis nun endlich wie man Polare Koordinaten eingibt, nämlich:
    (polar startpunkt winkel strecke)
  • und ich hab mich mit dem Befehl assoc angefreundet
    (assoc erstes_Element_der_Unterliste Hauptliste) liefert die ganze Unterliste daher:
    (cdr (assoc erstes_Element_der_Unterliste Hauptliste)) damit ich die Unterliste ohne das erste Element bekomme

Was ich aber nicht verstanden habe ist wie der iniget Befehl funktioniert. Was bedeutet (initget 1), was bedeutet das Argument 1 und kann man da auch mehrere Argumente angeben??

MFG THE_ONE

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

marc.scherer
Ehrenmitglied V.I.P. h.c.
CAD-Administrator



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

Beiträge: 2490
Registriert: 02.11.2001

Windows 10 64bit
AutoCAD Architecture 2018/2019 (deu/eng)
AEC-Collection 2019 (Revit und Zeugs)
Wenn sich's nicht vermeiden läßt:
D-A-CH Erweiterung (mies implementierter Schrott)

erstellt am: 05. Mrz. 2007 10:39    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 THE_ONE 10 Unities + Antwort hilfreich

 
Zitat:
Original erstellt von THE_ONE:
Was ich aber nicht verstanden habe ist wie der iniget Befehl funktioniert. Was bedeutet (initget 1), was bedeutet das Argument 1 und kann man da auch mehrere Argumente angeben??

Dann mal meine Manöverkritik:
RTFM !   Eine ausführliche Erklärung zu initget und dessen Möglichekeiten findest Du in der Lisp-Hilfe.


------------------
Ciao,
Marc
Mein AG sucht u.a. Architekten und Bauzeichner!
Mein alter AG sucht 'nen CADMIN
   
   

[Diese Nachricht wurde von marc.scherer am 05. Mrz. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 05. Mrz. 2007 10:57    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 THE_ONE 10 Unities + Antwort hilfreich

Hallo THE_ONE,
Zitat:

# immer Punktbefehle verwenden denn sie könnten ja umbenannt worden sein ( danke an joern bosse, warum hat er es selbst dann nicht gemacht  ->  auch Profis passieren mal Fehler, oder ?)

=> copy and paste 

------------------
viele Grüße

Jörn

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

THE_ONE
Mitglied
Student, Alter:23


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

Beiträge: 299
Registriert: 27.04.2005

AMD XP 2000, 512MB-RAM, WIN XP Pro
Readon 9600Pro
VIZ 2005, Autocad 2007,(Mechanical)

erstellt am: 05. Mrz. 2007 11:47    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!

Also hab jetzt nachgeschaut und (initget 1) bewirkt einfach das keine leere Eingabe akzeptiert wird, d.h. genauer gesagt der 1er steht dafür. Also wenn ich folgenden Code habe:

Code:
(initget 1)
(setq spoint (GETPOINT "\nPlease select STARTPOINT location: "))
und ich drücke bei dieser Aufforderung dann einfach nur <ENTER> ohne etwas einzugeben, dann bekomme ich die Fehlermeldung "Ungültiger Punkt" und bekomme nochmal die Aufforderung "Please select STARTPOINT location".

soweit ich gesehen habe gibt es nur 2er Potenzen als möglich Werte für initget, also:

Code:
1  000 0000 0001    64  000 0100 0000
2  000 0000 0010    128  000 1000 0000
4  000 0000 0100    256  001 0000 0000
8  000 0000 1000    512  010 0000 0000
16 000 0001 0000    1024 100 0000 0000
32 000 0010 0000

Jede Zahl steht für genau ein Bit an der 2er Potenzstelle, d.h. 8=2³ das bedeute ein 1er an der dritten Stelle. Will man nun das mehrere Bedingungen erfüllt werden, dann kann man einfach die zahlen addieren, was aber nichts anderem als einem bitweisen ODER entspricht (wenn man sich das bitmuster der Zahlen ansieht).
Z.b.: will man, dass man bei getdist
nicht einfach <ENTER> drücken kann  = 1
bzw. das man nicht 0 eingeben kann  = 2
dann schreibt man vorher einfach
Code:
(initget 3 ); entspricht ja (initget (+ 1 2))
(setq distanz (GETDIST "\Geben sie eine Distanz ein:"))

Was jede der Zahlen (Bitmuster) genau bedeuten und auf welche Befehle sie sich auswirken steht in der Autolisp Reference (leider nur englisch).
z.b. GETPOINT interessiert nur die Bits  (0  (=1) , 3(=8) und 4(=32)). Für GETPOINT macht es daher nur Sinn Summen dieser Werte zu bilden.
Also initget und einer der folgenden Werte (1) (8) (32) (+ 1 8) (+ 1 32) (+ 8 32) (+ 1 8 32)

MFG THE_ONE

[Diese Nachricht wurde von THE_ONE am 09. Mrz. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 05. Mrz. 2007 11:55    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 THE_ONE 10 Unities + Antwort hilfreich

Wenn Ihr Termine für weitere VORLESUNGEN habt, gebt bescheid 
BTWBy the way (So nebenbei bemerkt) - du darfst auch 3 schreiben wenn du 3 meinst.

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