Olivier Eckmann Posté(e) le 20 février 2014 Partager Posté(e) le 20 février 2014 Bonjour, j'essaie de mettre en oeuvre le lisp suivant trouvé sur ce site ;; Grread+osnap+GRVECS ;; Rewritten by Fools @ TheSwamp.org ;; ;; Use (grread) to get original point ;; Use (osnap) to calculate accurate point ;; Use (GRVECS) to show AutoSnapMarker ;; No return , just show the method (DEFUN c:tmp (/ AUTOSNAPMARKERCOLOR AUTOSNAPMARKERSIZE DRAG GHOSTPT LST_OSMODE STR_OSMODE TIME DistPerPixel Bold Draftobj VecsLst get_osmode sparser YPY_VecsList YPY_GetGrvecs YPY_DrawVecs ) ;; CAB 10/5/2006 ;; Fools change a little about "," (3/3/2007) ;; ;; Function to return the current osmode setting in the form of a string ;; If (getvar "osmode") = 175 ;; (get_osmode) returns "_end,_mid,_cen,_nod,_int,_per" (DEFUN get_osmode (/ cur_mode mode$) (SETQ mode$ "") (IF (< 0 (SETQ cur_mode (GETVAR "osmode")) 16383) (MAPCAR (FUNCTION (LAMBDA (x) (IF (NOT (ZEROP (LOGAND cur_mode (CAR x)))) (IF (ZEROP (STRLEN mode$)) (SETQ mode$ (CADR x)) (SETQ mode$ (STRCAT mode$ "," (CADR x))) ) ) ) ) '((1 "_end") (2 "_mid") (4 "_cen") (8 "_nod") (16 "_qua") (32 "_int") (64 "_ins") (128 "_per") (256 "_tan") (512 "_nea") (1024 "_qui") (2048 "_app") (4096 "_ext") (8192 "_par") ) ) ) mode$ ) ;; This one uses pointers ;; written by CAB @ TheSwamp.org (DEFUN sparser (str delim / ptr lst stp) (SETQ stp 1) (WHILE (SETQ ptr (VL-STRING-SEARCH delim str (1- stp))) (SETQ lst (CONS (SUBSTR str stp (- (1+ ptr) stp)) lst)) (SETQ stp (+ ptr 2)) ) (REVERSE (CONS (SUBSTR str stp) lst)) ) ;;My functions ;;Initial Grvecs List (DEFUN YPY_VecsList (/ CIRCLE CROSS SQUARE LINE) (SETQ square '(((-1 1) (-1 -1) (1 -1) (1 1) (-1 1)))) (SETQ cross '(((-1 1) (1 -1)) ((-1 -1) (1 1)) ((1 0.859) (-0.859 -1)) ((-1 0.859) (0.859 -1)) ((0.859 1) (-1 -0.859)) ((-0.859 1) (1 -0.859)) ) ) (SETQ circle '(((0 1) (-0.707 0.707) (-1 0) (-0.707 -0.707) (0 -1) (0.707 -0.707) (1 0) (0.707 0.707) (0 1) ) ) ) (SETQ line '(((1 1) (-1 1)))) (LIST (CONS "_end" square) ;square '("_mid" ((0 1.414) (-1.225 -0.707) (1.225 -0.707) (0 1.414)) ) ;triangle (CONS "_cen" circle) ;circle (APPEND '("_nod") square cross) ;circle+cross '("_qua" ((0 1.414) (-1.414 0) (0 -1.414) (1.414 0) (0 1.414)) ) ;square rotate 45 (CONS "_int" cross) ;cross '("_ins" ((-1 1) (-1 -0.1) (0 -0.1) (0 -1.0) (1 -1) (1 0.1) (0 0.1) (0 1.0) (-1 1) ) ) ;two squares '("_per" ((-1 1) (-1 -1) (1 -1)) ((0 -1) (0 0)) ((0 0) (-1 0)) ) ;two half square (APPEND '("_tan") circle line) ;circle+line (APPEND '("_nea") '(((1 -1) (-1 -1))) line cross) ;two line+cross '("_qui") ; ??? (APPEND '("_app") square cross) ;square+cross '("_ext" ((0.1 0) (0.13 0)) ((0.2 0) (0.23 0)) ((0.3 0) (0.33 0)) ) ;three points '("_par" ((0 1) (-1 -1)) ((1 1) (0 -1))) ;two lines rotate 45 ) ) ;;Get Grvecs List (DEFUN YPY_GetGrvecs (pt dragpt lst vecs / KEY) (SETQ key T) (WHILE (AND key lst) (IF (EQUAL (OSNAP dragpt (CAR lst)) pt 1E-6) (SETQ key nil) (SETQ lst (CDR lst)) ) ) (CDR (ASSOC (CAR lst) vecs)) ) ;;Use GRVECS (DEFUN YPY_DrawVecs (Pt Vecs Size Color / lst matrix) ;;no Z axis (SETQ matrix (LIST (LIST Size 0.0 0.0 (CAR pt)) (LIST 0.0 Size 0.0 (CADR pt)) (LIST 0.0 0.0 1.0 0.0) (LIST 0.0 0.0 0.0 1.0) ) ) (GRVECS (APPLY (FUNCTION APPEND) (APPLY (FUNCTION APPEND) (MAPCAR (FUNCTION (LAMBDA (x) (IF (> (LENGTH x) 2) (MAPCAR (FUNCTION LIST) (MAPCAR (FUNCTION (LAMBDA (x) Color)) x) x (CDR x) ) (LIST (CONS Color x)) ) ) ) Vecs ) ) ) matrix ) ) ;;**************************** ;; Main Routine starts here ;;**************************** (VL-LOAD-COM) (SETQ time T) (SETQ VecsLst (YPY_VecsList)) (SETQ str_osmode (get_osmode)) (SETQ lst_osmode (sparser str_osmode ",")) (SETQ Draftobj (VLA-GET-DRAFTING (VLA-GET-PREFERENCES (VLAX-GET-ACAD-OBJECT)) ) ) (SETQ AutoSnapMarkerSize (VLA-GET-AUTOSNAPMARKERSIZE Draftobj)) (SETQ AutoSnapMarkerColor (VLA-GET-AUTOSNAPMARKERCOLOR Draftobj)) (WHILE time (GRREAD (SETQ drag (GRREAD T 1 1))) ;Can change like (grread T 15 2) (COND ((= (CAR drag) 5) (REDRAW) (SETQ drag (CADR drag)) (IF (OR (ZEROP (STRLEN str_osmode)) (NULL (SETQ ghostpt (OSNAP drag str_osmode))) ) (SETQ ghostpt drag) ;;Beacuse of mouse middle button scroll , calculate "DistPerPixel" every time (PROGN (SETQ DistPerPixel (/ (GETVAR "VIEWSIZE") (CADR (GETVAR "SCREENSIZE")))) ;;Bold (SETQ Bold (MAPCAR '* (LIST DistPerPixel DistPerPixel DistPerPixel) (LIST (+ AutoSnapMarkerSize 0.5) AutoSnapMarkerSize (- AutoSnapMarkerSize 0.5) ) ) ) (FOREACH item Bold (YPY_DrawVecs ghostpt (YPY_GetGrvecs ghostpt drag lst_osmode VecsLst) item AutoSnapMarkerColor ) ) ) ) ) ((= (CAR drag) 3) (IF (NULL (SETQ ghostpt (OSNAP (CADR drag) (get_osmode)))) (SETQ ghostpt (CADR drag)) ) (REDRAW) (SETQ time nil) ) ) ) (PRINC) ;can return ghostpt if u want ) Lorsque mon écran est plein nord (VIEWTWIST à 0) quelque soit le SCU ça fonctionne, par contre lorsque mon Nord est tourné, ça ne fonctionne plusDans la fonction de dessin GRVECS, j'ai essayé d'introduire la rotation dans la matrice de transformation, mais ça ne fonctionne pas ;;Use GRVECS (DEFUN YPY_DrawVecs (Pt Vecs Size Color / lst matrix) ;;no Z axis ;; AJOUTER (setq dViewTwist (- (getvar "VIEWTWIST"))) (setq dR00 (* Size (cos dViewTwist) )) (setq dR01 (* Size (sin dViewTwist) )) (setq dR10 (* Size (- (sin dViewTwist)))) (setq dR11 (* Size (cos dViewTwist) )) ;; FIN DE L'AJOUT (SETQ matrix (LIST (LIST dR00 dR01 0.0 (CAR pt)) (LIST dR10 dR11 0.0 (CADR pt)) (LIST 0.0 0.0 1.0 0.0) (LIST 0.0 0.0 0.0 1.0) ) ) (GRVECS (APPLY (FUNCTION APPEND) Que mon VIEWTWIST Soit =0 ou pas les accrochages se dessinent toujours au même (mauvais) endroit => bonne position mais pas tourné.Par contre si je fait varier la variable SIZE c'est bien pris en compte. Comment introduire la rotation du viewtwist dans la matrice pour que les vecteurs temporaires se dessinent au bon endroit? Merci Olivier Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 21 février 2014 Partager Posté(e) le 21 février 2014 Salut, Si j'ai bien compris la demande, essaye ça (chez moi, ça semble fonctionner quelle que soit le SCU et la vue courante): (DEFUN YPY_DrawVecs (Pt Vecs Size Color / twist lst matrix) ;;no Z axis (SETQ pt (trans pt 1 2) matrix (list (list size 0.0 0.0 (car pt)) (list 0.0 size 0.0 (cadr pt)) '(0.0 0.0 1.0 0.0) '(0.0 0.0 0.0 1.0) ) ) (GRVECS (APPLY (FUNCTION APPEND) (APPLY (FUNCTION APPEND) (MAPCAR (FUNCTION (LAMBDA (x) (IF (> (LENGTH x) 2) (MAPCAR (FUNCTION LIST) (MAPCAR (FUNCTION (LAMBDA (x) Color)) x) x (CDR x) ) (LIST (CONS Color x)) ) ) ) Vecs ) ) ) matrix ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
Olivier Eckmann Posté(e) le 21 février 2014 Auteur Partager Posté(e) le 21 février 2014 Merci Gilles, Effectivement ça m'a travaillé une partie de la nuit et ce matin je me suis aperçu que j'avais appliqué la rotation à mes vecteurs temporaires au lieu de l'appliquer à mon point de décalage. J'avais fait plus compliqué (cos et sin) que le passage par la fonction trans. Je vais regarder plus en détail cette fonction. En tout cas ça fonctionne. Merci Olivier Lien vers le commentaire Partager sur d’autres sites More sharing options...
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