Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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.

 

attdefID

Long; Input-only

The attribute definition ID.

 

value

String; Input-only

The new attribute value.

 

 

 

[Edité le 26/6/2010 par stormidable]

Posté(e)

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

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é