Aller au contenu

raccordement parabolique


Messages recommandés

Posté(e)

Covadis a surement de telles fonctions.

 

Sans ce progiciel, autocad n'a pas de fonctions standards pour réaliser ceci.

 

Cependant pour un besoin ponctuel sans devoir acquérir des applications spécifiques, on peut utiliser des routines en lisp pour executer de telle courbes.

 

Pour les paraboles tu peux regarder ce SUJET .

 

Dans le même ordre, je dispose d'une routine pour créer un raccordement progressif (clothoide) entre une droite et un cercle (avec un deltaR raisonnable)

Si tu en as besoin fais le savoir.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

 

Bonjour Mr Bonuscad

 

Je suis intéressé par ta routine de raccord en mode clothoide ...

 

Merci d'avance, Le Decapode

 

 

Autodesk Expert Elite Team

Posté(e)

coucou,

 

je fais faire la Langue de Vipère de base,

 

pour faire un raccordement Parabolique, il faut

choisir dans le menu : Raccordement parabolique

 

c'est la bonne réponse, non ?

 

cet humour, c'est pour faire toucher du doigt que les questions de base,

ne recevront que des reponses du même métal.

 

amicalement

 

Posté(e)

 

Hello Didier

 

Je n'ai pas tout compris :casstet:

 

Moi je n'ai jamais eu dans mes menus "Raccord Parabolique" ou "Raccord Clothoide"

 

Ou bien est ce des fonctions intégrées (en standard) depuis longtemps dans Covadis ? ;)

 

Le Decapode "interloqué"

 

Autodesk Expert Elite Team

Posté(e)

Je suis intéressé par ta routine de raccord en mode clothoide ...

 

C'est juste une béquille pour pouvoir dessiner un raccordement progressif.

 

Elle a ses limitations (calcule de factorielle selon la méthode de Fresnel), donc un raccordement s'enroulant sur lui même (type escargot) ne pourra être calculé (perte de précision). Un raccordement routier classique doit pouvoir se faire sans problème.

 

