MiniMinus Posté(e) le 17 juin 2006 Posté(e) le 17 juin 2006 Bonjour à tous ! J'ai concocté le petit programme ci-après pour symboliser un boulon (ce n'est vraiment pas extraordinaire) et il fonctionne correctement jusqu'à ... ce que j'efface les objets qui sont à l'écran. Après il ne me noirci plus le cercle et attend une sélection d'objets !!! Pour qu'il refonctionne correctement, je dois recharger le programme dans AutoCad. Quelqu'un peut-il m'expliquer où j'ai fait l'andouille ? MiniMinus ( defun C:BlsFace ( Dia / ) (setq ObjCer "") (setq ObjCer (ssadd)) (setq Axe (+ Dia 20)) (setq DemAxe (/ Axe 2)) (setq Cent (getpoint "Entrer le centre du boulon : ")) (setq XCent (car Cent)) (setq YCent (cadr Cent)) (setq PoinHa (list XCent (+ YCent DemAxe))) (setq PoinBa (list XCent (- YCent DemAxe))) (setq PoinGa (list (- XCent DemAxe) YCent)) (setq PoinDo (list (+ XCent DemAxe) YCent)) (command "ligne" PoinHa PoinBa "") (command "ligne" PoinGa PoinDo "") (command "cercle" Cent (/ Dia 2) "") (setq ObjCer (entlast)) (command "_.hatch" "s" ObjCer "") (princ ObjCer) (princ) )
(gile) Posté(e) le 17 juin 2006 Posté(e) le 17 juin 2006 Bonsoir, Première remarque, le (defun C:BlsFace (Dia / ) ...) Ce n'est pas une erreur mais on utilise normalement (defun c:routine ...) pourdéfinir un nom de commande qu'on pourra appeler ensuite directement en tapant routine comme on le fait avec les commandes prédéfinies d'AutoCAD. Or ta fonction nécessite un argument, on ne peut donc la lancer qu'en tapant (C:BlsFace 8) par exemple. Dans ce cas on fait plutôt :(defun C:BlsFace (Dia / ) ...) ou alors on acquiert la valeur de Dia de l'utilisateur par un :(setq Dia (getdist "\spécifiez le diamètre: ")) une fois le LISP lancé. Voir ce fil Deuxième remarque, les variables locales Il est préférable de déclarer les variables pour éviter toute interaction avec d'autres LISP dans lesquels les mêmes variables ne seraient pas déclarées non plus. Voir ce message et les deux liens qui y sont donnés. À propos des (setq ..) justement, c'est surtout un affaire de style, mais tu peux définir (ou redéfinir) plusieurs variables dans le même (setq ...) : (setq ObjCer "" ObjCer (ssadd) Axe (+ Dia 20) DemAxe (/ Axe 2) Cent (getpoint "Entrer le centre du boulon : ") XCent (car Cent) YCent (cadr Cent) PoinHa (list XCent (+ YCent DemAxe)) PoinBa (list XCent (- YCent DemAxe)) PoinGa (list (- XCent DemAxe) YCent) PoinDo (list (+ XCent DemAxe) YCent)) Troisième remarque : ObjCer Tu définis inutilement cette variable 2 fois (setq ObjCer "") et (setq ObjCer (ssadd)), la première fois un "blank" (une chaine vide) puis un jeu de sélection vide pour finalement, plus loin lui attribuer un nom d'entité, et à la fin un (princ ObjCer) curieux :casstet: Quatrième remarque : les noms de commande Il est préférable de mettre les noms de commandes et d'options de commande en langage internationalVoir ici et là entre autre. Pour ce qu'il en est de l'erreur elle vient de la commande _hatch il faut écrire :(command "_.-hatch" "_s" ObjCer "" "" "") Le corrigé : (defun C:BlsFace (/ Dia Axe DemAxe Cent XCent YCent PoinHa PoinBa PoinGa PoinDo ObjCer ) (setq Dia (getdist "\spécifiez le diamètre: ") Axe (+ Dia 20) DemAxe (/ Axe 2) Cent (getpoint "Entrer le centre du boulon : ") XCent (car Cent) YCent (cadr Cent) PoinHa (list XCent (+ YCent DemAxe)) PoinBa (list XCent (- YCent DemAxe)) PoinGa (list (- XCent DemAxe) YCent) PoinDo (list (+ XCent DemAxe) YCent) ) (command "_line" PoinHa PoinBa "") (command "_line" PoinGa PoinDo "") (command "_circle" Cent (/ Dia 2) "") (setq ObjCer (entlast)) (command "_.-hatch" "_s" ObjCer "" "" "") (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 Encore une fois merci Gile, Pour le point 1 : j'ai créé la routine avec un argument car je compte l'appeler à partir d'autres fonctions. Toujours le dessin de mon attache! Point 2: OK pour les variables. J'avais très bien compris les variables locales mais pas du tout les variables globales. Je croyais qu'il fallait les déclarer comme dans d'autres langages. Pour le style : comme je débute, je préfère faire ainsi pour plus de lisibilité et de compréhension. Je ne suis pas du tout contre les commandes imbriquées mais pas au commencement de l'apprentissage. Je crois que c'est une des choses qui rebute le plus les novices (en tout cas moi oui). Point 3 : là, j'ai un peu m...é mais il faut dire que j'étais crevé. Je voulais simplement créer le jeu de sélection, le mettre "vide" puis l'utiliser (c'est là que l'on voit que je n'ai pas compris toutes les nuances du LISP!!!). Enfin la contrôler à l'écran. Point 4 : OK je ferais comme tu dis. Mais je voudrais savoir où tu trouves la syntaxe exacte des commandes. Pour ma part, je l'éxécute sous AutoCad en notant les manipulations que je dois faire puis j'essaye de retranscrire cela dans l'éditeur LISP. Enfin encore MERCI pour la correction. Tu es vraiment le bon samaritzin de ce site !!! Bye MiniMinus
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 Gile ! J'ai essayé mais cela ne fonctionne toujours pas après avoir effacé les précédents essais à l'écran !!! A voir quand elle sera appelée par une autre routine. Bonne journée. MiniMinus
(gile) Posté(e) le 18 juin 2006 Posté(e) le 18 juin 2006 Salut, Suite à tes réponses Point 1 : donc on écrit (defun BlsFace (Dia / ...) ...) sans le C: Point 2 : Tu as raison, vas à ton rythme. Point 3 : Évitons de lisper trop tard le soir, on fait des bétises (voir ci-dessous) Point 4 : C'est en reproduisant ce qu'on fait à la ligne de commande qu'on trouve les syntaxes pour les commandes (des fois la syntaxe est un peu différente mais le plus souvent çà marche). Ce à quoi il faut faire attention et qui provoque souvent des erreurs, c'est la présence et le nombres de ENTER (""). L'erreur dans ton code vient de là. Je l'avais mal située hier soir, ton (command "_.hatch" ...) était juste, c'est dans (command "_.circle" ...) qu'il y a un ENTER de trop (on n'en met pas pour valider une entrée (point, distance, ...) Deuxième correction, donc : (defun BlsFace (/ Dia Axe DemAxe Cent XCent YCent PoinHa PoinBa PoinGa PoinDo ObjCer ) (setq Axe (+ Dia 20)) (setq DemAxe (/ Axe 2)) (setq Cent (getpoint "Entrer le centre du boulon : ")) (setq XCent (car Cent)) (setq YCent (cadr Cent)) (setq PoinHa (list XCent (+ YCent DemAxe))) (setq PoinBa (list XCent (- YCent DemAxe))) (setq PoinGa (list (- XCent DemAxe) YCent)) (setq PoinDo (list (+ XCent DemAxe) YCent)) (command "_.line" PoinHa PoinBa "") (command "_.line" PoinGa PoinDo "") (command "_.circle" Cent (/ Dia 2)) (setq ObjCer (entlast)) (command "_.hatch" "_s" ObjCer "") (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 Merci Gile C'est impeccable MiniMinus
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