bonuscad Posté(e) le 31 janvier 2005 Posté(e) le 31 janvier 2005 Bien, on prend les mêmes et on recommence. A la différence des précédentes celle-ci fonctionne en 3D. Cette fonctionnalité ma permis de voir que ma fonction (gr-osmode) était mal écrite pour la 3D. (je modifie les post précédents). Malgré tout il me reste un problème avec cette fonction. Je l'explique pour qu'éventuellement quelqu'un puisse m'aider car je bloque. (le problème n'est que visuel, le résultat est bon)(gr-osmode arg1 arg2) est donc appelé avec pour:arg1 : le point dynamique fourni par (grread) de la fonction principal sous forme de liste (x y z)arg2 : le mode d'accrobj en cours sous forme de chaine de caractère ex: "_end,_int_,_mid" La fonction se charge de vérifier si le point fourni peut éventuellement correspondre à un mode d'accrochage en cours et si oui dessiner le petit symbole en rouge d'accrochage correspondant. (Il faut savoir que (grread) ne répond pas à la variable osmode)(grread) ne pouvant fournir plusieurs entrées, ou alors le code deviendrait plus compliqué, j'ai limité les accroches objets aux plus classiques (osmode <= 512) et abandonner les acrobj par "tracking" . Mon problème est que ces symboles sont mal représentés si je suis en vue cavalière:, variable lièes "VIEWDIR" et "VIEWTWIST". Voilà je n'arrive pas a calculer les coordonnées des petits symboles pour les redressé par rapport à la vue orthogonale de l'écran. Voilà le code (defun gr-osmode (pt-i str-md / n pt md rap pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt56 pt67 pt78 pt85 one_o ) (setq n (/ (cadr (getvar "screensize")) 5.0)) (setq pt (osnap pt-i str-md)) (while (and (eq (strlen (setq md (substr str-md 1 4))) 4) (not one_o) ) (repeat 3 (setq rap (/ (getvar "viewsize") n) pt1 (list (- (car pt) rap) (- (cadr pt) rap) (caddr pt)) pt2 (list (+ (car pt) rap) (- (cadr pt) rap) (caddr pt)) pt3 (list (+ (car pt) rap) (+ (cadr pt) rap) (caddr pt)) pt4 (list (- (car pt) rap) (+ (cadr pt) rap) (caddr pt)) pt5 (list (car pt) (- (cadr pt) rap) (caddr pt)) pt6 (list (+ (car pt) rap) (cadr pt) (caddr pt)) pt7 (list (car pt) (+ (cadr pt) rap) (caddr pt)) pt8 (list (- (car pt) rap) (cadr pt) (caddr pt)) pt56 (polar pt (- (/ pi 4.0)) rap) pt67 (polar pt (/ pi 4.0) rap) pt78 (polar pt (- pi (/ pi 4.0)) rap) pt85 (polar pt (+ pi (/ pi 4.0)) rap) n (- n 16) ) (if (equal (osnap pt-i md) pt) (setq one_o T) ) (cond ((and (eq "_end" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt3 1) (grdraw pt3 pt4 1) (grdraw pt4 pt1 1) ) ((and (eq "_mid" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt7 1) (grdraw pt7 pt1 1) ) ((and (eq "_cen" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt5 pt7 7) (grdraw pt6 pt8 7) ) ((and (eq "_nod" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt1 pt3 1) (grdraw pt2 pt4 1) ) ((and (eq "_qua" md) one_o) (grdraw pt5 pt6 1) (grdraw pt6 pt7 1) (grdraw pt7 pt8 1) (grdraw pt8 pt5 1) ) ((and (eq "_int" md) one_o) (grdraw pt1 pt3 1) (grdraw pt2 pt4 1) ) ((and (eq "_ins" md) one_o) (grdraw pt5 pt2 1) (grdraw pt2 pt6 1) (grdraw pt6 pt8 1) (grdraw pt8 pt4 1) (grdraw pt4 pt7 1) (grdraw pt7 pt5 1) ) ((and (eq "_per" md) one_o) (grdraw pt1 pt2 1) (grdraw pt1 pt4 1) (grdraw pt8 pt 1) (grdraw pt pt5 1) ) ((and (eq "_tan" md) one_o) (grdraw pt5 pt56 1) (grdraw pt56 pt6 1) (grdraw pt6 pt67 1) (grdraw pt67 pt7 1) (grdraw pt7 pt78 1) (grdraw pt78 pt8 1) (grdraw pt8 pt85 1) (grdraw pt85 pt5 1) (grdraw pt3 pt4 1) ) ((and (eq "_nea" md) one_o) (grdraw pt1 pt2 1) (grdraw pt2 pt4 1) (grdraw pt4 pt3 1) (grdraw pt3 pt1 1) ) ) ) (setq str-md (substr str-md 6) n (/ (cadr (getvar "screensize")) 5.0) ) ) ) (defun c:line_mid (/ o mod ptx loop value key pt_e1 dz pt_e2) (setq o (getvar "osmode")) (if (or (zerop o) (eq (boole 1 o 16384) 16384)) (setq mod "_none") (progn (setq mod "") (mapcar '(lambda (xi xs) (if (not (zerop (boole 1 o xi))) (if (zerop (strlen mod)) (setq mod (strcat mod xs)) (setq mod (strcat mod "," xs)) ) ) ) '(1 2 4 8 16 32 64 128 256 512) '("_end" "_mid" "_cen" "_nod" "_qua" "_int" "_ins" "_per" "_tan" "_nea") ) ) ) (initget 1) (setq ptx (getpoint "\nSpécifiez le milieu de la ligne: ") loop T value "" ) (princ "\nSpécifiez une extrémité de la ligne: ") (while (and (setq key (grread T 4 0)) (/= (car key) 3) loop) (cond ((eq (car key) 5) (setq pt_e1 (cadr key)) (redraw) (if (and (/= mod "_none") (osnap pt_e1 mod)) (progn (gr-osmode pt_e1 mod) (setq pt_e1 (osnap pt_e1 mod)) ) ) (setq dz (- (caddr pt_e1) (caddr ptx)) pt_e2 (polar (list (car ptx) (cadr ptx)) (+ (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) pi ) (distance (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) ) pt_e2 (list (car pt_e2) (cadr pt_e2) (- (caddr ptx) dz)) ) (grdraw pt_e1 pt_e2 7) ) ((or (member key '((2 13) (2 32))) (eq (car key) 25)) (if (null pt_e1) (setq pt_e1 (polar (list (car ptx) (cadr ptx)) (angle '(0.0 0.0) (list (car (getvar "UCSXDIR")) (cadr (getvar "UCSXDIR")) ) ) (getvar "VIEWSIZE") ) ) ) (setq d_z 0.0) (if (and (not (zerop (strlen value))) (or (eq (type (read value)) 'INT) (eq (type (read value)) 'REAL) ) ) (setq pt_e1 (polar (list (car ptx) (cadr ptx)) (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) (read value) ) pt_e2 (polar (list (car ptx) (cadr ptx)) (+ (angle (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) pi ) (distance (list (car ptx) (cadr ptx)) (list (car pt_e1) (cadr pt_e1)) ) ) pt_e1 (list (car pt_e1) (cadr pt_e1) (- (caddr ptx) dz)) pt_e2 (list (car pt_e2) (cadr pt_e2) (- (caddr ptx) dz)) loop nil ) ) (princ "\n") ) (T (if (eq (cadr key) 8) (progn (setq value (substr value 1 (1- (strlen value)))) (princ (chr 8)) (princ (chr 32)) ) (setq value (strcat value (chr (cadr key)))) ) (princ (chr (cadr key))) ) ) ) (redraw) (setvar "osmode" 0) (command "_.line" pt_e1 pt_e2 "") (setvar "osmode" o) (setvar "cmdecho" 1) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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