Aller au contenu

[Résolu] Grread Matrice et VIEWTWIST


Olivier Eckmann

Messages recommandés

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 plus

Dans 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

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

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité