Aller au contenu

Messages recommandés

Posté(e)

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.

 

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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

Posté(e)

Bjr,

 

Pb chez moi, la partie cylindrique se dessine centrée au pt 0,0,0

sans tenir compte du point d'insertion désiré et la partie elliptique n'est pas centrée

par rapport à la partie cylindrique ... décalage en X et en Y.

Posté(e)

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+

Posté(e)

Re,

 

Tout bon cette fois ...

Pour chercher la petite bête fond GRC dessinait une polyligne fermée de la forme

alors que fond Elliptique dessine 2 polylignes distinctes ...

Mais c'est vraiment histoire de dire !

 

Allez ma liane m'attend ...

 

A+,

Posté(e)

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

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é