Aller au contenu

Messages recommandés

Posté(e)

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)

)

Posté(e)

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 international

Voir ici et 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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é