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