x_all Posté(e) le 6 juillet 2015 Posté(e) le 6 juillet 2015 Bonjour je voudrai écrire une fonction pour modifier un attribut dans un bloc dynamiqueAprès m'être cassé les dents en autolisp, je crois bien avoir compris que ce n'était possible qu'en Vlisp.Mais si je ne suis pas fortiche en autolisp, le visual me déroute complètement. si j'ai bien compris, pour pouvoir prétendre à utiliser les fonctions Vlisp, il faut commencer par déclarer dans le programme principal de "charger " vba, puis lui déclarer qu'on va travailler dans le document actif (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) dans une fonction j'arrive déja à accéder à l'effectivename pour contrôler si c'est bien un des bloc que je veux modifier, mais impossible de m'en sortir sans votre aide...Si une bonne âme pouvais m'indiquer la marche à suivre.Je souhaite une fonction qui modifie un bloc en lui passant comme argument le handle, le nom de l'attribut à modifier et la nouvelle valeuret peut etre une autre dans le genre pour la lecture si ce n'est pas exagéré... merci quelques trucs sur autocad
sbosarl Posté(e) le 7 juillet 2015 Posté(e) le 7 juillet 2015 bonjour, notre (gile) avais posé se code pour les elements dynamique, cela ne traite pas les attributs;;---------------------------------------------------------------------- ;; changes a given variable in your block ;(chgdynprop (car (entsel)) "Distance1" 25.0) (defun chgdynprop (ename propname newval / v vval sal tot i) (setq obj (vlax-ename->vla-object ename) v (vla-getdynamicblockproperties obj) vval (vlax-variant-value v) sal (vlax-safearray->list vval) tot (length sal) i 0) ;(princ obj) (princ v) (princ vval)(princ sal)(princ tot) (while (< i tot) (if (= (vlax-get-property (nth i sal) "PropertyName") propname) (progn (vlax-put-property (nth i sal) "Value" newval) (setq i tot) ) (setq i (1+ i)) ) ) )(princ)
Patrick_35 Posté(e) le 7 juillet 2015 Posté(e) le 7 juillet 2015 Salut Allez, en pur vl avec commentaires ;) (defun c:matt(/ doc ent sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) ; Pointer sur le document actif (vla-startundomark doc) ; Activer le début de l'undo (and (ssget (list (cons 0 "insert") (cons 66 1))) ; Sélection des blocs avec attributs (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) ; Boucle pour parcourir la sélection avec mémorisation de la sélection (and (eq (vla-get-effectivename ent) "MON_BLOC") ; Test le nom du bloc (vla-put-textstring (nth 0 (vlax-invoke ent 'getattributes)) "MA_VALEUR") ; Changer la valeur du 1er attribut. (vlax-invoke ent 'getattributes) retourne la liste des attributs ) ) (vla-delete sel) ; Effacer la sélection. Impératif si on veut éviter plus tard des erreurs de sélection ) ) (vla-endundomark doc) ; Fin de l'undo (princ) ) Maintenant, comment faire pour bien comprendreDirectement au clavier sur Autocad et en regardant les résultats Pointer sur le document actif(setq doc (vla-get-activedocument (vlax-get-acad-object)))#<VLA-OBJECT IAcadDocument 000000002d263278> Sélection des blocs avec attributs(ssget (list (cons 0 "insert") (cons 66 1)))Choix des objets: --> <Selection set: c5> Pointer sur le jeu de sélection(setq sel (vla-get-activeselectionset doc))#<VLA-OBJECT IAcadSelectionSet 000000002dd293f8> Pointer sur le 1er élément du jeu de sélection(setq ent (vla-item sel 0))#<VLA-OBJECT IAcadBlockReference 000000002dc631b8> Voir les propriétés de mon bloc(vlax-dump-object ent T) Liste des attributs(setq att (vlax-invoke ent 'getattributes))(#<VLA-OBJECT IAcadAttributeReference 000000002d794978> #<VLA-OBJECT IAcadAttributeReference 000000002d794a98> #<VLA-OBJECT IAcadAttributeReference 000000002d793bf8> #<VLA-OBJECT IAcadAttributeReference 000000002d793d18> #<VLA-OBJECT IAcadAttributeReference 000000002d793e38> #<VLA-OBJECT IAcadAttributeReference 000000002d794df8> #<VLA-OBJECT IAcadAttributeReference 000000002d794f18>) Voir les propriétés du 1er attribut de la liste(vlax-dump-object (nth 0 att)) Modifier la valeur du 1er attribut de la liste(vla-put-textstring (nth 0 att) "MA_VALEUR")nil mais je regarde à l'écran le résultat @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
x_all Posté(e) le 7 juillet 2015 Auteur Posté(e) le 7 juillet 2015 HO MERCI BEAUCOUP !! je m'excuse pour les maj mais c'est parti tout seul !!Comme d'ab je suis charrette au taff mais ce soir j'épluche tout ça. Mais je crois déjà comprendre ou je m’emmêlais les pinceaux..reste que le (setq att (vlax-invoke ent 'getattributes)) est pas des plus lisible pour un humain... je fait comment pour retrouver mon attribut NIV ?Ce n'est pas pénalisant pour moi car, en l'espèce, le bloc n'a qu'un niveau. Mais ce n'est pas gagné pour faire une fonction généraliste type (defun Mod-Att ( ent Nom-attribut Nouvelle-valeur) Je reviendrai poser mes questions si j'en ai, mais je gage que ce post va aider pas mal de monde à comprendre les base du Vlisp encore merci ! quelques trucs sur autocad
Patrick_35 Posté(e) le 7 juillet 2015 Posté(e) le 7 juillet 2015 reste que le (setq att (vlax-invoke ent 'getattributes))est pas des plus lisible pour un humain... Si tu lis la fonction get pour obtenir et attributes pour... je fait comment pour retrouver mon attribut NIV ?Voir les propriétés du 1er attribut de la liste(vlax-dump-object (nth 0 att)) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
x_all Posté(e) le 7 juillet 2015 Auteur Posté(e) le 7 juillet 2015 bonjour... bon, je m'en suis sorti pour le cas qui m'occupe, mais j'aurai besoin de quelques précisions car j'ai pas tout compris à la boucle en Vlispmes 2 fonctions qui marchent car je n'ai qu'1 attribut mais j'aurai aimer les rendre plus généraliste: ;; Vb-Val-att fonction Vlisp pour lire la valeur d'un attribut (defun Vb-Val-att (ent nomatt / ) (setq Vba-ent (vlax-ename->vla-object ent)) (setq att (vlax-invoke Vba-ent 'getattributes)) (setq val (vla-get-TextString (nth 0 att))) val ); fin Vb-Val-att ;; Vb-Mod-att fonction Vlisp pour lire la valeur d'un attribut (defun Vb-Mod-att (ent nomatt Nval / ) (setq Vba-ent (vlax-ename->vla-object ent)) (vla-put-textstring (nth 0 (vlax-invoke Vba-ent 'getattributes)) Nval) ); fin Vb-Mod-att Vous l'aurez compris, nomatt ne sert à rien..en fait j'ai bien essayer de relire l'aide, mais c'est vlax-for qui me pose problème car en essayant un truc du style : (defun Vb-Val-att (ent nomatt / ) (setq Vba-ent (vlax-ename->vla-object ent)) (setq att-lst (vlax-invoke Vba-ent 'getattributes)) (vlax-for att att-lst (if (eq (vla-get-TagString att) nomatt) (setq val (vla-get-TextString (nth 0 att))) ) ) pourtant (setq att-lst (vlax-invoke Vba-ent 'getattributes)) passe bien une liste d'attribut donc c'est que la notion de liste det de collection n'est pas équivalente car dans l'aide vba on à :( Vlax-for symbol collection [expression1 [expression2 ...]]) J'ai aussi essayer de parcourir la liste att-list avec un while, mais j'ai du me manquer quelque par, à moins que ce ne soit pas adapté ? merci d'avance pour les explicaions... quelques trucs sur autocad
Patrick_35 Posté(e) le 8 juillet 2015 Posté(e) le 8 juillet 2015 Salut Une boucle vlax-for ne parcours qu'une collection de type vl.Par exemple, toutes les entités qui composent le dessin en espace objet se trouvent dans cette collection (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))). (vlax-invoke Vba-ent 'getattributes) retourne une liste. Comme toute liste, tu peux la traiter avec while, repeat, marcap, foreach, etc... (defun Vb-Val-att (ent nomatt / att val) (foreach att (vlax-invoke (vlax-ename->vla-object ent) 'getattributes) (and (eq (vla-get-tagstring att) nomatt) (setq val (vla-get-textstring att)) ) ) val ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
x_all Posté(e) le 8 juillet 2015 Auteur Posté(e) le 8 juillet 2015 Ha lala Je me doutais bien qu'une collection n'est pas une liste mais j'ai du me planter sur mon While et il devait être trop tard pour que j'ai les yeux suffisamment en face des trous pour que je trouve ma boulette... C'est vraiment cool d'avoir pris du temps pour me sortir de la panade dans la quelle je me trouvais je posterai le truc complet quand j'aurai fini, c'est pour de la cotation alti qui marche dans un SCU car le truc avec les champs que j'ai sous la main retourne des valeur erronées si on est pas en SCG merci encore... et puis l'imbrication des appels pour faire sauter une variable... punaise ya du boulot avant que tout ça devienne un réflexe... quelques trucs sur autocad
Patrick_35 Posté(e) le 8 juillet 2015 Posté(e) le 8 juillet 2015 et puis l'imbrication des appels pour faire sauter une variable... punaise ya du boulot avant que tout ça devienne un réflexe...C'est surtout pour limiter l'utilisation des variables et tant qu'a faire, les effets de bord @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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