Aller au contenu

infos sur une LWPOLYLINE en arc


CGDESSINE

Messages recommandés

Bonjour tout le monde

 

Comment récuperer dans une LWPOLYLINE de 2 points en arc ces informations :

centre, rayon, angle départ et angle de fin

Les seules infos retournées par entget sont :

les courbures et les deux points

 

Ou il y a t'il une formule

 

Merci d'avance

 

 

[Edité le 6/9/2004 par CGDESSINE]

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Inspiré de la discussion

http://www.cadxp.com/sujetXForum-3162.htm

qui m'a permis d'écrire plusieurs routines basée sur ce code:

Elever une perpendiculaire, continuer une tangente a un segment ou un arc, interroger un angle entre 2 segments, faire une bissectrice entre 2 segment, interroger 1 rayon

Voici cette dernière ou tu retrouvera le rayon calculer sur un arc de polyligne.

 

Je te laisse méditer dessus :)

 

(defun near_vertex_arr (obj / obj dxf_obj obj_vlax pt_sel pt_dist param_start param_end perim_obj e_next l_som l_arr l_dist n n_first n_second)
(setq dxf_obj (entget (car obj)))
(vl-load-com)
(setq
	obj_vlax (vlax-ename->vla-object (car obj))
	pt_sel (vlax-curve-getClosestPointTo obj_vlax (trans (osnap (cadr obj) "_near") 1 0))
	pt_dist (vlax-curve-getDistAtPoint obj_vlax pt_sel)
	param_start (vlax-curve-getStartParam obj_vlax)
	param_end (vlax-curve-getEndParam obj_vlax)
	perim_obj (vlax-curve-getDistAtParam obj_vlax (+ param_start param_end))
)
(cond
	((eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE")
		(setq
			l_som (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_obj))
			l_arr (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_obj))
		)
	)
	(T
		(setq e_next (entnext (car obj)))
		(while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next)))))
			(if (zerop (boole 1 223 (cdr (assoc 70 dxf_next))))
				(setq
					l_som (cons (cdr (assoc 10 dxf_next)) l_som)
					l_arr (cons (cdr (assoc 42 dxf_next)) l_arr)
				)
			)
			(setq e_next (entnext e_next))
		)
		(setq l_som (reverse l_som) l_arr (reverse l_arr))
	)
)
(setq l_dist (mapcar '(lambda (x) (vlax-curve-getDistAtPoint obj_vlax x)) l_som))
(if (vlax-curve-isClosed obj_vlax)
	(progn
		(setq l_som (append l_som (list (car l_som))))
		(setq l_dist (append l_dist (list perim_obj)))
	)
)
(setq n 0)
(repeat (1- (length l_dist))
	(if (and (> pt_dist (nth n l_dist)) (< pt_dist (nth (1+ n) l_dist)))
		(setq n_first n n_second (1+ n))
	)
	(setq n (1+ n))
)
(list (trans (nth n_first l_som) 0 1) (trans (nth n_second l_som) 0 1) (nth n_first l_arr))
)
(defun c:q_ray ( / ent dxf_ent typent pt_sel l_2pt)
(setvar "cmdecho" 0)
(while (not (setq ent (entsel "\nInterroger le rayon du segment arrondi: "))))
(setq typent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))) pt_sel (osnap (cadr ent) "_near"))
(cond
	((and (or (eq typent "ARC") (eq typent "CIRCLE")) (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)))
		(setq l_2pt (distance pt_sel (trans (cdr (assoc 10 dxf_ent)) 0 1)))
	)
	((or (and (eq typent "LWPOLYLINE") (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)))
		(and
			(eq typent "POLYLINE")
			(zerop (boole 1 124 (cdr (assoc 70 dxf_ent))))
			(equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0))
		)
	 )
		(setq l_2pt (near_vertex_arr ent))
		(if (zerop (caddr l_2pt))
			(princ "\nCe segment est droit et ne peut être interrogé!")
			(setq l_2pt (/ (distance (car l_2pt) (cadr l_2pt)) (sin (* 2.0 (atan (caddr l_2pt)))) 2.0)))
	)
	(T
		(if (not (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)))
			(princ "\nEntité non parralèlle au SCG.")
			(princ "\nCet objet ne peut être interrogé!")
		)
	)
)
(if (eq (type l_2pt) 'REAL)
	(progn
		(alert
			(strcat
				"\nRayon = "
				(rtos (abs l_2pt) 2 3)
			)
		)
		(princ
			(strcat
				"\nRayon = "
				(rtos (abs l_2pt) 2 3)
			)
		)
	)
)
(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

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é