Bortch59 Posté(e) le 24 janvier 2011 Posté(e) le 24 janvier 2011 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) )
(gile) Posté(e) le 24 janvier 2011 Posté(e) le 24 janvier 2011 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
Bortch59 Posté(e) le 24 janvier 2011 Auteur Posté(e) le 24 janvier 2011 J'ai du mal à comprendre l'utilité de la variable cmdecho.y aurait il un sujet à ce sujet??
Bred Posté(e) le 24 janvier 2011 Posté(e) le 24 janvier 2011 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...
didier Posté(e) le 25 janvier 2011 Posté(e) le 25 janvier 2011 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 faitn'était pas de cette eau. il est vrai pour ma défense qu'on travaillait sous DOSet que l'Edit du Dos est à l'IDE de VLISPce que le silex est au briquet.. je confirme les propos de (gile)les commandes internationales c'est mieuxde 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] Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 25 janvier 2011 Posté(e) le 25 janvier 2011 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
didier Posté(e) le 25 janvier 2011 Posté(e) le 25 janvier 2011 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 nombreet la liste est longue bon courage, tu es sur la bonne voie amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Bortch59 Posté(e) le 27 janvier 2011 Auteur Posté(e) le 27 janvier 2011 Salut, 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?
(gile) Posté(e) le 27 janvier 2011 Posté(e) le 27 janvier 2011 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: rectangleSpécifiez le premier coin ou [Chanfrein/Elévation/Raccord/Hauteur/Largeur]:Spécifiez un autre coin ou [Aire/Cotes/Rotation]:Commande: reseauChoix des objets: 1 trouvé(s) Choix des objets: Entrez le type de réseau [Rectangulaire/Polaire] : rEntrez le nombre de rangées (---) : 3Entrez le nombre de colonnes (|||) 1Entrez la distance entre les rangées ou spécifiez la cellule d'unités (---): 30.00000000000000Commande: rectangleSpé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
Bortch59 Posté(e) le 19 mai 2011 Auteur Posté(e) le 19 mai 2011 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?
Bortch59 Posté(e) le 28 mai 2011 Auteur Posté(e) le 28 mai 2011 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.
Bortch59 Posté(e) le 28 mai 2011 Auteur Posté(e) le 28 mai 2011 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))
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