CadFrank Posté(e) le 14 août 2014 Posté(e) le 14 août 2014 Bonjour, Je suis en dilemme et j'aimerai avoir de l'informaiton sur les petite routine qui utilise des arguments. Voici ce que j'aimerai transférer en petit program vu que j'utilise ce code souvent. (defun _getall->Layout (/ adoc lt obj x atts) (setq adoc (vla-get-activedocument (vlax-get-acad-object))) (vlax-for lt (vla-get-layouts adoc) (vlax-for obj (vla-get-block lt) (if (and (= "AcDbBlockReference" (vla-get-objectname obj)) (member (vla-get-effectivename obj) Nombloc) (= :vlax-true (vla-get-hasattributes obj) )) (progn (setq atts (vlax-invoke obj 'getattributes)) (foreach x atts (if (= TagApp (vla-get-tagstring x)) ;<-- le if est la parti répétitive. (vla-put-textstring x TApp) ) ) ) ) ) ) ) ) Donc, ce que j'aimerai est de créer un sous-program avec ce code et l'utiliser dans mon program principale. Quel serait la meilleur méthode pour y parvenir. Et comment est-ce que je dois regarder le code pour mieu le comprendre. Merci !
(gile) Posté(e) le 14 août 2014 Posté(e) le 14 août 2014 Salut, À propos, de l'utilisation d'arguments dans les fonctions LISP définies par l'utilisateur (souvent appelée : routines), tu peux lire ce sujet. Dans l'exemple que tu donnes, l'utilisation d'arguments permettrait d'éviter les variables globales (NomBloc, TagApp et TApp).Celles-ci sont définies à l'extérieur de la routine et leurs valeurs peuvent être assignées par n'importe quelle fonction LISP. Même si la probabilité est infime, tu ne pourras jamais être sûr à 100% qu'elles auront les valeurs voulues au moment où est exécutée la routine (en informatique, un évènement qui a très peu de chance d'arriver finit toujours par se produire).De plus, l'utilisation d'arguments rendrait la routine plus lisible et donc plus facilement réutilisable. (defun _getall->Layout (nomBloc etiquette valeur / adoc lt) (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for lt (vla-get-Layouts adoc) (vlax-for obj (vla-get-Block lt) (if (and (= "AcDbBlockReference" (vla-get-ObjectName obj)) (member (vla-get-EffectiveName obj) nomBloc) (= :vlax-true (vla-get-HasAttributes obj)) ) (foreach x (vlax-invoke obj 'getattributes) (if (= etiquette (vla-get-TagString x)) (vla-put-TextString x valeur) ) ) ) ) ) ) On appelle ensuite la routine en spécifiant les valeurs des arguments (qui doivent toutes être des chaînes de caractères) :(_getall->Layout "NomDuBloc" "EtiquetteAttribut" "ValeurAttribut") PS : il n'est pas nécessaire de déclarer les variables utilisés par les fonctions foreach ou vlax-for. La portée de ces variables est automatiquement limitée au bloc de code (foreach ...) ou (vlax-for ...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
CadFrank Posté(e) le 14 août 2014 Auteur Posté(e) le 14 août 2014 Donc premierement un gros merci. Ce qui j'essai de faire exatement est ceci. (defun _Revision (/ TRev TDesc Tdate TPar TApp TagRev TagNRev TagDesc TagDat TagPar TagApp lt obj atts x DynBP) ;| Élénment de text |; (if (= choix "N") (setq TRev "0")) (if (= choix "R") (setq TRev (itoa (fix (getreal "\n Numéro de révision : "))))) (setq TDesc (strcase (getstring T "\n Donner la raison de la révision. : ")) Tdate (_Today) ) (initget 1 "C F J S") (setq TPar (getkword "\n Qui a fait les changements sur le plan? [Charle/François/Julieta/Simon]: ")) (if (= TPar "C")(setq TPar "C.L")) (if (= TPar "F")(Setq TPar "F.L")) (if (= TPar "J")(setq TPar "J.L")) (if (= TPar "S")(setq TPar "S.D")) (initget 1 "J S") (setq TApp (getkword "\n Qui a approuvé les changement [Julieta/Simon]: ")) (if (= TApp "J")(setq TApp "J.L")) (if (= TApp "S")(setq TApp "S.D")) ;| Élénment des TAG |; (setq TagRev "REV" TagNRev (strcat "N°REV" TRev) TagDesc (strcat "DESCRITION" TRev) TagDat (strcat "DATE" TRev) TagPar (strcat "PAR" TRev) TagApp (strcat "APP" TRev) ) ;Inscrit le texte dans chacun des attributs (vlax-for lt (vla-get-layouts adoc) (vlax-for obj (vla-get-block lt) (if (and (= "AcDbBlockReference" (vla-get-objectname obj)) (member (vla-get-effectivename obj) Nombloc) (= :vlax-true (vla-get-hasattributes obj) )) (progn (setq atts (vlax-invoke obj 'getattributes)) (foreach x atts (if (= TagRev (vla-get-tagstring x)) (vla-put-textstring x TRev) ) (if (= TagNRev (vla-get-tagstring x)) (vla-put-textstring x TRev) ) (if (= TagDesc (vla-get-tagstring x)) (vla-put-textstring x TDesc) ) (if (= TagDat (vla-get-tagstring x)) (vla-put-textstring x Tdate) ) (if (= TagPar (vla-get-tagstring x)) (vla-put-textstring x TPar) ) (if (= TagApp (vla-get-tagstring x)) (vla-put-textstring x TApp) ) (setq DynBP (nth 2 (vlax-invoke obj 'GetDynamicBlockProperties))) (vla-put-value DynBP TRev) ) ) ) ) ) ) Est-ce que je dois répéter ceci: (_getall->Layout TagPro TProjet) Pour chaque attribut ? ou bien il y a autre facon de procéder. Si on vois le code plus au chaque (if) change une attribut. j'ai modifier la routine pour que je n'ai que 2 arguments a entrer puisque la liste de bloc est tjrs la meme. (defun _getall->Layout (etiquette valeur / adoc lt) (setq Nombloc '("LU CARTOUCHE" "Cartouche Aliance" "LC CARTOUCHE CHUM" "LC CARTOUCHE CHUM 2" "LC CARTOUCHE" "LU CARTOUCHE PANNEAU" "CARTOUCHE LU" "LC CARTOUCHE 2" ) ) (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for lt (vla-get-Layouts adoc) (vlax-for obj (vla-get-Block lt) (if (and (= "AcDbBlockReference" (vla-get-ObjectName obj)) (member (vla-get-EffectiveName obj) nomBloc) (= :vlax-true (vla-get-HasAttributes obj)) ) (foreach x (vlax-invoke obj 'getattributes) (if (= etiquette (vla-get-TagString x)) (vla-put-TextString x valeur) ) ) ) ) ) ) Je vais maintement passer a lire ton lien :D Merci
CadFrank Posté(e) le 14 août 2014 Auteur Posté(e) le 14 août 2014 Finalement avec un peu de percevérance j'ai trouver quelque chose qui fonctionne. (defun _Modification (/ obj atts x lt) (initget 1 "P T D V") (setq Mod (getkword "\n Quel élément voulez vous modifier? [Projet/Titre/Date/Verificateur] : ")) (if (= Mod "P") (progn (setq TProjet (strcase (getstring T "\n Quel est le nouveau nom du projet? ")) TTitre (strcase (getstring T "\n Quel est le nouveau nom du projet? "))) (setq TagPro "PROJET" Tagtit "TITRE") (mapcar '_getall->Layout (list TagPro TagTit) (list TProjet TTitre) ) ) ) ) Quoi que je ne comprend pas pourquoi le code ne fonction pas avec (mapcar '_getall->Layout '(TagPro TagTit) '(TProjet TTitre) ) Je croyais que ' etait la meme chose list. Si je veux etre bien honnete, j'aime beaucoup plus ce forum que CadTutor. Le participant du forum ici prenne le temps d'expliquer le code. ce qui aide beaucoup plus que se faire donner la réponse. Un gros MERCI!
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