Aller au contenu

Modifier la valeur de plusieurs attributs


nen

Messages recommandés

Bonjour au forum,

 

J’ai des plans de 5 niveaux sur lequel se trouve dans chaque pièce un bloc avec un attribut « N° » qui numérote les détecteurs feu.

Je dois placer ses blocs sur chaque niveau au même endroit avec une numérotation type hôtelière, 100 pour le niveau 1, 200 pour le niveau 2, etc.

Est-il possible avec un lisp de modifier la valeur de l’attribut afin de ne pas les rentrer à nouveau à la main ce qui est fastidieux.

 

Je voudrais copier mes blocs du niveau 1 et les coller sur le niveau 2 et transformer mes blocs avec la valeur 100, 101, 102, etc. avec une valeur de 200, 201, 202, etc.

 

Merci d’avance, Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Tu trouveras ci-apres une routine "ATT_ADD" de Gilles qui permet

d additionner une valeur numerique a un attribut contenant du numerique !

 

NOTE : a priori elle ne fonctionne pas sur les Blocs dynamiques !?

 

---------------

SVP si qq un pouvait faire la Modif pour les Blocs dynamiques, cela serait SYMPA !

---------------

 

CONSEIL D'AMI : ne pas utiliser des caracteres speciaux / accentues (ni blanc/espace)

sur les Noms de Blocs et sur les Noms d Attributs !!

 

Donc tu copies tes Blocs du RDC sur un autre calque au 1er etage

et tu fais un ATT_ADD sur CES Blocs du 1er etage ...

... et ainsi de suite ...

 

Encore MERCI Gilles pour tes tres nombreuses contributions !

 

J ai aussi ajoute la routine "ATT_MUL" !

 

Routines tirees de mon stock de 3001 routines ...

 

LA SANTE, Bye, lecrabe ... Retraite J14 ...

 


;; 
;; Commande:  ATT_ADD 
;; par GC (Anciennement ADDATT) 
;; Pour ajouter/soustraire une valeur numerique SIMPLE 
;; a un Attribut SIMPLE sur un Bloc SIMPLE 
;; 

