Aller au contenu

Tracé d'une courbe avec VLisp


SLV

Messages recommandés

Bonjour les gars,

 

un salut tout particulier à VDH. j'ai pu utiliser le code que tu as poster pour réaliser le tracer d'une fonction.

 

J'en avait particulièrement besoin pour le tracé de l'équation de la chainette y=(1/2a)x²+a, a étant le paramètre de la chainette en mètre. Les valeur de ce paramètre sont généralement supérieures à 500 m et n'excèdent pas 3000 m.

Malheureusement je ne suis pas confortable avec le tracé produit. Elle devrait produire une parabole, la même que fait un conducteur électrique suspendu entre deux poteaux.

 

Je voudrais savoir si mon code a un problème, si oui le quel.

 

Merci d'avance.

 

(defun c:chainette (/ pr x1 x2 p)
  (setq pr (getreal "Spécifiez le paramètre de la chainette en m: ")
 	x1 (getreal "Spécifiez la borne inférieure de l'intervalle x1: ")
       x2 (getreal "Spécifiez la borne supérieure de l'intervalle x2: ")
       p (getreal "Spécifiez le pas p: ")
 )
 (setq a '(/ 1 (* 2 pr)))
 (setq b '(pr))

 (command "_pline")
 (foreach pt (bv:coord x1
                       x2 
                       '(lambda (x) (+ x p))
                       '(lambda (x) (+ (* a x x) B))
             )

   (command "_none" pt)
 )
 (command "")
 (princ)
)

 

bv:coord étant définie comme suit:

(defun bv:coord (a b e f)
 (if (>= a B)
   (cons (list b ((eval f) B)) nil)
   (cons (list a ((eval f) a)) (bv:coord ((eval e) a) b e f))))
Modifié par didier
mise en page du code
Lien vers le commentaire
Partager sur d’autres sites

L’émoticône avec le sourire représente b majuscule, je ne sait pas pourquoi il insiste pour s'afficher comme ça.

tape "B )" avec un espace entre B et ) et la "traduction" des émoticônes ne se fera pas.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je me disait bien : "Ça fout quoi dans le code tout ses sourires ?"

 

C'est comme pour AutoCADémique que l'ont est obligés d'écrire aca.démique. laugh.gif

 

Bon début de journée laugh.gif

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Coucou

Il faut utiliser les balises pour mettre en page le code, c'est corrigé mais c'est mieux que ce soit fait par l'auteur

Pour le "bug" cité par Aleck Ultimate, ça date du temps où le site était géré par Patrick et ce grand adepte des techniques informatiques avait trouvé le moyen de taper AutoCAD à la place de a c a d***, et comme toujours le mieux est l'ennemi du bien maintenant on traîne ce fil à la patte...

 

Le sujet proposé est intéressant mais j'aimerais savoir ce que tu réponds comme paramètre dans le cas présent

 

Amicalement

 

***dans le cas présent il a fallu que je mette des espaces pour pallier la correction automatique, on a demandé à maintes reprises à CadMin de la supprimer mais, mais ...

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Elle devrait produire une parabole

 

Si on est rigoureux, et nous le sommes, du moins je le suis, la courbe de la chaînette n'est pas à proprement parler une parabole

Lien vers la courbe velaire : WIKI

 

Le sujet reste tout autant passionnant

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Malheureusement je ne suis pas confortable avec le tracé produit. Elle devrait produire une parabole

 

Bonjour,

 

 

Arf oui très drôle ça ;)

Ci-dessous une version modifié qui devrait corrigé ce petit désagrément...

 

(defun c:courbe	(/ coefa coefb x1 x2 p)

 (setq	coefa (getreal "\nSpécifiez le coefficient a: ")
coefb (getreal "\nSpécifiez le coefficient b: ")
x1    (getreal	"\nSpécifiez la borne inférieure de l'intervalle x1: ")
x2    (getreal "\nSpécifiez la borne supérieure de l'intervalle x2: " )
p     (getreal "\nSpécifiez le pas p: ")
 )

 (command "_pline")

 (foreach pt (setq lpt	(bv:coord x1
			  x2
			  '(lambda (x) (+ x p))
			  '(lambda (x) (+ (* coefa x x) coefb))
		)
      )

   (command "_none" pt)
 )
 (command "")
 (princ)
)

 

Pour la petite histoire le bug vient d'un problème de portée des variables a b, du fait que je quote mes fonctions anonymes, pas la temps de réécrire de code donc j'ai modifié le nom des variables

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

 

Arf oui très drôle ça ;)

Ci-dessous une version modifié qui devrait corrigé ce petit désagrément...

 

