Aller au contenu

Lisp Clotoïde


philous2

Messages recommandés

Bjr,

 

Je suis à la recherche dune routine pour calculer une clotoïde en pouvant indiquer la longueur, le rayon ou le déport il me faut 2 de ces 3 éléments pour calculer plus précisement à la façon de Piste mais sur Autocad.

Je suis tombé sur un lisp clotoïde(ci-après) mais qui calcule seulement par le pas.

Comment transformer ce lisp pour calculer soit par pas, par déport ou longueur si c'est possible.

 

Lisp Clotoïde:

 

[surligneur] (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)

)[/surligneur]

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é