Aller au contenu

Remplacement d\'un attribut de bloc par un champ


Messages recommandés

Posté(e)

Salut à toutes et à tous

 

Je me posais la question de savoir quelle etait la methode la plus rapide pour: enlever un attribut dans un bloc ( cartouche) pour y inserer un champ en attribut de bloc (pour me permettre la mise a jour automatique du cartouche)

Dois je modifier chaque cartouche un par un ?

 

Si vous avez des combines.

 

@+

Posté(e)

Salut !

Dans les outils de Gile, tu as une routine "editbloc", un truc comme ça, qui te permet de faire ce que tu veux...

 

A bientot !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Salut,

 

Edit_bloc ne fait pas tout et pas ça en particulier.

 

S'il s'agit de modifier les cartouches dans un seul dessin, tu peux utiliser l'éditeur de bloc pour remplacer l'attribut par le champ dans la définition du bloc et faire un ATTSYNC sur une des références du dessin.

 

Si tu as plusieurs dessins à modifier et si ton cartouche est un bloc/fichier (sino fais en un avec WBLOC) remplace la définition d'attribut par le champ dans le fichier etenregistre le, puis colle sur la ligne de commande l'expression LISP suivante (après avoir remplacé NomDuBloc par le nom du bloc cartouche) dans chaque desssin.

 