(defun factor (y / )
(cond
	((= 0 y) 1)
	(t  (* y (factor (1- y))))
)
)
(defun fact (nbr / x)
(setq x nbr)
(factor (float x))
)
(defun serie (rep / mark rp resul)
(setq
	mark 1
	rp rep
	som 0
)
(repeat (fix (* l 10))
	(setq resul (/ (expt tau rp) (* (1+ (* 2 rp)) (fact rp))))
	(if (/= (rem mark 2) 0)
		(setq resul (- resul))
	)
	(setq
		som (+ resul som)
		rp (+ rp 2)
		mark (1+ mark)
	)
)
)
(defun cloun (l / k som)
(setq
	r (/ 1 l)
	tau (/ l (* 2 r))
	k (sqrt (* 2 tau))
)
(serie 2)
(setq x (* k (+ 1 som)))
(serie 3)
(setq
	y (* k (+ (/ tau 3) som))
	xm (- x (* r (sin tau)))
	ym (+ y (* r (cos tau)))
	dltr (- ym r)
)
)
(defun matrix (pt / t_x t_y t_z t_v t_zo nw_x nw_y nw_z)
(setq
	t_x (trans '(1 0 0) 0 1 T)
	t_y (trans '(0 1 0) 0 1 T)
	t_z (trans '(0 0 1) 0 1 T)
	t_v (trans '(0 0 0) 1 0)
	t_zo (trans '(0 0 0) 0 1)
)
(setq nw_x
	(+
		(* (car pt) (car t_x))
		(* (cadr pt) (cadr t_x))
		(* (caddr pt) (caddr t_x))
		(car t_v)
	)
)
(setq nw_y
	(+
		(* (car pt) (car t_y))
		(* (cadr pt) (cadr t_y))
		(* (caddr pt) (caddr t_y))
		(cadr t_v)
	)
)
(setq nw_z
	(+
		(* (car pt) (car t_z))
		(* (cadr pt) (cadr t_z))
		(* (caddr pt) (caddr t_z))
		(caddr t_v)
	)
)
(list nw_x nw_y nw_z)
)
(defun c:clothoide ( / d ent_d c ent_c dxf_10 dxf_11 dxf_r dxf_m dxf_g pt_per dxf_ym dxf_dltr lg_clo a_clo l_u lst_r cnt tstd tstl choix p_inf resol_cl l x y xm ym r tau dltr lst_som )
(if (= (getvar "worlducs") 1)
	(progn
		(setvar "cmdecho" 0)
		(setvar "blipmode" 0)
		(setvar "orthomode" 0)
		(setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384)))
		(if (= (getvar "limcheck") 1) (setvar "limcheck" 0))
		(command "_.undo" "_control" "_all")
		(command "_.undo" "_group")
		(while (not (setq d (nentsel"\nChoix de la droite: "))))
		(setq ent_d (entget (car d)))
		(cond
			((and (equal (assoc 210 ent_d) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 ent_d)) "LINE"))
				(while (not (setq c (nentsel"\nChoix du cercle: "))))
				(setq ent_c (entget (car c)))
				(cond
					((and (equal (assoc 210 ent_c) '(210 0.0 0.0 1.0)) (or (eq (cdr (assoc 0 ent_c)) "CIRCLE") (eq (cdr (assoc 0 ent_c)) "ARC")))
						(setq
							dxf_10 (trans (cdr (assoc 10 ent_d)) 1 0)
							dxf_11 (trans (cdr (assoc 11 ent_d)) 1 0)
							dxf_r (cdr (assoc 40 ent_c))
							dxf_m (trans (cdr (assoc 10 ent_c)) 1 0)
							dxf_g (angle dxf_10 dxf_11)
							pt_per
								(inters
									(list (car dxf_10) (cadr dxf_10))
									(list (car dxf_11) (cadr dxf_11))
									(list (car dxf_m) (cadr dxf_m))
									(list
										(car (polar dxf_m (+ (/ pi 2) dxf_g) dxf_r))
										(cadr (polar dxf_m (+ (/ pi 2) dxf_g) dxf_r))
									)
									nil
								)
							dxf_ym (distance dxf_m pt_per)
							dxf_dltr (- dxf_ym dxf_r)
						)
						(cond
							((and (not (minusp dxf_dltr)) (<= dxf_dltr (* 4.0 dxf_r)))
								(setq
									lg_clo (sqrt (+ (* 24 dxf_dltr dxf_r) (* 6 (expt dxf_dltr 2))))
									a_clo (sqrt (* lg_clo dxf_r))
								)
								(setq l_u (/ lg_clo a_clo))
								(cond
									((<= l_u (* 4 (sqrt pi)))
										(cloun l_u)
										(setq lst_r (mapcar '(lambda (ww) (* ww a_clo)) (list x y xm ym dltr)))
;(prompt "\nErreur commise sur Delta R (en m.) = ") (prin1 (abs (- dxf_dltr (last lst_r))))
;(prompt "\nDelta R reel    : ") (prin1 (rtos dxf_dltr 2 5))
;(prompt "\nDelta R calcule : ") (prin1 (rtos (last lst_r) 2 5))
										(setq cnt 0)
										(while (not (equal (last lst_r) dxf_dltr 0.00001))
											(setq cnt (1+ cnt))
											(if (= (rem (1+ cnt) 2) 0)
												(setq tstd (last lst_r) tstl lg_clo)
											)
											(if (= (rem cnt 2) 0)
												(setq lg_clo (* (/ dxf_dltr (/ (+ tstd (last lst_r)) 2)) (/ (+ lg_clo tstl) 2)))
												(setq lg_clo (* (/ dxf_dltr (last lst_r)) lg_clo))
											)
											(setq a_clo (sqrt (* lg_clo dxf_r)))
											(setq l_u (/ lg_clo a_clo))
											(cloun l_u)
											(setq lst_r (mapcar '(lambda (ww) (* ww a_clo)) (list x y xm ym dltr)))
;(prompt "\nDelta R calcule : ") (prin1 (rtos (last lst_r) 2 5))
										)
										(setq choix (mapcar '(lambda (ww) (polar pt_per ww (caddr lst_r))) (list dxf_g (+ pi dxf_g))))
										(if (> (distance (car choix) (cadr d)) (distance (cadr choix) (cadr d)))
											(setq dxf_g (+ pi dxf_g))
										)
										(setq
											p_inf (polar pt_per dxf_g (caddr lst_r))
											dxf_g (+ pi dxf_g)
										)
										(prompt 
											(strcat
												"\nPas de résolution de la clothoïde <"
												(rtos (* 0.1 (sqrt lg_clo)) 2)
												"> :"
											)
										)
										(initget 6)
										(setq resol_cl (getdist))
										(if (not resol_cl) (setq resol_cl (* 0.1 (sqrt lg_clo))))
										(command "_.ucs" "_new" "_3point" p_inf pt_per dxf_m)
										(setq	lst_som (list (matrix (list (car lst_r) (cadr lst_r) 0.0))) l (- lg_clo resol_cl))
										(while (> l 0.0)
											(cloun (/ l a_clo))
											(setq lst_som (cons (matrix (list (* x a_clo) (* y a_clo) 0.0)) lst_som) l (- l resol_cl))
										)
										(setq lst_som (cons (trans (list 0.0 0.0 0.0) 1 0) lst_som))
										(command "_.ucs" "_world")
										(if (null (tblsearch "appid" "ID_CLOTHOIDE-BONUSCAD$2002"))
											(regapp "ID_CLOTHOIDE-BONUSCAD$2002")
										)
										(entmake
											(append
												(list
													'(0 . "LWPOLYLINE")
													'(100 . "AcDbEntity")
													(cons 8 (getvar "CLAYER"))
													'(100 . "AcDbPolyline")
													(cons 90 (length lst_som))
												)
												(mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) lst_som)
												(list
													(list -3
														(list 
															"ID_CLOTHOIDE-BONUSCAD$2002"
															(cons 1000 "ID_CLOTHOIDE")
															(cons 1002 "{")
															(cons 1040 dxf_g)
															(cons 1010 p_inf)
															(cons 1040 a_clo)
															(cons 1040 dxf_dltr)
															(cons 1040 tau)
															(cons 1040 lg_clo)
															(cons 1040 dxf_r)
															(cons 1010 dxf_m)
															(cons 1010 (matrix (list (car lst_r) (cadr lst_r) 0.0)))
															(cons 1002 "}")
														)
													)
												)
											)
										)
										(command "_.undo" "_end")
										(alert
											(strcat
												"\nLES ANGLES SONT EXPRIME DANS LES UNITES UTILISES"
												"\n______________________________"
												"\nOrientation de l'infini\t: " (angtos dxf_g (getvar "aunits") 4)
												"\nOrigine clothoïde      \t: X= " (rtos (car p_inf) 2 3) " Y= " (rtos (cadr p_inf) 2 3)
												"\n    Rayon a l'origine  \t: ...infini..."
												"\n    Parametre A        \t: " (rtos a_clo 2 3)
												"\n    Delta R            \t: " (rtos dxf_dltr 2 3)
												"\n    Angle TAU          \t: " (angtos tau (getvar "aunits") 4)
												"\n    Developpement      \t: " (rtos lg_clo 2 3)
												"\n    Rayon du cercle    \t: " (rtos dxf_r 2 3)
												"\n    Centre du cercle   \t: X= " (rtos (car dxf_m) 2 3) " Y= " (rtos (cadr dxf_m) 2 3)
												"\nFin le la clothoïde    \t: X=" (rtos (car (matrix (list (car lst_r) (cadr lst_r) 0.0))) 2 3) " Y= " (rtos (cadr (matrix (list (car lst_r) (cadr lst_r) 0.0))) 2 3)
												"\n______________________________"
											)
										)

									)
									(T
										(prompt "\nLongueur de clothoïde trop importante pour être résolue")
										(command "_.undo" "_end")
										(command "_.u")
									)
								)
							)
							(T
								(prompt "\nLa droite coupe le cercle ou ripage trop important; pas de solution .")
							)
						)
					)
					(T
						(prompt "\nEntité sélectionnée n'est ni un cercle, ni un arc, ou n'est pas parallèle au SGC!")
						(command "_.undo" "_end")
						(command "_.u")
					)
				)
			)
			(T
				(prompt "\nEntité sélectionnée n'est pas une ligne, ou n'est pas parallèle au SGC!")
				(command "_.undo" "_end")
				(command "_.u")
			)
		)
	)
	(prompt "\nVous n'êtes pas dans le systeme de coordonnées général !  RECTIFIEZ S.V.P")
)
(setvar "cmdecho" 1)
(prin1)
)

 

La routine d'info pour utiliser après coup

 

(defun c:idclo ( / esel ename elist xd_list cnt10 cnt40 app_list app_sub_list xd_code xd_data )
(while
	(not (setq esel (entsel)))
)
(setq ename (car esel))
(redraw ename 3)
(setq elist (entget ename (list "ID_CLOTHOIDE-BONUSCAD$2002")))
(if (not (setq xd_list (assoc -3 elist)))
	(princ "\nAucune donnée d'objet étendue n'est associée a une clothoïde.")
	(setq xd_list (cdr xd_list) cnt10 0 cnt40 0)
)
(while xd_list
	(setq app_list (car xd_list))
	(textscr)
	(princ "\nApplication enregistrée   : \t")
	(princ (car app_list))
	(princ "\n\t\tATTENTION *** ATTENTION")
	(princ "\nToutes modifications de cette polyligne optimisée")
	(princ "\ninvalident une partie ou toutes ces informations.")
	(princ "\nIndices de construction d'ORIGINE de cette clothoïde.\n")
	(setq app_list (cdr app_list))
	(while app_list
		(setq app_sub_list (car app_list))
		(setq xd_code (car app_sub_list))
		(setq xd_data (cdr app_sub_list))
		(cond
			((= 1010 xd_code)
				(cond
					((= cnt10 2)
						(setq cnt10 (1+ cnt10))
						(princ "\nFin de la clothoïde       : \t")
					)
					((= cnt10 1)
						(setq cnt10 (1+ cnt10))
						(princ "\nCentre du cercle          : \t")
					)
					((= cnt10 0)
						(setq cnt10 (1+ cnt10))
						(princ "\nOrigine clothoïde         : \t")
					)
				)
				(princ
					(strcat 
						(rtos (car xd_data) 2 3)
						" , "
						(rtos (cadr xd_data) 2 3)
						" , "
						(rtos (caddr xd_data) 2 3)
					)
				)
			)
			((= 1040 xd_code)
				(cond
					((= cnt40 5)
						(setq cnt40 (1+ cnt40))
						(princ "\nRayon du cercle           : \t")
						(princ (rtos xd_data 2 3))
					)	
					((= cnt40 4)
						(setq cnt40 (1+ cnt40))
						(princ "\nLongueur de la clothoïde  : \t")
						(princ (rtos xd_data 2 3))
					)
					((= cnt40 3)
						(setq cnt40 (1+ cnt40))
						(princ "\nAngle Tau                 : \t")
						(princ (angtos xd_data (getvar "unitmode") 5))
					)
					((= cnt40 2)
						(setq cnt40 (1+ cnt40))
						(princ "\nDelta R                   : \t")
						(princ (rtos xd_data 2 3))
					)
					((= cnt40 1)
						(setq cnt40 (1+ cnt40))
						(princ "\nParamètre de la clothoïde : \t")
						(princ (rtos xd_data 2 3))
					)
					((= cnt40 0)
						(setq cnt40 (1+ cnt40))
						(princ "\nOrientation de l'infini   : \t")
						(princ (angtos xd_data (getvar "unitmode") 5))
					)
				)
			)
			(T)
		)
		(setq app_list (cdr app_list))
	)
(setq xd_list (cdr xd_list))
)
(redraw ename 4)
(prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Encore un super LISP de Bonuscad :D

 

Juste un petit truc, j'aurais écrit différemment la routine matrix, depuis que je me suis intéressé aux matrices.

 

;;; VXV Retourne le produit scalaire de deux vecteurs
(defun vxv (v1 v2)
 (apply '+ (mapcar '* v1 v2))
)

;;; Applique une matrice à un vecteur
(defun mxv (m v)
 (mapcar '(lambda (r) (vxv r v)) m)
)

(defun matrix	(pt)
 (mapcar '+
  (mxv (list (trans '(1 0 0) 0 1 T)
	     (trans '(0 1 0) 0 1 T)
	     (trans '(0 0 1) 0 1 T)
       )
       pt
  )
  (trans '(0 0 0) 1 0)
 )
) 

 

Mais il me semble bien que cette fonction, quelque soit la manière dont on l'écrit n'est qu'une autre façon, plus compliquée, pour faire : (trans pt 1 0)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

( defun c:clot ()

; Caractéristiques de la clothoide

(setq R (getdist "\n Rayon final de la clothoide  : "))
(setq L (getdist "\n Longueur de la clothoide  : "))
(setq P (getdist "\n Pas de la clothoide  : "))
(setq Ls 0)
(setq S '(0 0))
(setq A (sqrt (* R L)))

(command "_pline")
(command "_non" S)

; Boucle  
(setq sortie nil)
(while (not sortie)
(setq Ls (+ Ls P))
(if (> Ls L) 
         (progn
           (setq Ls L)
           (setq SORTIE T)
         )
       )
(setq Rs (/ (* A A) Ls))
(setq Ns (/ Ls Rs))
(setq Xs (* Ls (- 1 (* Ns (/ Ns 40)))))
(setq Ys (* Ls (- (/ Ns 6) (* Ns Ns (/ Ns 336)))))
(setq S (List Xs Ys))
       (command "_non" S)
)   
(command "")
(princ)
) 

 

C'est ce dont je me sers pour tracer des clothoïdes. Je ne sais pas qui en est l'auteur.

 

J'en profite pour lancer un appel à tout ceux qui font du tracé routier. Merci de tenir compte, dans vos tracés, de la présence éventuelle d'ouvrages d'art et d'éviter de mettre des clothoïdes et des variations de dévers juste à cet endroit. Je parle de petits ouvrages d'art, pas des viaducs bien entendu. Parce que c'est trop bête d'avoir un petit PS de 40 ou 50m de portée et de se colletiner une cloth + variation de dévers. Un ouvrage sur un alignement droit avec des dévers constants, c'est quand même plus simple pour tout le monde quand on fait du béton-armé (du dessinateur au maçon-coffreur)

 

Merci pour eux...

 

Amicalement

 

Zebulon_

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é