Aller au contenu

modifier un attribut de bloc dynamique


Messages recommandés

Posté(e)

Bonjour

 

je voudrai écrire une fonction pour modifier un attribut dans un bloc dynamique

Aprè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 valeur

et peut etre une autre dans le genre pour la lecture si ce n'est pas exagéré...

 

merci

Posté(e)

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)

Posté(e)

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 comprendre

Directement 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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 !

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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 Vlisp

mes 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...

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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...

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é