Aller au contenu

attribut vers attribut


Messages recommandés

Posté(e)

Bonjour

Je cherche à faire une routinette qui recopie la valeur d'un attribut du bloc A, vers un attribut du bloc B.

J'en suis là:

(defun c:ata (/ Ent att num)
 (setq	att
	(nentsel
  	"\nDépart Sélectionner un texte ou un attribut "
	)
num (atof (cdr (assoc 1 (entget (car att)))))
 )
 (print num)
 (while
(setq Ent (nentsel "\nSélectionner un attribut de bloc: ")
  att (cdr (assoc 2 (entget (car Ent))))

)
	(print att) 
 )
)

 

Donc, j'ai compris comment récupérer la valeur de l'entrée, je récupère le nom de l'attribut à modifier, mais comment récupérer le handle du bloc sur le quel je doit faire la modification. A moins qu'il y ai un moyen plus simple... (je comptais utiliser une routine qui change la valeur d'un attribut de bloc avec pour entrée: le handle du bloc, le nom de l'attribut, et la nouvelle valleur)

merci

 

 

Posté(e)

Salut x_all, perso, je ferais un truc dans ce genre :

;;; *********************************************
;;; Transpose la valeur d'un attribut d'un bloc  
;;; sur un autre bloc (pour x_all de CadXP.com)   
;;; *********************************************
(defun c:Att2Att (/ ObjA Att ObjB)
 (setq ObjA (car (entsel "\nSélectionner le premier bloc :")))
 (setq Att (getpropertyvalue ObjA "NomAttributBlkA"))
 (setq ObjB (car (entsel "\nSélectionnez le second bloc : ")))
 (vl-catch-all-apply 'setpropertyvalue (list ObjB "NomAttributBlkB" Att))
) ;_ Fin de defun

Un grand merci au passage à Maitre (gile) pour getpropertyvalue et setpropertyvalue...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Hello

Un grand merci au passage à Maitre (gile) pour getpropertyvalue et setpropertyvalue

Si je me souviens bien, ces 2 fonctions n'existent que depuis la version 2012 !?

 

LA SANTE, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Salut lecrabe, effectivement, ce ne sont pas des "vieilles" commandes...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

merci à vous...je vais tester, mais je passais par 'nentsel' car il y a plusieurs attributs dans chaque bloc..

Dans ce cas, tu peut augmenter les attributs :

;;; *********************************************
;;; Transpose la valeur d'un attribut d'un bloc  
;;; sur un autre bloc (pour x_all de CadXP.com)  
;;; *********************************************
(defun c:Att2Att (/ ObjA Att ObjB)
 (setq ObjA (car (entsel "\nSélectionner le premier bloc :")))
 (setq AttA (getpropertyvalue ObjA "NomAttributA_BlkA"))
 (setq AttB (getpropertyvalue ObjA "NomAttributB_BlkA"))
 (setq AttC (getpropertyvalue ObjA "NomAttributC_BlkA"))
 (setq Att... (getpropertyvalue ObjA "NomAttribut..._BlkA"))
 (setq ObjB (car (entsel "\nSélectionnez le second bloc : ")))
 (vl-catch-all-apply 'setpropertyvalue (list ObjB "NomAttributA_BlkB" AttA))
 (vl-catch-all-apply 'setpropertyvalue (list ObjB "NomAttributB_BlkB" AttB))
 (vl-catch-all-apply 'setpropertyvalue (list ObjB "NomAttributC_BlkB" AttC))
 (vl-catch-all-apply 'setpropertyvalue (list ObjB "NomAttribut..._BlkB" Att...))
) ;_ Fin de defun

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

harf... tu ne veux pas du nentsel mais c'est plus compliqué que ça... le bloc A à N attribut avec des nom quelconque, et le bloc B à pas forcément N attributs...

en fait j'ai besoin de cette fonction soit pour mes bouches de ventil qui changent tous les 4 matins de débit (2 att dans le bloc) et je voudrai recompiler la valeur dans les blocs de calcul de ma fonction pour les diamètres de réseaux. ( 5 attributs de mémoire). mais je voulais une fonction généraliste (et qui supporte les textes simple en entrée) car je fait aussi des VRD ou j'ai des fils d'eau à reporter dans des blocs à partir d'étiquettes Covadis, ma copine de l'élec est aussi intéressée pour changer des valeurs de ref de luminaire

Un peu pour ça que je prend la valeur une fois puis je partait sur un While pour la mise à jour...

Donc j'en reviens à ma question, comment trouver le bloc auquel appartient l'attribut sélectionné dans le While... le DXF 1 donne un handle, mais c'est celui de l'attribut pas celui du bloc...

ça va sans doute m'occuper le WE si j'arrive à monter l'armoire Ikéa que ma femme à acheter hier...

 

Posté(e)

Très sommairement, devrait fonctionner avec des TEXT, MTEXT et ATTRIB imbriqué ou non.

(defun c:ata ( / n_ent dxf_ent val_txt)
(setq n_ent nil)
(while (not n_ent)
	(setq n_ent (nentsel "\nChoix d'un texte source imbriqué : "))
	(cond
		(n_ent
			(if (not (member (cdr (assoc 0 (setq dxf_ent (entget (car n_ent))))) '("MTEXT" "TEXT" "ATTRIB")))
				(setq n_ent nil dxf_ent nil)
			)
		)
	)
)
(setq val_txt (cdr (assoc 1 dxf_ent)) n_ent nil)
(while (not n_ent)
	(setq n_ent (nentsel "\nChoix d'un texte cible imbriqué : "))
	(cond
		(n_ent
			(if (not (member (cdr (assoc 0 (setq dxf_ent (entget (car n_ent))))) '("MTEXT" "TEXT" "ATTRIB")))
				(setq n_ent nil dxf_ent nil)
			)
		)
	)
)
(entmod (subst (cons 1 val_txt) (assoc 1 dxf_ent) dxf_ent))
(entupd (cdar dxf_ent))
(prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

ha yes ! ça, ça sent meilleur... je teste à la maison..(je m’échappe avant qu'on m'en rajoute une couche j'en ai plein le fion de ces mails de 16h55 le vendredi les archi attaquent à 10h mais ferment à 19... moi c'est plutôt 7h 17...)

 

Encore un coup avec member... j'arrive pas à l'assimiler celle là... ce sera peut être l’occasion de comprendre...

merci beaucoup...

 

Posté(e)

Salut à vous.

 

Je n'avais pas réellement compris ta demande, effectivement, mon code ne te satisfait pas, et je comprend maintenant pourquoi.

 

En gros, tu voudrais cliquer une valeur afficher de l'attribut d'un bloc, et l’insuffler comme valeur d'un autre attribut dans un autre bloc...

 

Comme, je clique l'attribut "altitude" d'un bloc et le l'intègre dans l'attribut "Z" d'un autre bloc... J'ai bon ? Si c'est ça, je suis curieux d'avoir la réponse, car elle m'intéresse beaucoup...

 

Avec toutes les aides que j'ai eu sur CadXP, je devrait pouvoir le faire... D’ailleurs, j’essaierai dès lundi matin... Si la solution n'a pas été trouvée d'ici là...

 

Mais d'après ce que j'ai lu du code du grand bonuscad (et ce que j'en comprend), il devrait faire ce que tu demande...

 

Mais je dois pouvoir "improviser" un bout de code parmi tous ceux que les aimables membres de CadXP m'ont distillé depuis toutes ces années...

 

Force et Tendresse à tous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Coucou

 

il est fort possible que me fourvoie, toutefois je viens répondre car ça me semble simple, sans doute trop.

Je clique un attribut quelconque d'un bloc quelconque, je sais trouver sa valeur

Je clique un attribut quelconque d'un autre bloc quelconque, je sais lui donner la valeur que je viens de trouver à la ligne précédente.

 

C'est bien ça qu'il faut faire?

 

(setq att1 (car (nentsel))) (setq att2 (car (nentsel)))
(setq att3 (subst
		(assoc 1 (entget att1))
		(assoc 1 (entget att2))
		(entget att2)
 	)
 	)
(entmod att3)
(entupd att2)

ce code est ultra-simpliste, c'est pour montrer que ça marche, ensuite il faudra des contrôles si on reste dans ce principe...

 

Amicalement

Posté(e)

et bien, ça marche pile poil comme je voulais.je n'ai pas eu de temps pour y bosse ce wiki, mais je vais regarder ça de plus près mais apparemment le 'member' n'y est pour rien...je voulais juste me compliquer le tête en retrouvant le bloc alors que je pouvais faire mon entmod directement sur l’attribut...et effectivement le code à Didier marche aussi très bien, je vais bricoler tout ça pour l'adapter à ma boucle histoire de ne prendre la valeur qu'une fois pour la propager sur plusieurs bloc mais je devrai m'en sortir sans pb

merci beaucoup pour ces pistes, ça va me faire gagner du temps...

 

 

 

Posté(e)

Salut,

 

Tu n'es pas pas loin du résultat avec ton 1er code :

Tu as compris comment extraire une donnée d'un attribut et quel code DXF utiliser pour obtenir la valeur de l'attribut.Tu utilises un atof pour convertir le texte en nomblre réel, ça ne sert pas à grand chose puisque tu veux copier un texte donc une chaine de caractères.Pour trouver l'attribut 'de destination' le nentsel est bon, il ne te reste plus qu'à utiliser les fonctions entmod et subst pour remplacer le texte, comme le montre les codes de bonuscad et didier.

(defun c:ata (/ att num ent ent_list)
 (setq
	att (nentsel "\nDépart Sélectionner un texte ou un attribut : ")
	num (cdr (assoc 1 (entget (car att))))
)
 (while (setq Ent (nentsel "\nSélectionner un attribut de bloc : "))
	(setq ent_list (entget (car ent)))
	(entmod (subst (cons 1 num) (assoc 1 ent_list) ent_list))
	
)
(princ)
)

 

 

 

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

Posté(e)
Encore un coup avec member... j'arrive pas à l'assimiler celle là... ce sera peut être l’occasion de comprendre...

Il me sert juste de contrôle de sélection dans le code.

Je récupère en fait le type d'entité sélectionné et si ce type est MEMBRE de la liste définie (member) cela me renvoie vrai (True/T) et je continu le code autrement cela boucle sur la sélection car je déclare n_ent à nil.

 

Une façon sûre de pouvoir récupérer le code DXF 1 (contenant la valeur du texte) propre au texte multi-texte ou attribut et d'appliquer le (entmod) comme le fait didier, sauf qu'avec le code sommaire de didier si tu fait une mauvaise sélection -> nil ou erreur

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Coucou

Je comprends tout à fait tes propos et ça confirme les miens à propos du code ultra-simpliste que j'ai proposé

C'était juste pour vérifier le fonctionnement par rapport aux explications de la demande.

Il faut en effet vérifier - entre autres - si l'entité sélectionnée est bien un attribut de bloc, idem pour la destination, aussi : se préserver des sélections dans le vide par erreur sans arrêter le programme

On peut aussi, j'ai commencé en test, dessiner un cercle temporaire sur le bloc de départ et des lignes qui relient l'attribut de départ et celui de destination pour "visualiser" les travail en cours, on peut ...

 

En général je commence comme ça avec un code méga-simpliste, ce n'est qu'ensuite, une fois que le code fonctionne que je passe aux contrôles obligatoires mais cette partie est assez aisée et souvent la même à chaque fois.

 

Amicalement

Posté(e)

Oui didier, on s'est bien compris.

 

Je ne dénigre pas ton code qui est le corps essentiel du programme.

J'ai fais exactement la même chose que toi.

J'explique simplement le rôle de (member) dans le code à x_all qui avait l'air de penser qu'il était essentiel pour obtenir ce qu'il désirait.

Donc pour lui faire comprendre je l'ai comparer à ton code, j'aurais aussi bien pu citer Matt666 qui n'applique pas non plus de contrôle de sélection.

 

je passe aux contrôles obligatoires mais cette partie est assez aisée

 

A demi-d'accord, car des fois ce n'est pas aussi aisé que ça et les contrôles peuvent alourdir considérablement le code si l'on veut une fonction robuste.

Le débutant ne sais pas forcement comment procéder pour mettre en place ces contrôles.

 

En résumé:

Ta démarche est pédagogique

La mienne est de partager une fonction qui sera utilisable par n'importe qui dans un environnement quelconque (version, langue...), enfin j'essaye... je suis pas parfait.

 

Voilà tout le monde trouvera son compte dans les 2 démarches suivant son degré d'expérience.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Coucou

Les contrôles sont un souci dans le souci, dans l'ordre des choses il apparaît en deuxième

Même si très peu de temps se passe entre l'écriture de la fonction,

En français dans le texte : est-ce je sais traiter mes attributs de cette façon

Et une fois que ça fonctionne, tout de suite, on passe aux contrôles.

 

Effectivement mon côté pédagogique est plus d'apprendre aux gens à pécher que de leur donner du poisson

C'est MA façon je ne me mets pas en avant pour autant, par exemple sur mon site je dépose des "images" du code

Ceux qui veulent se coltiner avec le clavier et apprendre vont taper le code et découvrir l'importance de la rigueur

Ceux qui se croient au-dessus ils peuvent toujours copier-coller mais le jour où ils auront faim ils regretteront de ne pas savoir pécher.

 

Toutefois je comprends très bien ta position et je lis avec attention tes messages et tes solutions.

 

Amicalement

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é