| |
| 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: Verbesserungsvorschläge gesucht! (1450 mal gelesen)
|
THE_ONE Mitglied Student, Alter:23
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 / zitieren --> Unities abgeben:
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
Beiträge: 251 Registriert: 13.01.2004
|
erstellt am: 05. Mrz. 2007 08:01 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
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
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 05. Mrz. 2007 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
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
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 05. Mrz. 2007 08:18 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
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
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 05. Mrz. 2007 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
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
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 / zitieren --> Unities abgeben:
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
Beiträge: 2494 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 / zitieren --> Unities abgeben: Nur für THE_ONE
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 05. Mrz. 2007 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
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
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 / zitieren --> Unities abgeben:
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 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 05. Mrz. 2007 11:55 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|