(defun c:ATT_ADD (/ att lst tag nam add ss n)
(if (and
(setq att (car (nentsel "\nSelectionnez UN Attribut a modifier: ")))
(setq lst (entget att))
(= (cdr (assoc 0 lst)) "ATTRIB")
(numberp (read (cdr (assoc 1 lst))))
(setq tag (cdr (assoc 2 lst)))
(setq nam (cdr (assoc 2 (entget (cdr (assoc 330 lst))))))
)
(if (and
(setq add (getreal "\nEntrez la valeur a ajouter ou soustraire : "))
(princ "\nSelectionnez les Blocs a modifier ")
(setq ss (ssget (list '(0 . "INSERT") (cons 2 nam))))
(setq n 0)
)
(while (setq blc (ssname ss n))
(setq att (entnext blc)
lst (entget att)
)
(while (= (cdr (assoc 0 lst)) "ATTRIB")
(if (and (= (cdr (assoc 2 lst)) tag)
(numberp (setq val (read (cdr (assoc 1 lst)))))
)
(progn
(entmod (subst (cons 1 (rtos (+ val add)))
(assoc 1 lst)
lst
)
)
(entupd blc)
)
)
(setq att (entnext att)
lst (entget att)
)
)
(setq n (1+ n))
)
)
(princ "\nL Objet selectionne n'est pas un attribut ! ")
)
(princ)
)  

 

 

;; 
;; Commande:  ATT_MUL 
;; par GC (Anciennement MULATT) 
;; Pour ajouter/soustraire une valeur NUMERIQUE 
;; a un Attribut NUMERIQUE SIMPLE sur un Bloc SIMPLE 
;; 

(defun c:ATT_MUL (/ att lst tag nam add ss n)
(if (and
(setq att (car (nentsel "\nSelectionnez UN Attribut a modifier: ")))
(setq lst (entget att))
(= (cdr (assoc 0 lst)) "ATTRIB")
(numberp (read (cdr (assoc 1 lst))))
(setq tag (cdr (assoc 2 lst)))
(setq nam (cdr (assoc 2 (entget (cdr (assoc 330 lst))))))
)
(if (and
(setq add (getreal "\nEntrez la valeur a multiplier ou diviser : "))
(princ "\nSelectionnez les Blocs a modifier ")
(setq ss (ssget (list '(0 . "INSERT") (cons 2 nam))))
(setq n 0)
)
(while (setq blc (ssname ss n))
(setq att (entnext blc)
lst (entget att)
)
(while (= (cdr (assoc 0 lst)) "ATTRIB")
(if (and (= (cdr (assoc 2 lst)) tag)
(numberp (setq val (read (cdr (assoc 1 lst)))))
)
(progn
;; (entmod (subst (cons 1 (rtos (+ val add)))
  (entmod (subst (cons 1 (rtos (* val add)))
(assoc 1 lst)
lst
)
)
(entupd blc)
)
)
(setq att (entnext att)
lst (entget att)
)
)
(setq n (1+ n))
)
)
(princ "\nL Objet selectionne n'est pas un attribut ! ")
)
(princ)
)  

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

LeCrabe je peux te proposer ceci si tu veux :

;; 
;; Commande:  ATT_ADD 
;; par GC (Anciennement ADDATT) 
;; Pour ajouter/soustraire une valeur numerique SIMPLE 
;; a un Attribut SIMPLE sur un Bloc SIMPLE 
;; Modifiée le 15/10/2020 - Luna
;; -> Ajout de la prise en compte de blocs dynamiques et modification de l'application des fonctions
;; -> Utilisation des fonctions (setpropertyvalue) et (getpropertyvalue) apparues depuis 2014 (?)

(defun c:ATT_ADD (/ Get-att-list att lst tag blc name add ss n val txt)

(defun Get-att-list (ename / Att Att_List)

	(setq Att_List (mapcar '(lambda (att) (cons (vla-get-tagstring att) (vla-get-textstring att))) (vlax-invoke (vlax-ename->vla-object ename) 'getattributes)))
	
)

(if (and
	(setq att (car (nentsel "\nSelectionnez UN Attribut a modifier: ")))
	(setq lst (entget att))
	(= (cdr (assoc 0 lst)) "ATTRIB")
	(numberp (read (cdr (assoc 1 lst))))	;; Uniquement si le nombre correspond au premier caractère de l'attribut !
	(setq tag (cdr (assoc 2 lst)))
	(setq blc (entget (cdr (assoc 330 lst))))
	(setq name (getpropertyvalue (cdr (assoc -1 blc)) "BlockTableRecord/Name"))
	(princ "\nSelectionnez les Blocs a modifier ")
	(if (setq ss (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")))))
		(repeat (setq n (sslength ss))
			(if (and
				(wcmatch (getpropertyvalue (ssname ss (setq n (1- n))) "ClassName") "AcDbAssociative*Array")
				(/= (getpropertyvalue (ssname ss n) "BlockTableRecord/Name") name)
			    )
				(ssdel (ssname ss n) ss)
				(sssetfirst nil ss)
			)
		)
		(princ "\nAucun jeu de sélection valide...")
	)
	(setq add (getreal "\nEntrez la valeur a ajouter ou soustraire : "))
    )
	(while (setq blc (ssname ss n))
		(if (and
			(assoc tag (setq att-list (get-att-list blc)))
			(numberp (read (setq val (getpropertyvalue blc tag))))
			(cond
				((or (= (type (read val)) 'REAL) (= (type add) 'REAL))
					(setq txt (rtos (+ (read val) add)))
				)
				((and (= (type (read val)) 'INT) (= (type add) 'INT))
					(setq txt (itoa (+ (read val) add)))
				)
			)
		    )
			(setpropertyvalue blc tag (strcat txt (vl-string-left-trim "0123456789." val)))
		)
		(setq n (1+ n))
	)
	(princ "\nL Objet selectionne n'est pas un attribut ! ")
)
(princ)

)

j'ai modifié l'écriture pour éviter une boucle (while) que je n'estime pas être en trop (sumimasen O grand (gile)-sensei !), pour modifier les attributs en passant par (getpropertyvalue) et (setpropertyvalue) donc à vérifier selon les versions d'AutoCAD (je n'ai plus la date de parution de ces fonctions en tête), les blocs dynamiques sont pris en compte et les réseaux sont éjectés et désormais cela permet de modifier des attributs qui ne sont pas uniquement composés de nombres.

En clair, je me suis basé sur la fonction (read) qui renvoie un nombre si ce nombre est en début de chaîne, donc si j'ai un attribut ayant pour valeur "78.28 m²" contrairement à la commande précédente, elle renvoie "79.78 m²" (au lieu de "79.78" et donc perte des unités ou textes informatifs associés). Cependant, si l'attribut possède la valeur "N°101", au même titre qu'avant, l'addition ne pourra s'effectuer..

 

Tu as également la possibilité de pré-sélectionner les objets avant le lancement de la commande et tu pourras voir la sélection après filtrage.

 

Bisous, Luna

Modifié par Luna
Lien vers le commentaire
Partager sur d’autres sites

Hello Luna

 

1) MERCI !

 

2) Si je me souviens bien !?

(getpropertyvalue) et (setpropertyvalue) sont apparues avec la version 2012

Et plus specialement en fait pour la version MacIntosh (et Windows aussi)

 

3)

Tu as ecrit >>> j'ai modifié l'écriture pour éviter une boucle (while) que j'estime être en trop

MAIS est ce que tu es bien CONSCIENTE que tu critiques une routine de notre DIEU VIVANT : Gilles CHANTEAU !!!

 

MERCI Gilles et Luna !!

 

LA SANTE, Bye, lecrabe ... Retraite J15 ...

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je vous remercie « lecrabe » et « Luna » pour votre aide :D .

Avec mon bloc cela ne fonctionne pas, j'ai ce message ci-dessous avec les deux versions du lisp ATT_ADD :

« L Objet selectionne n'est pas un attribut ! » ?!?

 

Je joins le fichier avec mes blocs qui ne fonctionnent pas « No4c_detecteur » et des nouveaux que j'ai créés avec qui le lisp ATT_ADD fonctionne ???????

J'aimerais bien savoir pourquoi cela ne fonctionne pas, je les ai refait plusieurs fois et toujours le même message ???

 

Merci d'avance

Meilleures salutations

ATT_ADD.zip

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

J'ai remarqué ce défaut de la fonction (nentsel) qui n'arrive pas à sélectionner l'attribut lorsqu'une hachure SOLID se trouve juste derrière... Il faut donc parfaitement bien viser l'attribut (il y a un léger décalage vers la droite du curseur donc il ne faut pas le mettre parfaitement sur l'attribut mais légèrement sur la gauche de celui-ci)... J'ai essayé et chat a fonctionné après 3 essais.

 

Je peux te trouver une solution alternative sinon que j'ai faite pour un de mes programme. Je modifie le programme et je reviens vers toi. Sinon tu peux tenter de changer la hachure SOLID vers un autre motif plus sobre :3

 

Bisous, Luna

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Plus simple : avant d executer ATT_ADD, tu fais :

 

FILLMODE = 0

RG (Regen)

Ainsi TOUTES les Hachures et Aplats couleurs "disparaissent"

 

Execution de la routine ATT_ADD ...

 

FILLMODE = 1

RG (Regen)

Ainsi TOUTES les Hachures et Aplats couleurs "reviennent"

 

LA SANTE, Bye, lecrabe ... Retraite J16 ...

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je vous remercie pour votre aide à vous deux ;) , Gilles pour ses lisp et tout le forum au passage.

En effet, j’ai essayé le lisp mis à jour par Luna avec la petite solution du lecrabe, cela fonctionne impeccable :D . Le problème avec les hachures solides… je n’aurais jamais trouvé :o , bravo ! :D :D

 

Merci pour votre aide… vous êtes au top.

 

 

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

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é