stormidable Posté(e) le 26 juin 2010 Posté(e) le 26 juin 2010 Bonjours à tous, j'ai un petit problème avec un script que j'essaye de bricoler.Je cherche à insérer un champ dans un bloc contenue dans une ligne de repère multiple,Je pense avoir compris le principe (notamment grâce au lisp de Gile « pline_block » merci ;-)Mais le programme ne fonctionne pas : le champ est bien inséré mais sa valeur est « #### » et le type de champ, lorsque je l'édite est « inconnu ».Pourtant lorsque je corrige le champ manuellement et que je compare la définition du champ corrigé et la définition du champ crée par le programme ce sont exactement les mêmes (à la différence près du doublement des caractères spéciaux « \ ») et le numéro ID de l'attribut source est bien le même.Peut être est-ce la fonction « vla-setBlockAttributeValue » qui ne gère pas l'édition des champs ? PS: dans le programme j'utilise un script que j'ai trouvé sur AUGI qui retourne la liste des attributs du bloc contenu dans la ligne de repère multiple. Voici le script en question, en espérant que quelqu'un aura la gentillesse d'y jeter un coup d'œil .Sachant qu'il y a des personnes très motivés sur ce forum je vous en remercie d'avance ;) (defun c:ic () (c:InsertChamp) ) (defun c:InsertChamp (/ AT:GetAttributes js n ObjSource ObjCible Attsource AttCible champ) ;;; Extract all Attributes from Block or Multileader w/Block ;;; #Object - Block/Multileader to extract attributes ;;; Alan J. Thompson, 08.17.09 (defun AT:GetAttributes (#Object / #Object #Entget) (if #Object (progn ;; if list, strip out ename (and (vl-consp #Object) (setq #Object (car #Object))) (cond ;; if vla-object & multileader with block, convert to ename ((and (eq (type #Object) 'VLA-OBJECT) (vlax-property-available-p #Object 'ContentBlockName) ) ;_ and (setq #Object (vlax-vla-object->ename #Object)) ) ;; if ename & block, convert to vla-object ((and (eq (type #Object) 'ENAME) (eq "INSERT" (cdr (assoc 0 (entget #Object)))) ) ;_ and (setq #Object (vlax-ename->vla-object #Object)) ) ) ;_ cond ;; run through options (cond ;; vla-object & attributed block ((and (eq (type #Object) 'VLA-OBJECT) (eq "AcDbBlockReference" (vla-get-objectname #Object) ) ;_ eq (eq (vla-get-hasattributes #Object) :vlax-true) ) ;_ and (vlax-safearray->list (vlax-variant-value (vla-getattributes #Object) ) ;_ vlax-variant-value ) ;_ vlax-safearray->list ) ;; ename or entsel-style list ((or (eq (type #Object) 'ENAME) (vl-consp #Object) ) ;_ or (setq #Entget (entget #Object)) (vl-remove-if '(lambda (x) (or (not x) (not (eq "AcDbAttributeDefinition" (vla-get-objectname x) ) ;_ eq ) ;_ not ) ;_ or ) ;_ lambda (mapcar '(lambda (x) (if (eq 330 (car x)) (vlax-ename->vla-object (cdr x)) ) ;_ if ) ;_ lambda #Entget ) ;_ mapcar ) ;_ vl-remove-if ) ) ;_ cond ) ;_ progn ) ;_ if ) ;;;============================================= ;;; LANCEMENT DU PROGRAMME ;;;============================================= (vl-load-com) (if (not *acdoc*) (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) ;;;Selection du bloc source (prompt "\nSélectionner le bloc source et la ligne de repère cible : " ) (setq js (ssget (list (cons -4 " (cons 0 "INSERT") (cons 0 "MULTILEADER") (cons -4 "OR>") ) ) ) (setq n 0) (repeat (sslength js) (setq o (ssname js n)) (if (= "INSERT" (cdr (assoc 0 (entget o)))) (setq ObjSource (vlax-ename->vla-object o)) (setq ObjCible (vlax-ename->vla-object o)) ) (setq n (1+ n)) ) (setq Attsource (nth 0 (vlax-invoke ObjSource 'GetAttributes))) (setq AttCible (nth 0 (AT:GetAttributes ObjCible))) (setq champ (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID attsource)) ">%).TextString>%" ) ) (vla-setBlockAttributeValue ObjCible (vla-get-ObjectID AttCible) champ ) )
(gile) Posté(e) le 26 juin 2010 Posté(e) le 26 juin 2010 Salut et bienvenue, La méthode SetAttributeValue sert à a modifier la valeur d'un attribut dans une cellule de tableau. Pour modifier la valeur d'une référence d'attribut de bloc, il faut utiliser (comme dans pline_block) vla-put-TextString. D'autre part, ObjSource et ObjCible pointent sur le même objet, de même que AttCible et AttSource.Ceci revient à essayer de créer un champ dans un attribut dont la valeur est liée à la valeur de ce même attribut, ça ne peut pas marcher... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
stormidable Posté(e) le 26 juin 2010 Auteur Posté(e) le 26 juin 2010 Je te remercie pour ta réponse, mais en regardant bien il me semble vraiment que les objets ObjSource et Objcible ne sont pas les mêmes :OblSource est un "IAcadBlockReference2"Objcible est un "IAcadMLeader2"De même AttSource est un "IAcadAttributeReference" et Attcible un "IAcadAttribute2". De plus je n'utilise pas la méthode "SetAttributeValue" mais "SetBlockAttributeValue" qui s'applique à un MLeader et qui modifie la valeur d'un attribut d'un bloc contenus dans ce MLeader. SetAttributeValue Methode Sets the attribute value in block content with attribute definition id. Signature object.SetBlockAttributeValue attdefId, value Object MLeader The object this method applies to. attdefIDLong; Input-onlyThe attribute definition ID. valueString; Input-onlyThe new attribute value. [Edité le 26/6/2010 par stormidable]
(gile) Posté(e) le 27 juin 2010 Posté(e) le 27 juin 2010 Au temps pour moi, j'avais juste parcouru le code en diagonale et n'avais pas eu encore l'occasion de me pencher sur les lignes de repère multiple. Après un regard un peu plus approfondi sur la question, il semble qu'il ne soit pas possible de mettre un champ dynamique comme valeur d'attribut d'un Mleader. J'arrive à mettre la valeur de l'attribut sélectionné dans une insertion de la même définition de bloc, mais pas un champ lié à cette valeur. NOTA : le second argument pour SetBlockAttributeValue doit être l'ObjectId de la définition d'attribut, pas l'ObjectId de la référence. (defun c:ic (/ att ref mlr def tag id) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (if (and (setq att (car (nentsel "\nSélectionner un attribut: "))) (setq ref (vlax-ename->vla-object (cdr (assoc 330 (entget att))))) (setq att (vlax-ename->vla-object att)) (= (vla-get-ObjectName att) "AcDbAttribute") (setq mlr (car (entsel "\nSélectionner une ligne de repère: "))) (setq mlr (vlax-ename->vla-object mlr)) (= (vla-get-ObjectName mlr) "AcDbMLeader") ) (progn (setq tag (vla-get-TagString att) def (vla-item *blocks* (vla-get-EffectiveName ref) ) ) (vlax-for o def (if (and (= (vla-get-ObjectName o) "AcDbAttributeDefinition") (= (vla-get-TagString o) tag) ) (setq id (vla-get-ObjectId o)) ) ) (if id (vla-setBlockAttributeValue mlr id ;; Champ : ne fonctionne pas ;;; (strcat "%;;; (itoa (vla-get-ObjectID att)) ;;; ">%).TextString>%" ;;; ) (vla-get-TextString att) ) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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