nicolas2 Posté(e) le 13 janvier 2009 Posté(e) le 13 janvier 2009 Bonjour à tous,j'ai un petit lisp pour faire des fonds GRC (chaudronnerie) et je voudrais le modifier pour faire des fonds elliptiques. Après recherche sur plusieurs forum, il ne semble pas facile, voir impossible de gérer l'ellipse en tant qu'ellipse en lisp (ips ips ips.....).Voici le programme "Fond GRC" me servant de base : ;FondB.lsp ;Version 1.0 ;Programme AutoLISP écrit par Maxence Delannoy et modifié par Yann Nicollet avec l'aide de Bonuscad et Bred ;Dernière modification le 12.01.09 ;Objet: Tracé de fonds GRC suivant NF E 81-102. (defun c:FB ( / DiamExt RayInt RayCar Ep HtBD HtTot PtIns X0 X1 Y0 Y1 Ang1) (setvar "OSMODE" 0) (setq DiamExt (getreal "\nDiamètre extérieur: ") RayCar (/ DiamExt 10.0) Ep (getreal "\nEpaisseur: ") HtBD (getreal "\nHauteur du bord droit: ") HtTot (+ HtBD Ep (- DiamExt (sqrt (- (expt (- DiamExt RayCar) 2.0) (expt (- (* DiamExt 0.5) Ep RayCar) 2.0))))) PtIns (getpoint "\nPoint d'insertion: ") X0 (- (car PtIns) (* DiamExt 0.5)) X1 (+ (car PtIns) (* DiamExt 0.5)) Y0 (- (+ (cadr PtIns) HtTot) DiamExt Ep) Y1 (+ (cadr PtIns) HtBD) ) (command "_.PLINE" (list X1 (nth 1 PtIns)) (list X1 Y1) "_A" "_CE" ; Arc défini par son centre (list (- X1 RayCar Ep) Y1) "_A" ; Angle... (setq Ang1 (/ (* 180 (angle (list (nth 0 PtIns) Y0) (list (- X1 RayCar Ep) Y1))) pi)) "_CE" (list (nth 0 PtIns) Y0) "_A" ; Angle... (- 180 (* 2 Ang1)) "_CE" (list (+ X0 RayCar Ep) Y1) "_A" ; Angle... Ang1 "_L" ; Ligne... (list X0 (nth 1 PtIns)) "_C" ; Ferme la polyligne ) ) (prompt "M.D.D. - FondB.lsp chargé.") (prompt "\nTapez FB pour dessiner un fond GRC suivant NF E 81-102.") (princ) Voila le résultat recherché (une ellipse avec un rapport d'axe de 3.8 => (1000-(2 x ép.))/3.8=257.89) http://img150.imageshack.us/my.php?image=fondellptiquep01sn6.jpg Merci pour votre aide.
bonuscad Posté(e) le 13 janvier 2009 Posté(e) le 13 janvier 2009 Bonjour, Un début, je te laisse finir... (defun c:FE ( / DiamExt Ep HtBD PtIns) (initget 7) (setq DiamExt (getdist "\nDiamètre extérieur: ")) (initget 7) (setq Ep (getdist "\nEpaisseur: ")) (initget 7) (setq HtBD (getdist "\nHauteur du bord droit: ")) (initget 9) (setq PtIns (getpoint "\nPoint d'insertion: ")) (entmake (list (cons 0 "ELLIPSE") (cons 100 "AcDbEntity") (if (/= id_vport 2) (cons 67 1) (cons 67 0) ) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbEllipse") (cons 10 (list (car Ptins) (+ (cadr PtIns) HtBD) (caddr PtIns))) (cons 11 (list (* DiamExt 0.5) 0.0 0.0)) (cons 210 '(0.0 0.0 1.0)) (cons 40 (/ (/ (- DiamExt (* 2.0 Ep)) 3.8) (* DiamExt 0.5))) (cons 41 0.0) (cons 42 pi) ) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
nicolas2 Posté(e) le 14 janvier 2009 Auteur Posté(e) le 14 janvier 2009 Bonjour et merci pour votre aide.Votre programme fonctionne, mais étant un débutant en LISP, la plupart des "codes" utilisés ne me disent rien. Pour l'instant, j'ai juste modifié la hauteur de l'ellipse (sur mon croquis la côte de 257mm et intérieur au fond). (cons 40 (/ (/ (- DiamExt (* 2.0 Ep)) 3.8) (* DiamExt 0.5)))devient(cons 40 (/ [surligneur] (+ [/surligneur](/ (- DiamExt (* 2.0 Ep)) 3.8) [surligneur] Ep)[/surligneur] (* DiamExt 0.5))) Dans cette ligne, par exemple, avec un Øext. de 1000, une épaisseur de 10 la fonction me donne ((257+10) / (1000*0.5)). Les 267 sont bien la ht. du petit axe de mon ellipse, ma question, pourquoi la diviser par 500 ? Ca fonctionne, mais pourquoi... :casstet: Du fait de mon ignorance, je ne sais pas à quel endroit insérer la suite du programme pour le finir en dessinant les bord droit et cloturer ma polyligne ?!! Merci pour votre aide. Si ton labeur est dur et tes résultats minces, rapelles-toi qu'un jour le grand chêne a été un gland comme moi.
bonuscad Posté(e) le 14 janvier 2009 Posté(e) le 14 janvier 2009 Alors sous une forme plus traditionnelle pour débuter ;) Tient compte de ta modification (defun c:FE ( / DiamExt Ep HtBD PtIns) (initget 7) (setq DiamExt (getdist "\nDiamètre extérieur: ")) (initget 7) (setq Ep (getdist "\nEpaisseur: ")) (initget 7) (setq HtBD (getdist "\nHauteur du bord droit: ")) (initget 9) (setq PtIns (getpoint "\nPoint d'insertion: ")) (setvar "cmdecho" 0) (command "_.ellipse" "_arc" "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) (+ (/ (- DiamExt (* 2.0 Ep)) 3.8) Ep) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) ) (command "_.pline" "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_width" 0.0 0.0 "_none" (list (- (car PtIns) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "" ) (setvar "cmdecho" 1) (prin1) ) Ca fonctionne, mais pourquoi... Le code DXF 40 est le "Rapport du petit axe au grand axe", voir l'aide sur les données DXF [Edité le 14/1/2009 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
nicolas2 Posté(e) le 15 janvier 2009 Auteur Posté(e) le 15 janvier 2009 Merci Bonuscad,c'est sympa d'aider ceux qui ont du mal ! Je m'étais renseigné pour des explications sur ton programme : (defun c:FE (/ DiamExt Ep HtBD PtIns) (initget 7) (setq DiamExt (getdist "\nDiamètre extérieur: ")) (initget 7) (setq Ep (getdist "\nEpaisseur: ")) (initget 7) (setq HtBD (getdist "\nHauteur du bord droit: ")) (initget 9) (setq PtIns (getpoint "\nPoint d'insertion: ")) [surligneur] ;; Ellipse[/surligneur] (entmake (list (cons 0 "ELLIPSE") (cons 100 "AcDbEntity") (cons 100 "AcDbEllipse") (cons 10 (list (car Ptins) (+ (cadr PtIns) HtBD) (caddr PtIns))) (cons 11 (list (* DiamExt 0.5) 0.0 0.0)) (cons 210 '(0.0 0.0 1.0)) (cons 40 (/ (+ (/ (- DiamExt (* 2.0 Ep)) 3.8) Ep) (* DiamExt 0.5))) [surligneur] ; Rapport du petit axe au grand axe[/surligneur] (cons 41 0.0) [surligneur] ; Angle de départ[/surligneur] (cons 42 pi) [surligneur] ; Angle final[/surligneur] ) ) [surligneur] ;; Bord à droite[/surligneur] (entmake (list (cons 0 "LINE") (cons 10 (list (/ DiamExt -2) 0.0 0.0)) [surligneur] ; Pt de départ[/surligneur] (cons 11 (list (/ DiamExt -2) HtBD 0.0)) [surligneur] ; Pt d'arrivée[/surligneur] ) ) [surligneur] ;; Bord à gauche[/surligneur] (entmake (list (cons 0 "LINE") (cons 10 (list (/ DiamExt 2) 0.0 0.0)) [surligneur] ; Pt de départ[/surligneur] (cons 11 (list (/ DiamExt 2) HtBD 0.0)) [surligneur] ; Pt d'arrivée[/surligneur] ) ) [surligneur] ;; Ligne du bas[/surligneur] (entmake (list (cons 0 "LINE") (cons 10 (list (/ DiamExt -2) 0.0 0.0)) [surligneur] ; Pt de départ[/surligneur] (cons 11 (list (/ DiamExt 2) 0.0 0.0)) [surligneur] ; Pt d'arrivée[/surligneur] ) ) (princ) ) Maintenant que j'ai 2 LISP qui tiennes la route, est il nécessaire de les regrouper ailleurs sur le site pour d'autres chaudronniers de base ? Merci encore pour ton aide
thry0 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Bjr, Pb chez moi, la partie cylindrique se dessine centrée au pt 0,0,0sans tenir compte du point d'insertion désiré et la partie elliptique n'est pas centréepar rapport à la partie cylindrique ... décalage en X et en Y.
nicolas2 Posté(e) le 15 janvier 2009 Auteur Posté(e) le 15 janvier 2009 Bonjour thry0 (de la jungle tarzan...??? ) voila le même en bleu... (defun c:FE ( / DiamExt Ep HtBD PtIns) (initget 7) (setq DiamExt (getdist "\nDiamètre extérieur: ")) (initget 7) (setq Ep (getdist "\nEpaisseur: ")) (initget 7) (setq HtBD (getdist "\nHauteur du bord droit: ")) (initget 9) (setq PtIns (getpoint "\nPoint d'insertion: ")) (setvar "cmdecho" 0) (command "_.ellipse" "_arc" "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) (+ (/ (- DiamExt (* 2.0 Ep)) 3.8) Ep) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) ) (command "_.pline" "_none" (list (- (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "_width" 0.0 0.0 "_none" (list (- (car PtIns) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) "_none" (list (+ (car PtIns) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) "" ) (setvar "cmdecho" 1) (prin1) ) A+
thry0 Posté(e) le 15 janvier 2009 Posté(e) le 15 janvier 2009 Re, Tout bon cette fois ...Pour chercher la petite bête fond GRC dessinait une polyligne fermée de la formealors que fond Elliptique dessine 2 polylignes distinctes ...Mais c'est vraiment histoire de dire ! Allez ma liane m'attend ... A+,
bonuscad Posté(e) le 16 janvier 2009 Posté(e) le 16 janvier 2009 Maintenant que j'ai 2 LISP qui tiennes la route Pour que celui avec (entmake) tienne la route, il faut le construire comme ci-dessous, le résultat sera identique avec celui utilisant (command)(Ma première proposition avec entmake n'était que pour le SCG, c'était un début, incomplet...)Cette version fonctionnera quelque soit le SCU en cours. (defun c:FE ( / DiamExt Ep HtBD PtIns dxf_210) (initget 7) (setq DiamExt (getdist "\nDiamètre extérieur: ")) (initget 7) (setq Ep (getdist "\nEpaisseur: ")) (initget 7) (setq HtBD (getdist "\nHauteur du bord droit: ")) (initget 9) (setq PtIns (getpoint "\nPoint d'insertion: ") dxf_210 (mapcar 'caddr (mapcar '(lambda (x) (trans x 0 1 T)) '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)))) ) (entmake (list (cons 0 "ELLIPSE") (cons 100 "AcDbEntity") (if (/= (getvar "CVPORT") 2) (cons 67 1) (cons 67 0) ) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbEllipse") (cons 10 (trans (list (car Ptins) (+ (cadr PtIns) HtBD) (caddr PtIns)) 1 0)) (cons 11 (trans (list (* DiamExt 0.5) 0.0 0.0) 1 0 T)) (cons 210 dxf_210) (cons 40 (/ (+ (/ (- DiamExt (* 2.0 Ep)) 3.8) Ep) (* DiamExt 0.5))) (cons 41 0.0) (cons 42 pi) ) ) (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (if (/= (getvar "CVPORT") 2) (cons 67 1) (cons 67 0) ) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 0) (cons 43 0.0) (cons 38 (caddr (trans PtIns 1 dxf_210))) (cons 39 0.0) (cons 10 (trans (list (- (car Ptins) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) 1 dxf_210)) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 10 (trans (list (- (car Ptins) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) 1 dxf_210)) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 10 (trans (list (+ (car Ptins) (* DiamExt 0.5)) (cadr PtIns) (caddr PtIns)) 1 dxf_210)) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 10 (trans (list (+ (car Ptins) (* DiamExt 0.5)) (+ (cadr PtIns) HtBD) (caddr PtIns)) 1 dxf_210)) (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 210 dxf_210) ) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
nicolas2 Posté(e) le 21 janvier 2009 Auteur Posté(e) le 21 janvier 2009 Un grand merci BonusCad.Quand j'srais grand, j'mfrais greffer un 2ième neurone, s'est promis...!
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