Aller au contenu

Qui veut dessiner des flèches?


bonuscad

Messages recommandés

J'ai été séduis par l'idée de dessiner des fleches proportionnelles à la longueur, évoqué dans les exercices des débutants en lisp.

Pour ne pas pertuber les cours (laissons les évoluer à leur vitesse) ;)

Je poste une routine que j'ai essayé de sophistiquer.

La nouvauté? On peut faire des flèches arrondies. :cool:

 

 (defun c:fleche ( / key_mod lock_mod p_begin p_end pl_wid d_pts a_pts nb_or p_x l_fl m_osm tg_dir pt_dir)
(setvar "cmdecho" 0)
(if (or (eq (getvar "USERS1") "Fixed") (eq (getvar "USERS1") "Varie"))
	(setq key_mod (getvar "USERS1"))
	(setvar "USERS1" "Fixed")
)
(if (or (eq (getvar "USERS2") "Yes") (eq (getvar "USERS2") "No"))
	(setq lock_mod (getvar "USERS2"))
	(setvar "USERS2" "No")
)
(initget 9 "Largeur Type _Width Type")
(while (eq (type (setq p_begin (getpoint "\nCorp de la flèche - Point de départ/[Largeur/Type] : "))) 'STR)
	(cond
		((eq p_begin "Width")
			(initget 4)
			(setq pl_wid (getdist (strcat "\nNouvelle largeur <" (rtos (getvar "plinewid")) ">: ")))
			(if pl_wid (setvar "plinewid" pl_wid) (setq pl_wid (getvar "plinewid")))
		)
		((eq p_begin "Type")
			(initget "Constant Variable _Fixed Varie")
			(setq key_mod (getkword (strcat "\nCorp de flèche [Constant/Variable]? <" (if (eq (getvar "USERS1") "Fixed") "Constant" "Variable") ">: ")))
			(if (not key_mod) (setq key_mod (getvar "USERS1")) (setvar "USERS1" key_mod))
			(initget "Oui Non _Yes No")
			(setq lock_mod (getkword (strcat "\nVoulez vous verrouiller le sens de gauche à droite [Oui/Non]? <" (if (eq (getvar "USERS2") "No") "Non" "Oui") ">: ")))
			(if (not lock_mod) (setq lock_mod (getvar "USERS2")) (setvar "USERS2" lock_mod)) 
		)
		(T (setq key_mod (getvar "USERS1") lock_mod (getvar "USERS2")))
	)
	(initget 9 "Largeur Type _Width Type")
)
(if (not pl_wid) (setq pl_wid (getvar "plinewid")))
(initget 9)
(setq
	p_end (getpoint p_begin "\nPosition de la pointe de la flèche: ")
	d_pts (distance p_begin p_end)
	a_pts (angle p_begin p_end)
	nb_or (/ (1+ (sqrt 5)) 2)
	l_fl (+ (* (* 0.1 nb_or) d_pts) (getvar "plinewid"))
	m_osm (getvar "osmode")
)
(if (eq lock_mod "Yes")
	(cond
		((and (> a_pts (/ pi 2)) (< a_pts (/ (* pi 3) 2)))
			(setq
				a_pts p_end
				p_end p_begin
				p_begin a_pts
				a_pts (angle p_begin p_end)
			)
		)
	)
)
(initget "Arc Segment _Arc Vertex")
(cond
	((eq (getkword "\nDessinée avec [Arc/Segment droit]? : ") "Arc")
		(grdraw p_begin p_end -1)
		(initget 1)
		(setq tg_dir (getangle p_begin "\nTangente du corp de la flèche: ") pt_dir (polar p_begin tg_dir d_pts))
		(grdraw p_begin p_end -1)
		(if (and (or (> (- a_pts tg_dir) 0) (< (- a_pts tg_dir) (- pi))) (< (- a_pts tg_dir) pi))
			(setq p_x (polar p_begin (+ tg_dir (* (1- nb_or) (rem (- (+ (* 2 pi) a_pts) tg_dir) pi))) (* (1- nb_or) d_pts)))
			(setq p_x (polar p_begin (- tg_dir (* (1- nb_or) (rem (- (+ (* 2 pi) tg_dir) a_pts) pi))) (* (1- nb_or) d_pts)))
		)
		(setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384)))
		(if (eq key_mod "Fixed")
			(command "_.pline" p_begin "_arc" "_direction" pt_dir p_x "_width" l_fl 0.0 p_end "")
			(command "_.pline" p_begin "_width" (getvar "plinewid") 0.0 "_arc" "_direction" pt_dir p_x "_width" l_fl 0.0 p_end "")
		)
	)
	(T
		(setq p_x (polar p_begin a_pts (* (1- nb_or) d_pts)))
		(setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384)))
		(if (eq key_mod "Fixed")
			(command "_.pline" p_begin p_x "_width" l_fl 0.0 p_end "")
			(command "_.pline" p_begin "_width" (getvar "plinewid") 0.0 p_x "_width" l_fl 0.0 p_end "")
		)
	)
)
(setvar "plinewid" pl_wid)
(setvar "osmode" m_osm)
(setvar "cmdecho" 1)
(princ)
)

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

chapeau et très impressionné.

 

Je vais essayer de faire une fleche non proportionnelle mais a laquelle on peut demander la largeur de la fleche et saisir a la sourie la longueur de celle-ci (la fleche)

 

on peut se donner plein de challenge comme ça c'est cool non!

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Lien vers le commentaire
Partager sur d’autres sites

Très bien.

 

Bonuscad aime bien lisper, j'ai remarqué.

 

Je glisserais bien un paramètre qui aide à donner une pointe de flèche de longueur variable, car je vois bien que la largeur et la longueur de pointe sont est donnés en proportion de la longueur totale.

 

Enfin, il ya 1000 facons de faire mais voilà déjà un LISP à glisser dans son acaddoc.lsp (fichier que l'on peut personnaliser et qui est chargé à chaque dessin).

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos commentaires. :D

 

J'espère de ne pas avoir démotivé les futurs lispeurs du forum en ayant empiété sur leur exercice.

De tout façon cette routine a certainement des failles.

Celles que j'ai remarqués sont; le mode arc en mode ORTHO (tangante 0) et/ou le mode ACCROBJ (ext => point départ=point d'arrivée) qui font avorter la routine par un message *incorrect*.

 

Donc a vos claviers pour la corriger et l'améliorer.

Le DCL peut être envisagé si de nombreuses options sont ajoutées. Tel qu'elle est je trouve que c'est inutile car le menu contextuel (click droit) et largement suffisant (à mon avis), mais le challenge reste ouvert ;) .

 

 

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é