kclement Posté(e) le 5 octobre 2010 Posté(e) le 5 octobre 2010 Bonjour, Un collègue a trouvé ce LISP pour dessiner une super ellipse : ;;SUPERELLIPSE ;;By carlB AutoLisp forum for herrgrek ;; ;x=a*|cos t|^(2/n) ;;y=b*|sin t|^(2/n) ;;where: (pi/2)≥ t ≤ pi ;; ;;a=90 ;;b=45 ;;n=2.5 (princ "Type SUPER to start") (defun c:super (/ a b n ang_i ang_min ang_max ptlist plotpts pt_i pt) ;;defaults (setq ptlist nil Plotpts nil) (setq a 90 b 45 n 2.5 ang_min (/ pi 2) ang_max pi ) (setq ang_step (/ pi 360));;angular step for calculations (setq ang_i ang_min) (while (<= ang_i ang_max) (setq x (* a (expt (abs (cos ang_i)) (/ 2 n)))) (setq y (* b (expt (abs (sin ang_i)) (/ 2 n)))) (setq pt_i (list x y)) (setq PtList (cons pt_i ptlist)) (setq ang_i (+ ang_i ang_step)) ) (setq ptlist (reverse ptlist)) (setq Plot_base (getpoint "\nPick origin for plot: ")) (setq PlotPts (mapcar '(lambda (xy) (mapcar '+ Plot_Base xy)) PtList)) (command "_pline") (foreach Pt PlotPts (command pt) ) (command "") (princ) ) Ca fonctionne bien mais le problème c'est qu'on est obligé de rentrer dans le lisp pour changer les valeurs, a, b et n. Y aurait-il un moyen pour que le lisp demande d'entrer ces valeurs directement dans la ligne de commande ? Merci d'avance...
(gile) Posté(e) le 5 octobre 2010 Posté(e) le 5 octobre 2010 Salut, Au delà du fait que le LISP ne permet pas, en l'état, de spécifier de valeurs, la polyligne créée (qui n'est constituée que de segments droits) est assez loin de figurer un arc elliptique. Avant de chercher à modifier ce LISP, je te propose d'essayer la commande PELL (voir ce sujet) qui offre les mêmes option que la commande ELLIPSE (dont Arc) mais crée une polyligne constituée d'arcs beaucoup plus proche de la vraie ellipse. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Carboleum Posté(e) le 5 octobre 2010 Posté(e) le 5 octobre 2010 Sinon, pount infotu peux utiliser getreal (setq a (getreal "Quelle est la valeur de a ?")) Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
kclement Posté(e) le 5 octobre 2010 Auteur Posté(e) le 5 octobre 2010 Merci de vos réponses. la polyligne créée (qui n'est constituée que de segments droits) est assez loin de figurer un arc elliptique En fait, mon collègue m'a expliqué que c'est une autre géométrie qu'une ellipse, c'est une sorte d'ellipse écrasée qui tend vers le rectangle (qui s'appelleait superellipse)... Et apparemment le résultat obtenu lui convient tout à fait. tu peux utiliser getreal(setq a (getreal "Quelle est la valeur de a ?")) D'accord, mais je mets ça à quel endroit dans le code ? J'utilise pas mal de lisps péchés sur ce forum, mais j'ai encore du mal à identifier tout ce que contient un lisp...!
(gile) Posté(e) le 5 octobre 2010 Posté(e) le 5 octobre 2010 Re, ;;SUPERELLIPSE ;;By carlB AutoLisp forum for herrgrek ;; ;;x=a*|cos t|^(2/n) ;;y=b*|sin t|^(2/n) ;;where: (pi/2)? t ? pi ;; ;;a=90 ;;b=45 ;;n=2.5 (princ "Type SUPER to start") (defun c:super (/ a b n ang_i ang_min ang_max ptlist plotpts pt_i pt) (initget 6) (or (setq n (getreal "\nSpécifiez la valeur de n : ")) (setq n 2.5) ) (if (and (setq Plot_base (getpoint "\nSpécifiez le centre: ")) (setq a (getdist plot_base "\nSpécifiez la longueur du demi grand axe: " ) ) (setq b (getdist plot_base "\nSpécifiez la longueur du demi petit axe: " ) ) ) (progn (setq ang_min (/ pi 2) ang_max pi ang_step (/ pi 360) ;;angular step for calculations ang_i ang_min ) (while ( (setq x (* a (expt (abs (cos ang_i)) (/ 2 n)))) (setq y (* b (expt (abs (sin ang_i)) (/ 2 n)))) (setq pt_i (list x y)) (setq PtList (cons pt_i ptlist)) (setq ang_i (+ ang_i ang_step)) ) (setq ptlist (reverse ptlist)) (setq PlotPts (mapcar '(lambda (xy) (mapcar '+ Plot_Base xy)) PtList) ) (command "_pline") (foreach Pt PlotPts (command "_non" pt) ) (command "") ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
kclement Posté(e) le 6 octobre 2010 Auteur Posté(e) le 6 octobre 2010 Super, merci (gile), je teste ça (enfin, mon collègue...)
RhymOne Posté(e) le 6 octobre 2010 Posté(e) le 6 octobre 2010 Bonjour,par grand hasard kclement tu ne bosse pas dans l'hydraulique.Ton équation s'approche d'une formule que j'utilise pour les seuil. DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
kclement Posté(e) le 6 octobre 2010 Auteur Posté(e) le 6 octobre 2010 Bonjour rhymone, Pour répondre à ta question, non, je suis architecte (je sais que cetains membre de ce forum pensent que les archis travaillent n'importe comment, mais je vous jure qu'on ne travaille pas tous QUE dans le calque 0 !) Pour (gile), merci ça a bien fonctionné, sauf qu'il manquait la possibilité d'entrer la valeur n, j'ai donc ajouté la ligne : (setq n (getreal "\nSpécifiez la valeur de n: ")) (merci Carboleum) et c'est parfait ! A bientôt !
(gile) Posté(e) le 6 octobre 2010 Posté(e) le 6 octobre 2010 Salut, Je suis content que ça te convienne et que tu aies réussi à modifier le code comme tu voulais.J'ai modifié le code en conséquence en ajoutant un petit plus :- l'utilisateur ne peut entrer qu'une valeur strictement positive (0 génère une erreur division par 0 et une valeur négative une courbe infinie) ;- une valeur par défaut (2.5).(initget 6) (or (setq n (getreal "\nSpécifiez la valeur de n : ")) (setq n 2.5) ) Pour ma culture personnelle, j'ai fait quelque recherches. Cette équation définit ce qu'on appelle les courbes de Lamé qui varient suivant la valeur de n. SuperEllipse est le nom donné par les anglo-saxons à ces courbes (ou plus particulièrement, suivant les auteurs, à celle générée avec une valeur de n de 2.5). En ne dessinant qu'un quart de la courbe (comme le fait le LISP) avec a = bn = 1 -> segment de droiten = 2 -> quart de cercle (ou d'ellipse si a /= b)0 arcs de parabolen hyperboles Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant