| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Simulation beschleunigen / command Befehl ersetzen (1478 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: 09. Jun. 2009 17:06 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habe hier eine kleine Simulation mit Lisp geschrieben! Habe später vor etwas größeres (aufwendigeres) zu machen.
Code: (defun C:Dreh(/ x) (setq x 30) ;(command "_.pline" "950,500" "1050,500" "1000,500" "1000,550" "1000,450" "") (command "_.rectang" "975,475" "1025,525") (command "_.pline" "950,500" "1050,500" "1050,550" "1000,550" "1000,450" "950,450" "950,550" "1050,550" "1050,450" "1000,450" "") (setq y 0) (while (<= y 89) (command "_.rotate" (entlast) "" "1000,500" "1") (setq y (+ y 1)) (command "_delay" x) ) )
Das Problem ist nur dass es schon jetzt teilweise stockt und nicht fließend läuft. Kann mir jemand sagen wie ich das ganze beschleunigen kann sodass es nicht mehr ruckelt? Ich glaube es liegt am rotate command, weiß aber nicht durch was ich diesen ersetzen könnte. Hab schon mal hier gelesen das alle command Befehle langsam sind. Wie tritt man dem entgegen. Lg THE_ONE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 09. Jun. 2009 17:09 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|
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: 10. Jun. 2009 00:08 <-- editieren / zitieren --> Unities abgeben:
Hier nun mein heutiges Ergebnis. Habe lange gebraucht da ich nicht wirklich gewusst habe, wie ich bei meiner Polylinie alle Koordinatenelemente am einfachsten bekomme (da alle mit 10 beginnen und assoc ja nur das erste liefert), um diese dann durch neue (gedrehte) zu ersetzen. Wäre daher über jeden Verbesserungsvorschlag dankbar. Außerdem ruckelt es beim ersten Durchlauf noch immer. Beim Zweiten läuft es dann aber einigermaßen flüssig wie man sehen kann. Wollte außerdem noch das eine Schraffur (die Fläche die vom mittleren und dem fette Quadrat eingeschlossen wird) mitrotiert, aber das war mir dann doch etwas zuviel, da sich ja die Gestalt der Schraffur laufend ändert. - Daher lass ich es mal so wie es ist. Lg THE_ONE Code:
(defun C:Dreh(/ x) (setq time 40) (command "_UCS" "_w") (setq xm 1000.0) (setq ym 500.0) (command "_.rectang" "975,475" "1025,525") (setq coor (list (list 950.0 500.0 ) (list 1050.0 500.0) (list 1050.0 550.0) (list 1000.0 550.0) (list 1000.0 450.0) (list 950.0 450.0 ) (list 950.0 550.0 ) (list 1050.0 550.0) (list 1050.0 450.0) (list 1000.0 450.0) ) ) (setvar "clayer" "2") ;;Kann man das besser machen?????? (command "_.pline") (foreach x coor (command x) ) (command "") (setvar "clayer" "0") (setq ed (entget(entlast))) ;; grab polyline (setvar "clayer" "1") (command "_.rectang" (list xm ym) (list (+ xm 50.0) (+ ym 50.0)) ) (setq big (entget(entlast))) (setvar "clayer" "0") (setq winkel (/ (* 1.0 PI) 180.0) ) (setq y 1) ;;jetzt wird einmal im Kreis rotiert (while (<= y 360) (progn (setq ed (rotate xm ym winkel ed)) (setq big (rotate xm ym winkel big)) (setq small_ed ed) (setq y (1+ y)) ;(entmod ed) (command "_delay" time) ) ) ) (defun rotate (x1 y1 angle1 object) (setq small_ed object) (while (/= (assoc 10 small_ed) nil) (progn (setq x (cdr(assoc 10 small_ed))) (setq object (subst (list 10 (+ (* (- (car x) x1) (cos angle1)) (* -1.0 (- (cadr x) y1) (sin angle1)) x1) (+ (* (- (car x) x1) (sin angle1)) (* (- (cadr x) y1) (cos angle1)) y1) ) (assoc 10 small_ed ) object )) (setq small_ed (cdr (member (assoc 10 small_ed) small_ed)) ) ) ) (entmod object) )
[Diese Nachricht wurde von THE_ONE am 10. Jun. 2009 editiert.]
[Diese Nachricht wurde von THE_ONE am 10. Jun. 2009 editiert.] 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: 10. Jun. 2009 00:22 <-- editieren / zitieren --> Unities abgeben:
|
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 10. Jun. 2009 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 10. Jun. 2009 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
ok .. mal eine etwas universellere Rotatefunktion .... (vl-load-com) (defun ROTATE (OBJ PKT DELTA DELAY / ENDE) (if(and(setq OBJ(cond ((=(type OBJ)'VLA-OBJECT)OBJ) ((=(type OBJ)'ENAME)(vlax-ename->vla-object OBJ)) ) ) (numberp DELTA) (numberp DELAY) (=(type PKT) 'LIST) (=(length PKT) 3) (vl-every 'numberp PKT) ) (repeat 1000 (vla-rotate OBJ (vlax-3d-point PKT) DELTA) (vla-update OBJ) (setq ENDE (+(getvar "MILLISECS")DELAY)) (While(<(getvar "MILLISECS")ENDE)) ) ) ) Aufruf z.B. (ROTATE (car(entsel"\nObjekt wählen:")) (getpoint "\nDrehpunkt wählen: ") (*(/ 1.0 180.0)PI) 10 ) ------------------ - 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 |
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: 10. Jun. 2009 10:44 <-- editieren / zitieren --> Unities abgeben:
Wahnsinn! Wie du das immer hin bekommst. Du brauchst zum effektiven rotieren nur eine Zeile: Leider bekomme ich beim ausführen: Code: ; error: bad argument type: listp 40
hab dann nachgeschaut wo der Fehler ist. Und zwar ist das der DELAY wert, also wenn ich das ausführe:
Code: (ROTATE (car(entsel"\nObjekt wählen:")) (getpoint "\nDrehpunkt wählen: ") (*(/ 1.0 180.0)PI) 50 )
bekomme ich
Code: ; error: bad argument type: listp 50
Mit numberp prüfst du das ja ab, verstehe daher nicht warum der Fehler kommt.[Diese Nachricht wurde von THE_ONE am 10. Jun. 2009 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. Jun. 2009 11:02 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
|
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: 10. Jun. 2009 11:08 <-- editieren / zitieren --> Unities abgeben:
Sorry meine Blödheit natürlich funktioniert dein Code - Unities sind unterwegs. Von wo hast du eigentlich die Systemvariable "MILLISECS" her. Die ist nirgends dokumentiert. Startet die in dem Moment wo ACAD gestartet wird? Zitat:
Nachtrag: Infos dazu habe ich hier gefunden -> http://ww3.cad.de/foren/ubb/Forum145/HTML/002385.shtmlDanke an CADmium für seine tolle und hilfreiche Arbeit hier im Board.
[Diese Nachricht wurde von THE_ONE am 10. Jun. 2009 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. Jun. 2009 11:14 <-- editieren / zitieren --> Unities abgeben: Nur für THE_ONE
na dann mußt du die funktion auch mit rotate2 aufrufen ...sonst wird deine alte genommen die zufällig rotate heißt ... ------------------ - 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 |