(and
 (vl-cmdf "_.insert" "[b]NomDuBloc[/b]=[b]NomDuBloc[/b]" '(0 0) 1. 1. 0.)
 (vl-cmdf "_.erase" "_l" "")
)

 

[Edité le 3/11/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Aaaargh ! J'ai mal lu la question... Je croyais que ct supprimer un attribut !

Désolé...

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Edit_bloc ne permet pas non plus de supprimer des attributs.

 

C'est une petite application pour modifier les propriétés (couleur, calque, type de ligne, échelle, unités...) de toutes les entités composant un ou plusieurs blocs (au départ pour "nettoyer" des bibliothèques récupérées ici ou là).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut GILE

 

 

J'ai fait un WBLOC avec mon cartouche,enlever l'attribut pur y inserer un champ en tant qu'attribut,enregistrer, taper l'expression LISP et voila le message sans que le champ est changé.

Pour info voila ce qu'on me retourne

 Commande: (and
(_> (vl-cmdf "_.insert" "CARTOUCHE A4=CARTOUCHE A4" '(0 0) 1. 1. 0.)
(_> (vl-cmdf "_.erase" "_l" "")
(_> )
_.insert Entrez le nom du bloc ou [?] : CARTOUCHE A4=CARTOUCHE A4 
Définition à double du bloc DEF  ignorée.
Remplacement de [simplex8] par [simplex.shx].
Remplacement de [MONOTXT] par [ROMANTIC.TTF].
Remplacement de [MONOTXT] par [CITYB___.TTF].
Le bloc "CARTOUCHE A4" est redéfini.
Spécifiez le point d'insertion ou 
[Echelle/X/Y/Z/Rotation/PEchelle/PX/PY/PZ/PRotation]:
Entrez le facteur d'échelle en  X, spécifiez le coin opposé ou [Coin/XYZ] <1>: 
1.000000000000000 Entrez le facteur d'échelle en Y d'échelle en  X>: 1.000000000000000
Spécifiez l'angle de rotation <0.00>: 0.000000000000000
Entrez la valeur des attributs.
- <->: _.erase - <->: _l - <->: - <->: T
- <->:
- <->:
- <->:
- <->:
- <->:
- <->:
- <->:
- <->:
- <->:
- <->:
- :

Posté(e)

Salut,

 

J'ai répondu un peu vite en reprenant une expression donnée ailleurs.

 

Bien sûr, ton cartouche doit contenir d'autres attributs.

Il faut peut-être se limiter à insérer une référence de la nouvelle définition en 0,0 :

 

(vl-cmdf "_.insert" "CARTOUCHE A4=CARTOUCHE A4" '(0 0) 1. 1. 0.)

 

puis de renseigner les attributs à renseigner,

puis faire ATTSYNC,

et enfin supprimer le bloc inséré.

 

Je n'ai pas testé...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut

 

Je viens de tester .Tout se passe bien jusqu'au moment ou le champ devrai changer mais ne change pas.De plus quand je l'insere (cartouche)dans un dessin vierge il change automatiquement mais pas dans mes dessins deja "equipés".J'ai fait les manips en changeant les valeurs de FIELDEVAL,

rien ne change.

Je vais finir pas me les taper à la papatte.

 

@+

Posté(e)

J'essaye de comprendre.

 

Quand tu insères le bloc (fichier) dans un dessin vierge, le champ est bien présent à la place de l'attribut ?

 

Si oui, dans un dessin où l'ancien bloc est présent, insères-tu bien le nouveau bloc avec l'expression LISP :

(vl-cmdf "_.insert" "CARTOUCHE A4=CARTOUCHE A4" '(0 0) 1. 1. 0.) ?

 

Le bloc nouvellement inséré a-t-il bien le champ à la place de l'attribut ?

 

Si oui, fais-tu bien la synchronisation des attributs avec ATTSYNC ?

 

Tu peux aussi m'envoyer ton fichier bloc CARTOUCHE A4 à l'adresse suivante :

 

gilecantel(a)wanadoo.fr

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut

 

Quand tu insères le bloc (fichier) dans un dessin vierge, le champ est bien présent à la place de l'attribut ?

Oui et il se met automatiquement à jour.

 

Si oui, dans un dessin où l'ancien bloc est présent, insères-tu bien le nouveau bloc avec l'expression LISP :

(vl-cmdf "_.insert" "CARTOUCHE A4=CARTOUCHE A4" '(0 0) 1. 1. 0.) ?

Oui

 

Si oui, fais-tu bien la synchronisation des attributs avec ATTSYNC ?

Oui

 

Tu peux aussi m'envoyer ton fichier bloc CARTOUCHE A4

Je t'envoie ça

 

Sinon j'ai bien trouver une methode en double-cliquant sur l'attribut qui m'ouvre donc le gestionnaire et clic droit sur l'attribut puis inserer un champ (pour l'instant j'ai pas trouver plus rapide EXCUSES MOI DU PEU...)

 

@+

Posté(e)

Je n'avais pas bien compris, je pensais que tu voulais remplacer un attribut par un champ et pas mettre un champ dans un attribut existant.

 

Donc, une autre expression à coller sur la ligne de commande (tu peux remplacer le nom du bloc ou mettre "Cartouche*" pour que ça fonctionne avec tous les blocs "Cartouche ...")

 

(if (ssget "_X" '((0 . "INSERT") (2 . "Cartouche A4")))
 (progn
   (vlax-for b	(vla-get-ActiveSelectionSet
	  (vla-get-activeDocument
	    (vlax-get-acad-object)
	  )
	)
     (foreach att (vlax-invoke b 'getAttributes)
(if (= (vla-get-TagString att) "FICHIER")
  (vla-put-Textstring att "%%")
)
     )
   )
   (vla-regen (vla-get-activeDocument
	 (vlax-get-acad-object)
       )
       acAllViewports
   )
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut

 

OK super, ça fonctionne parfaitement et me fera gagner enormement de temps. Merci.

 

Petite question subsidiaire concernant ceci

mettre "Cartouche*" pour que ça fonctionne avec tous les blocs "Cartouche ...")

Cela veut dire que si je met cartouche A3 dans l'expression cela fonctionnera de la meme façon sur un autre cartouche en A3?

 

2eme petite question

 

Là donc on est d'accord, je met un champ dans un attribut existant qui est FICHIER , et si eventuellement je voulais faire la meme chose pour la date par ex. que faut-il modifier dans l'expression?

 

@+

 

Posté(e)

Cela veut dire que si je met cartouche A3 dans l'expression cela fonctionnera de la meme façon sur un autre cartouche en A3?

 

Oui, mais cela veut aussi dire que si tu mets "Cartouche*" cela fonctionnera pour tous les blocs dont le nom commence par Cartouche.

 

et si eventuellement je voulais faire la meme chose pour la date par ex. que faut-il modifier dans l'expression?

 

Tu peux remplacer (ou ajouter à la suite pour tout faire d'un seul coup) l'expression :

 

(if (= (vla-get-TagString att) "FICHIER")
  (vla-put-Textstring att "%%")
) 

 

Où FICHIER est l'étiquette de l'attribut à remplacer et "%%" l'expression du champ.

 

Pour récupérer l'expression du champ, tu lances la commande CHAMP, tu choisis et formates ton champ comme tu le souhaites, puis tu copies l'expression (en bas de la boite de dialogue).

Pour l'intégrer dans le LISP, il faut mettre cette expression entre guillemets, et ajouter une barre oblique inversée (anti slash) devant chaque barre oblique inversée et chaque guillemet à l'intérieur de l'expression de champ.

 

Exemple commenté pour mettre des champs dans les attributs "FICHIER" et "DATE_DE_REDACTION" de tous les blocs "Cartouche..." du dessin.

(les anti-slashes ajouté aux expressions de champ sont en rouge)

 

(if
 
;; Sélection de tous les blocs "Cartouche..."
 (ssget "_X" '((0 . "INSERT") (2 . "Cartouche*"))) 
 (progn
   (vlax-for b	(vla-get-ActiveSelectionSet
	  (vla-get-activeDocument
	    (vlax-get-acad-object)
	  )
	)
     (foreach att (vlax-invoke b 'getAttributes)


;; si étiquette = FICHIER
(if (= (vla-get-TagString att) "FICHIER") 
  (vla-put-Textstring
    att
    ;; expression de champ
    "%%" 
  )
);_ fin de if


;; si étiquette = DATE_DE_REDACTION
(if (= (vla-get-TagString att) "DATE_DE_REDACTION") 
  (vla-put-TextString
    att
    ;;expression de champ
    "%%" 
  )
);_ fin de if


     )
   )
   (vla-regen (vla-get-activeDocument
	 (vlax-get-acad-object)
       )
       acAllViewports
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut (gile)

 

Merci pour ces renseignements precis et precieux, je teste et te tiens au courant.

 

@+

 

PS: bravo pour la pedagogie

 

[Edité le 5/11/2007 par lesourd2]

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é