Aller au contenu

Ligne par son milieu


bonuscad

Messages recommandés

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

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é