Aller au contenu

Premier LISP à critiquer


Bortch59

Messages recommandés

Bonjour,

 

Je vous soumet mon premier code afin de subir le feu des critiques (méthode, clarté du code...)

Je voudrais remercier (gile) et bonuscad pour leur aide dans ce sujet :http:// http://www.cadxp.com/sujetXForum-30982.htm.

Merci pour vos commentaires.

 

 

(defun c:PAS (/ L Ep N Ec P0 P1 P10 P11 B Ba)
 (setq L (getreal "\nLongueur baffle: "))
 (setq Ep (getreal "\nEpaisseur baffle: "))
 (setq N (getint "\nNombre de baffles: "))
 (setq Ec (getreal "\nEcartement des baffles: "))
 (setq P0 (getpoint "\nPt d'insertion PAS: "))
 
 ;Dessin Baffle
 (setq P10 (list (+ (car P0) (/ Ec 2)) (+ (cadr P0) (/ Ec 2)))) 
 (setq P11 (list (+ (car P10) L) (+ (cadr P10) Ep)))
	  
 (command "rectangle" P10 P11)
 
 ;Changement propriétés bafles
 (setq B (entget (entlast)))
 (if (assoc 62 B)
   (entmod (subst '(62 . 8) (assoc 62 B) B))
   (entmod (append B '((62 . 8))))
   )
 (if (assoc 6 B)
   (entmod (subst '(6 . "cache") (assoc 6 B) B))
   (entmod (append B '((6 . "cache"))))
   )
 (setq Ba (entlast))
 (command "reseau" Ba "" "r" N "1" (+ Ep Ec))

 ;Dessin PAS

 (setq P1 (list (+ (car P0) L Ec) (+ (cadr P0) (* N (+ Ep Ec)))))

 (command "rectangle" P0 P1)
 
) 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ça semble très bien (pas testé)

 

Quelques petites remarques :

 

- Il est préférable d'utiliser les noms de commandes en version "internationale" ("_rectangle", "_array"), elles sont moins susceptible de changer et ton LISP fonctionnera sur toutes les versions.

- quand on utilise (command ...) il vaut mieux désactiver les accrochages aux objets, soit ponctuellement avec "_non" (ou "auc" mais voir la remarque ci-dessus) ou encore en stocker la valeur de cmdecho et la passer à 0 et en début de code, puis la restaurer en fin de code.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

cmdecho permet de ne pas avoir les commandes passer dans le lisp écrient sur la ligne de commande (cela fait plus propre).

 

Par contre, et là ça commence à être un peu plus délicat, c'est que si tu changes la valeur de cette variable, mais qu'il y a une erreur ou une interruption utilisateur pendant le déroulement du lisp (esc), la valeur n'est pas re-initialisé, et tu te retrouve donc avec "plus rien" sur ta ligne de commande.... (et c'est le cas dans tous lisp où tu modifieras des variables).

 

pour éviter ce problème, il faut créer une gestion d'erreur (et c'est d'ailleurs (gile) qui m'a appris comment faire... comme un peu tout -en lisp-)

 

Mais cela est peut-être encore un peu compliqué pour tes premiers lisp, saches tout de même que cela existe.

 

Le seul conseil que je rajouterai (mais pour un code aussi succin ce n'est pas obligatoire... mais cela permet de s'habituer à la lecture/écriture) c'est que tu peux éviter d'écrire tous les (setq.... à la suite :

comme cela :

 (setq L (getreal "\nLongueur baffle: ")
     Ep (getreal "\nEpaisseur baffle: ")
     N (getint "\nNombre de baffles: ")
     Ec (getreal "\nEcartement des baffles: ")
     P0 (getpoint "\nPt d'insertion PAS: "))

 

... et aussi essaye de ne pas écrire des lignes inutiles en remplissant des variables inutilement :

remplace

  (setq P1 (list (+ (car P0) L Ec) (+ (cadr P0) (* N (+ Ep Ec)))))
 (command "rectangle" P0 P1)

 

par

  (command "rectangle" P0  (list (+ (car P0) L Ec) (+ (cadr P0) (* N (+ Ep Ec)))))

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

coucou

 

je rejoins le club des critiques,

amis je te rassure, toujours positives les critiques

 

c'est bien, je peux te garantir que le premier que j'ai fait

n'était pas de cette eau.

 

il est vrai pour ma défense qu'on travaillait sous DOS

et que l'Edit du Dos est à l'IDE de VLISP

ce que le silex est au briquet..

 

je confirme les propos de (gile)

les commandes internationales c'est mieux

de fois c'est un peu chiant dans les options mais c'est mieux

 

pour mémoire avec

  (getcname "nomfrançais")

tu auras le nom d'origine

 

amicalement

 

[Edité le 25/1/2011 par didier]

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour compléter les critiques ;)

 

Lorsque tu utilises des fonctions d'entrée commençant par (getxxx) comme (getreal) etc... il bien d'armer les bits avec (initget) constitué des valeurs possibles correspondantes (voir le tableau dans l'aide du développeur).

Ceci pour effectuer un contrôle des entrées utilisateur.

 

Pour t'en persuader, essayes ton programme en validant (sans aucune valeur) au message

"Longueur baffle: "

ou encore une valeur de zéro, négative !

Hé bien ton programme risque de ne pas aller au bout suite à une erreur (variable à nil)

 

Il faut toujours se mettre à la place de l'utilisateur (celui trop pressé qui fait clic-clic, celui qui ne lit pas les messages d'invite, celui qui ne comprends pas ce qu'on lui demande etc...)

 

Pense aussi que ton programme peut être aussi utilisé dans un système de coordonnées autre que le SCG, il te faut donc penser à convertir tes coordonnées calculées dans le bon système. Voir la fonction (trans)

 

Avec toutes ses remarques tu auras un code résistant et fiable :cool:

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

coucou

 

je reviens pour enfoncer le clou :cool:

 

donc, ce que tu vas découvrir, maintenant ;)

c'est qu'il y a deux sortes de" programmes"

ceux que tu fais tourner sur ton poste :D

et ceux que tu passes aux copains :mad:

 

les premiers fonctionnent TOUJOURS :cool:

les deuxièmes présentent des dysfonctionnements :mad:

 

justement comme le remarquait BonuCad :exclam:

il faut penser à toutes les possibiltés :casstet:

SCU particulier, couleur et type de ligne forcés,

accrochage intempestif,unités dessin exotiques,

saisie de texte en lieu et place de nombre

et la liste est longue

 

bon courage, tu es sur la bonne voie

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

merci pour ces remarques constructives.

Je m'en vais les prendre en compte dès à présent.

 

PS: je ne vois toujours pas l'utilité de cmdecho...

Qu'apporte le fait que les commandes ne s'affichent pas sur la ligne de commande?

 

Le fait de ne pas afficher les invites des commandes accélère notablement le processus quand on utilise command (surtout de manière répétitive). Et c'est parfois plus "propre" si l'utilisateur ne voit que les invites du programme.

Ligne de commande avec ton code en l'état :

Longueur baffle: 30

 

Epaisseur baffle: 5

 

Nombre de baffles: 3

 

Ecartement des baffles: 25

 

Pt d'insertion PAS: rectangle

Spécifiez le premier coin ou [Chanfrein/Elévation/Raccord/Hauteur/Largeur]:

Spécifiez un autre coin ou [Aire/Cotes/Rotation]:

Commande: reseau

Choix des objets: 1 trouvé(s)

 

Choix des objets: Entrez le type de réseau [Rectangulaire/Polaire] : r

Entrez le nombre de rangées (---) : 3

Entrez le nombre de colonnes (|||) 1

Entrez la distance entre les rangées ou spécifiez la cellule d'unités (---):

30.00000000000000

Commande: rectangle

Spécifiez le premier coin ou [Chanfrein/Elévation/Raccord/Hauteur/Largeur]:

Spécifiez un autre coin ou [Aire/Cotes/Rotation]:

Commande: nil

 

Commande:

Avec cmdecho à 0 et en plus un (princ) à la fin :

Longueur baffle: 30

 

Epaisseur baffle: 5

 

Nombre de baffles: 3

 

Ecartement des baffles: 25

 

Commande:

 

Mais ce n'était pas ce que je voulais dire, mes doigts ont fourché :)

En fait je parlais des accrochages et voulais dire CMDECHO.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

Bonjour,

 

suite à vos remarques et quelques posts plus tard j'en suis arrivé là (encore merci à (gile)).

 

  ;-- PAS 1.1 (BCH) --
;Créé un piège à son, insère une étiquette et la renseigne.

(defun c:PAS (/	    OS	  L	Ep    H	    N	  Ec	P0    P10
      P11   B	  Ba	etq1  etq2  etq3  etq4	etq5  etq6
      etq7  etq8  etq9	etq10
     )
 (setvar "cmdecho" 0)
 (initget (+ 1 2 4))
 (setq	OS (getvar "osmode")
L  (getreal "\nLongueur baffle: ")
Ep (getreal "\nEpaisseur baffle: ")
H  (getreal "\nHauteur baffle: ")
N  (getint "\nNombre de baffles: ")
Ec (getreal "\nEcartement des baffles: ")
P0 (getpoint "\nPt d'insertion PAS: ")
 )
 (setvar "osmode" 0)

;Dessin Baffle

 (setq P10 (list (+ (car P0) (/ Ec 2)) (+ (cadr P0) (/ Ec 2))))
 (setq P11 (list (+ (car P10) L) (+ (cadr P10) Ep)))

 (command "_rectangle" P10 P11)

;Changement propriétés bafles

 (setq B (entget (entlast)))
 (if (assoc 62 B)
   (entmod (subst '(62 . 8) (assoc 62 B) B)) ;couleur
   (entmod (append B '((62 . 8))))
 )
 (if (assoc 6 B)
   (entmod (subst '(6 . "cache") (assoc 6 B) B)) ;type de ligne
   (entmod (append B '((6 . "cache"))))
 )
 (if (assoc 370 B)
   (entmod (subst '(370 . 9) (assoc 370 B) B)) ;Epaisseur
   (entmod (append B '((370 . 9))))
 )
 (setq Ba (entlast))
 (command "_array" Ba "" "r" N "1" (+ Ep Ec)) ;[reseau]

;Dessin PAS

 (command "rectangle"
   P0
   (list (+ (car P0) L Ec) (+ (cadr P0) (* N (+ Ep Ec))))
 )

;Insertion étiquette

 (command "_-insert" "ETQ_PAS" pause "" "" "")

;Renseignement attributs

 (setq	etq1  (cdr (assoc -1 (entget (entnext (entlast))))) ;REPERE
etq2  (entnext etq1) ;Largeur
etq3  (entnext etq2) ;Hauteur
etq4  (entnext etq3) ;Ai
etq5  (entnext etq4) ;Nb baffles
etq6  (entnext etq5) ;Ep baffles
etq7  (entnext etq6) ;Lg baffles
etq8  (entnext etq7) ;Ecartement
etq9  (entnext etq8) ;Localisation
etq10 (entnext etq9) ;Niveau
 )

 (entmod (subst (cons 1 (rtos (* N (+ Ep Ec)) 2 0))
	 (assoc 1 (entget etq2))
	 (entget etq2)
  )
 )

 (entmod (subst (cons 1 (rtos H 2 0))
	 (assoc 1 (entget etq3))
	 (entget etq3)
  )
 )

 (entmod (subst (cons 1 (itoa N))
	 (assoc 1 (entget etq5))
	 (entget etq5)
  )
 )

 (entmod (subst (cons 1 (rtos Ep 2 0))
	 (assoc 1 (entget etq6))
	 (entget etq6)
  )
 )

 (entmod (subst (cons 1 (rtos L 2 0))
	 (assoc 1 (entget etq7))
	 (entget etq7)
  )
 )

 (entmod (subst (cons 1 (rtos Ec 2 0))
	 (assoc 1 (entget etq8))
	 (entget etq8)
  )
 )

 (setvar "osmode" OS)
 (setvar "cmdecho" 1)
 (princ)

)

 

Ce qui me satisfait presque complètement, mais...

mon étiquette (bloc "ETQ_PAS") ne se renseigne qu'après validation de la boite de dialogue "éditer les attributs" (avec variable attdia à 1).

Comment faire pour qu'au moment où la boite de dialogue s'ouvre, elle soit déjà renseignée?

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour, petite relance:

 

mon étiquette (bloc "ETQ_PAS") ne se renseigne qu'après validation de la boite de dialogue "éditer les attributs" (avec variable attdia à 1).

Comment faire pour qu'au moment où la boite de dialogue s'ouvre, elle soit déjà renseignée?

 

je pense que personne n'a fait attention à cette dernière demande...

 

Merci.

 

 

Lien vers le commentaire
Partager sur d’autres sites

Finalement après pas mal de recherches et d'essais, et notamment grace à ce post - http:// http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=3986#pid - qui m'a fait découvrir la commande "ddatte", je suis arrivé à ce que je voulais.

 

Je vous poste uniquement la dernière partie modifiée (fonctionne avec attdia à 0)

 

  ;Insertion étiquette

 (command "_-insert"
   "ETQ_PAS"
   pause
   ""
   ""
   "" ;REPERE
   (print (rtos (* N (+ Ep Ec)) 2 0)) ;Largeur PAS
   (print (rtos H 2 0)) ;Ht baffles
   "" ;Ai
   (print (itoa N)) ;Nb baffles
   (print (rtos Ep 2 0)) ;Ep baffles
   (print (rtos L 2 0)) ;Lg baffles
   (print (rtos Ec 2 0)) ;Ecartement
   "" ;Localisation
   "" ;Niveau
 )

 (command "_ddatte" (entlast))

Lien vers le commentaire
Partager sur d’autres sites

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é