Aller au contenu

sous program & Arguments


CadFrank

Messages recommandés

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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!

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é