Aller au contenu

Courbure dans une polyligne


Titifonky

Messages recommandés

Salut,

 

J'aimerais bien savoir comment retrouver le centre d'un arc contenu dans une LWPOLYLINE

J'ai regardé la définition d'une LWPOLYLINE, on trouve les sommets (10) mais aucune donnée tel que le centre ou le rayon quand elle contient des arc. Et à quoi correspond l'indice (42), j'ai regardé dans l'aide et je trouve Courbure de la ligne. Comment est exprimé cette courbure? :casstet:

 

Merci

www.le-metal.net, sur la métallerie
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je remet le couvert sur ce FIL

 

Après les observations qui m'ont été faites je commente le code !

Ca permettra peut être de comprendre l'autre fil.

 

Donc voici le code reprenant une partie de l'autre code proposé sur l'autre sujet

 

;sous-fonction à 3 arguments
;ls => liste de points '((x y) (x y)...) ou '((x y z) (x y z) ....)
;lb => liste de réels (réel1 réel2 ...)
;flag_closed => entier bit de fermeture 0 ouvert, 1 fermé
;
(defun def_bub_pl (ls lb flag_closed / ls lb rad a l_new)
(textscr)
;
;si polyligne fermée on rajoute à la liste le dernier sommet
(if (not (zerop flag_closed)) (setq ls (append ls (list (car ls)))))
;
;tant qu'il existe un second élément dans liste on boucle
(while (cadr ls)
;
;si arrondi 0.0 donc segment droit, autrement c'est un arc
	(if (zerop (car lb))
		(progn
			(princ "\nSommet :")
			(princ (car ls))
		)
		(progn
;
;calcul trigo du rayon et de l'angle au centre
			(setq
				rad (/ (distance (car ls) (cadr ls)) (sin (* 2.0 (atan (abs (car lb))))) 2.0)
				a (- (/ pi 2.0) (- pi (* 2.0 (atan (abs (car lb))))))
			)
;si angle négatif on prend le complémentaire à 2PI
			(if (< a 0.0) (setq a (- (* 2.0 pi) a)))
			(princ (strcat "\n Rayon : " (rtos rad))) 
			(princ "\tPoint centre : ")
;
;si arrondi négatif => horaire, autrement => trigo
			(if (or (and (< (car lb) 0.0) (> (car lb) -1.0)) (> (car lb) 1.0))
				(princ (polar (car ls) (- (angle (car ls) (cadr ls)) a) rad))
				(princ (polar (car ls) (+ (angle (car ls) (cadr ls)) a) rad))
			)
		)
	)
;
;décrémente la liste des sommets et des arrondis
	(setq ls (cdr ls) lb (cdr lb))
)
)
;
;Fonction principale info_arc_poly
;retourne la valeur du rayon et du centre de l'arc de la polyligne selectionnée, si celle-ci en posède
;
(defun c:INFO_ARC_POLY ( / ent dxf_ent typ_ent closed l_bub e_next)
;
;boucle tant que rien n'est sélectionné ou n'est pas une polyligne
(while (not (or (eq typ_ent "LWPOLYLINE") (eq typ_ent "POLYLINE")))
	(while (null (setq ent (entsel "\nChoisir une polyligne: "))))
	(setq typ_ent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))))
	(if (not (or (eq typ_ent "LWPOLYLINE") (eq typ_ent "POLYLINE")))
		(princ "\nCe n'est pas une polyligne!")
	)
)
;
;traite les 2 types de polyligne
;closed => est à 1 si polyligne fermée
;lst => liste des sommets
:l_bub => liste des valeurs des arrondis
(cond
	((eq typ_ent "LWPOLYLINE")
		(setq
			closed (boole 1 (cdr (assoc 70 dxf_ent)) 1)
			lst (mapcar '(lambda (x) (trans x (car ent) 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))
			l_bub (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_ent))
		)
	)
	((eq typ_ent "POLYLINE")
		(setq
			closed (boole 1 (cdr (assoc 70 dxf_ent)) 1)
			e_next (entnext (car ent))
		)
		(while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next)))))
;
;pour accepter seulement les définition de point de polyligne 3D
;refuse les sommets inseré par le lissage ou spline et les maillages
			(if (zerop (boole 1 223 (cdr (assoc 70 dxf_next))))
				(setq
					lst (cons (trans (cdr (assoc 10 dxf_next)) (car ent) 1) lst)
					l_bub (cons (cdr (assoc 42 dxf_next)) l_bub)
				)
			)
			(setq e_next (entnext e_next))
		)
		(setq
			lst (reverse lst)
			l_bub (reverse l_bub)
		)
	)
)
;
;appel de la sous fonction def_bub avec arguments requis
(def_bub_pl lst l_bub closed)
(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

Salut,

 

J'ai cherché encore sur l'aide et je suis tombé sur une phrase interessante qui dit:

 

"Code 42: Courbure (facultatif ; valeur par défaut 0). La courbure est la tangente d'un quart de l'angle inclus dans un segment d'arc, rendu négatif si l'arc est dans le sens horaire, du point de départ au point final. Une courbure de 0 désigne un segment droit et une courbure de 1 désigne un demi-cercle"

 

Traduction :

Pour connaitre l'angle au centre de l'arc en radian il faut faire (* (atan (courbure)) 4) et on obtient l'angle de l'arc en radiant. Avec ça on peut tout faire.

 

[Edité le 2/3/2005 par Titifonky]

www.le-metal.net, sur la métallerie
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

J'ai commencé à me servie de SetBulge et Getbulge, Bulge étant la traduction anglaise de courbure., dans les fonctions VL.

 

A recommander car finalement tellement + facile que d'exploiter le code DXF

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
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é