(defun c:courbe	(/ coefa coefb x1 x2 p)

 (setq	coefa (getreal "\nSpécifiez le coefficient a: ")
coefb (getreal "\nSpécifiez le coefficient b: ")
x1    (getreal	"\nSpécifiez la borne inférieure de l'intervalle x1: ")
x2    (getreal "\nSpécifiez la borne supérieure de l'intervalle x2: " )
p     (getreal "\nSpécifiez le pas p: ")
 )

 (command "_pline")

 (foreach pt (setq lpt	(bv:coord x1
			  x2
			  '(lambda (x) (+ x p))
			  '(lambda (x) (+ (* coefa x x) coefb))
		)
      )

   (command "_none" pt)
 )
 (command "")
 (princ)
)

 

Pour la petite histoire le bug vient d'un problème de portée des variables a b, du fait que je quote mes fonctions anonymes, pas la temps de réécrire de code donc j'ai modifié le nom des variables

 

A+

 

Ok je vérifie ca tout à l'heure

Lien vers le commentaire
Partager sur d’autres sites

A tout fin utile sur les paraboles, un truc que j'ai pompé sur un forum US je crois, donc merci à l'auteur.

 

Si ça peut correspondre à ta demande?

(defun C:PARABOLE ( / bod1 bod2 e l f x y i nd xp yp bod bodm)
 (initget (+ 1 16))
 (setq bod1 (getpoint "\nPoint de départ: "))
 (initget (+ 1 16))
 (setq bod2 (getpoint bod1 "\nPoint final: "))
 (setq xp (car bod1))
 (setq yp (car (cdr bod1)))
 (setq l (- (car bod2) xp))
 (princ "\nLargeur ordinale de la parabole: ")
 (princ l)
 (princ "\n")
 (setq e (- (car (cdr bod2)) yp))
 (princ "\nHauteur ordinale de la parabole: ")
 (princ e)
 (princ "\n")
 (if (= l 0)
   (princ "\nErreur: ordonnées X équivalentes ")
   (progn
     (initget (+ 1))
     (setq f (getdist "\nLongueur ordinale de la flèche: "))
     (initget (+ 1 2 4))
     (setq nd (getint "Nombre de segments: "))
     (setq i 1)
     (repeat (1+ nd)
       (setq x (* (1- i) (/ l 1.0 nd)))
       (setq y (- (/ (* 4 f x x) 1.0 (* l l)) (* (- (/ (* 4 f) 1.0 l) (/ e 1.0 l)) x)))
       (setq bod (list (+ xp x) (+ yp y)))
       (if (= i 1)
         (progn (command "_.PLINE" "_none" bod))
         (progn (command "_none" bod))
       )
       (setq bodm bod)
       (setq i (1+ i))
     )
     (command "")
   )
 )
 (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

bonjour , vieux souvenirs...

la formule f=a²/(8xp) permet de dessiner la parabole ( au voisinage de zéro qui tend vers chainette )qui passe par les 2 poteaux et la fleche

f flèche

a: distance horizontale entre les poteaux

p: le parametre , qui est en fait la distance au foyer de la parabole

 

en faisant un développement limité de cosh x au voisinage de zéro, tu obtiens cette formule , ne pas oublier que le cosh se défini aussi par les exponentielles !

plus simple à définir en lisp surement ....

write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

juste pour faire avancer le schmi... pas autocad avec moi,en déplacement et de plus, je ne l'utilise très peu

en faisant une recherche avec catenary curve lisp, on trouve des résulats et des lisp.

une courbe catenaire est l'autre nom de la chainette.

bonne journée

write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Salut,

 

Comme dit plus haut, une chainette (catenary) n'est pas une parabole (même si les deux courbes sont proches au voisinage du sommet de la parabole c'est à dire pour une grande tension dans la chainette).

Équation de la parabole : y = ax² + bx + c

Équation de la chainette : y = a cosh(x/a) ou a est le rapport entre la composante horizontale de la tension et la masse linéique.

 

J'avais des trucs en .NET dans mes cartons (c'est plus difficile de faire l'equivalent en LISP), je l'ai mis au propre pour le proposer ici.

 

Télécharger et installer CustomCurvesSetup.msi (compatible AutoCAD 2013-2019).

 

La commande PARABOLE (_PARABOLA) dessine une spline de degrés 2 par points de contrôle qui représente "exactement" un arc parabolique et un point figurant son foyer.

La commande CHAINETTE (_CATENARY) dessine une spline qui est une approximation d'une chaînette par points de lissage (le nombre de points est paramétrable de 7 à 255). L'utilisateur spécifie la "tension horizontale" (pour une masse linéique = 1) à la souris ou au clavier. Le nombre de points de lissage et la tension sont enregistrées dans le dessin.

 

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

Lien vers le commentaire
Partager sur d’autres sites

Un truc en LISP, mais sans les effets visuels (commande : CATENAIRE).

 

(defun c:catenaire (/ catenary startPt endpt numPts tension)

 (defun catenary (startPt endPt numPts tension / cosh sinh asinh compute lg ht sp a b c pts x i)

   (defun cosh (x)
     (/ (+ (exp x) (exp (- x))) 2.)
   )

   (defun sinh (x)
     (/ (- (exp x) (exp (- x))) 2.)
   )

   (defun asinh (x)
     (log (+ x (sqrt (+ (* x x) 1.))))
   )

   (defun compute (x)
     (list x (+ (* tension (1- (cosh (/ (- x d1) tension)))) d2) 0.)
   )

   (setq lg  (- (car endPt) (car startPt))
         ht  (- (cadr startPt) (cadr endPt))
         sp  (/ lg (1- numPts))
         a   (/ ht (* 2. tension (sinh (/ lg (* 2 tension)))))
         b   (+ (/ lg 2.) (* tension (asinh a)))
         c   (* tension (1- (cosh (/ b tension))))
         x   (car startPt)
         d1  (+ (car startPt) B)
         d2  (- (cadr startPt) c)
         pts (list startPt)
   )
   (repeat (setq i (- numPts 2))
     (setq pts (cons (compute (setq x (+ x sp))) pts))
   )
   (reverse (cons endPt pts))
 )

 (setq numPts (vlax-ldata-get "GILE_CURVE" "NumFitPoints" 13))
 (if
   (and
     (setq startPt (getpoint "\nPoint de départ: "))
     (setq endPt (getpoint startPt "\nPoint de fin: "))
   )
    (if (setq tension (getdist startPt "\nTension horizontale: "))
      (if (< (* 0.02 (abs (- (car startPt) (car endPt)))) tension)
        (progn
          (setq numPts (cond
                         ((getint (strcat "\nNombre de points de lissage <" (itoa numPts) ">: ")))
                         (T numPts)
                       )
          )
          (if (< 6 numPts 256)
            (progn
              (command "_.spline")
              (foreach p (catenary startPt endPt numPts tension)
                (command "_non" p)
              )
              (command "" "" "")
              (vlax-ldata-put "GILE_CURVE" "NumFitPoints" numPts)
            )
            (prompt "\nLe nombre de point doit être compris entre 7 et 255 inclus.")
          )
        )
        (prompt "\nTension insuffisante.")
      )
    )
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Un autre LISP qui devrait être plus proche de la demande initiale : il dessine un arc parabolique d'équation réduite y=(1/2a)x² entre deux points.

 

;; Dessine un arc parabolique entre deux points
;; Équation réduite : y=(1/2a)x² (où a est le paramètre spécifié)
(defun c:parachainette (/ p1 p2 pa)
 (setq pa (vlax-ldata-get "GILE_CURVE" "ParamParabole" 1000.))
 (if
   (and
     (setq p1 (getpoint "\nPoint de départ: "))
     (setq p2 (getpoint p1 "\nPoint de fin: "))
   )
    (progn
      (setq pa (cond
                ((getdist p1 (strcat "\nParamètre <" (rtos pa) ">: ")))
                (T pa)
              )
      )
      (vlax-ldata-put "GILE_CURVE" "ParamParabole" pa)
      (make_parabola p1 p2 (/ 1. (* 2 pa)))
    )
 )
 (princ)
)

;; make_parabola
;; Dessine une spline en arc parabolique entre deux points.
;; Retourne le nom d'entité de la spline.
;;
;; Arguments
;; p1 : point de départ (SCU courant)
;; p2 : point de fin (SCU courant)
;; pa :  paramètre a de la parabole dans l'équation réduite : y = ax²
(defun make_parabola (p1 p2 pa / x1 y1 x2 y2 dx p3)
 (setq x1 (car p1)
       y1 (cadr p1)
       x2 (car p2)
       y2 (cadr p2)
       dx (/ (+ y1 (- y2) (* pa (- (* x2 x2) (* x1 x1))))
             (* 2. pa (- x1 x2))
          )
       p3 (inters p1
                  (mapcar '+ p1 (list 1. (* 2. pa (+ x1 dx))))
                  p2
                  (mapcar '+ p2 (list 1. (* 2. pa (+ x2 dx))))
                  nil
          )
 )
 (entmakex
   (list
     (cons 0 "SPLINE")
     (cons 100 "AcDbEntity")
     (cons 100 "AcDbSpline")
     (cons 71 2)
     (cons 72 6)
     (cons 73 3)
     (cons 74 0)
     (cons 40 0.0)
     (cons 40 0.0)
     (cons 40 0.0)
     (cons 40 1.0)
     (cons 40 1.0)
     (cons 40 1.0)
     (cons 10 (trans p1 1 0))
     (cons 10 (trans p3 1 0))
     (cons 10 (trans p2 1 0))
   )
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois après...

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é