Aller au contenu

Messages recommandés

Posté(e)

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]

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é