Invité ingoenius Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 Je cherche depuis deux jours de faire un lisp qui me permettreai de faire une rotazione sur l'axe x Du monde des blocs selectionnes ( en changeant de scu etc ) ma quand je change de scu les coordonner du point d'insertion du blocs changent et je n'arrive pas a m'en sortir ici le debut du script en question je part d'un bloc inserer a plans dans une vue du haut (standard en autocad) et je veut en une commande le tourner autour de l'axe x globale du monde , ensuite je veux faire un script de rotation pour l'axe Y et Z (le Z est la rotation normale) (defun C:RXX();rotation d'un bloc sur l'axe x du monde (setq DTR (/ PI 180)) (SETQ OSN (GETVAR "OSMODE")) ;(setq BLOCCO (car (entsel "\nSelect bloks"))) (setq ANG (getreal "\Angle? ")) ;(setq ANG 90.0) (setq BLOCCO (ssget)) (setq I 0) (setq N (sslength BLOCCO)) (repeat N (setq ENT (ssname BLOCCO I)) (setq DatiB (entget ENT)) (setq P (cdr (assoc 10 DatiB))) (setq xP (car P)) (setq yP (cadr P)) (setq zP (caddr P)) (setq P0 (list xP yP zP)) (command "_.UCS" "_Y" 90) ; changement de SCU (setq P (list zP yP xP)) (command "_ucs" "O" P "") (setq P (list 0 0 0 )); ;(SETVAR "OSMODE" 3) ;(SETQ PT (GETPOINT "\ncentro rotazione")) (SETVAR "OSMODE" 0) (command "_rotate" ENT "" P ANG) (command "_.UCS" "_p") ; restauration du SCU (command "_.UCS" "_g" "") ; restauration du SCU (setq P (cdr (assoc 10 DatiB))) ;rimetto il punto P a posto (setq I (1+ I)) ) (SETVAR "OSMODE" OSN) ) impossible pour moi d'avancer ;-(
(gile) Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 Salut, Il n'est pas nécessaire de changer de SCU en utilisant la commande _rotate3d et la fonction trans. Le point d'insertion du bloc (pt1) est exprimé, dans la liste DXF, en coordonnées SCO, il faut d'abord le traduire en coordonnées SCG. Puis on peut définir un point (pt2) sur l'axe X du SCG passant par pt1 en ajoutant 1 à la coordonnées x de pt1.Il faut ensuite traduire ces deux points en coordonnées SCU courant pour les utiliser avec la fonction command. (defun c:rxx (/ ang ss ent n pt1 pt2) (and (setq ang (getreal "Angle: ")) (setq blocco (ssget '((0 . "INSERT")))) (setq n 0) (while (setq ent (ssname blocco n)) (setq pt1 (trans (cdr (assoc 10 (entget ent))) ent 0) pt2 (list (1+ (car pt1)) (cadr pt1) (caddr pt1)) pt1 (trans pt1 0 1) pt2 (trans pt2 0 1) ) (command "_rotate3d" ent "" "_non" pt1 "_non" pt2 ang) (setq n (1+ n)) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité ingoenius Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 merci gile, je vais travailler ces fonction de transformation sco scg grand merci ;-)
Invité ingoenius Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 maintenant comment faire pour appelle le script directement avec la variable angle (est possible?) ex je tape Ryy90 e le script agit avec l'angle 90, ryy45 et l'angle pris en compte est 45........il y aune facon de faire ce type de chose?
zebulon_ Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 Bonjour, (defun ryy (ANG / ss ent n pt1 pt2) ... ... ) le code est le même, mais sans le getreal. Après on peut faire(ryy 90) ou (ryy 45) AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 Re, Pour ta dernière demande, hormis la réponse donnée par zebulon_, on pourrait définir des fonctions pour des angle déterminés, mais ça limiterait considérablement les possibilités. Dans tous les cas la différence est vraiment minime étant donné qu'on ne supprime qu'une validation (Entrée) entre l'appel de la commande et l''entrée de l'angle. Pour le code, l'utilisation de Visual LISP permet d'éviter tous les "trans" puisque toutes les valeurs sont exprimées en coordonnées SCG (defun c:rxx (/ ang ss pt1 pt2) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (and (setq ang (getangle "\nAngle: ")) (ssget '((0 . "INSERT"))) (progn (vla-StartUndoMark *acdoc*) (vlax-for o (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (setq pt1 (vlax-get o 'InsertionPoint) pt2 (list (1+ (car pt1)) (cadr pt1) (caddr pt1)) ) (vla-Rotate3d o (vlax-3d-point pt1) (vlax-3d-point pt2) ang) ) (vla-EndUndoMark *acdoc*) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité ingoenius Posté(e) le 20 mai 2008 Posté(e) le 20 mai 2008 Ok merci pour les reponse donc j'ai fait les lisp generiques + in rx90 ry90 et rz90 que sont les options que j'utilise le plus pour le visual lisp, j'aimerai bien l'apprendre, mais tant que il y a pas un livre en francais ou italien c'est pas possible pour moi possible que personne n'edite un livre sur le vlisp en francais??? [Edité le 20/5/2008 par ingoenius]
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant