Aller au contenu

[Résolu] Commande pour remplir les attributs d'un bloc à l'aide des données d'un ancien bloc.


Jbrosteaux

Messages recommandés

Bonjour à tous,

 

Je vous explique mon problème si je peux dire cela...

Sur nos plans de bâtiments, nous avons un premier bloc attribut "XX" avec le nom et numéro du local, ensuite nous avons un 2ème bloc attribut "YY" avec l'aire et le périmètre.

 

Je me demande si il est possible une fois que j'aurai créer un nouveau bloc "A" tout en un ...Nom du local, numéros, aire et périmètre

De créer une commande qui une fois que je sélectionne l'ancien bloc "YY" ses données vont dans le nouveau Bloc "A" pour remplir les bon champs.

Ce qui m'éviterai de recopier tout manuellement... et éviter des erreurs de recopiage.

 

Merci pour votre aide!

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je pense que seul un LISP t'aidera.

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)

Lien vers le commentaire
Partager sur d’autres sites

Oulala... Je ne suis que novice en Lisp... Pour reprendre un lisp de Patrick_35, ou (gile) ou autre, il faut être d'un très, mais alors, d'un très haut niveau...

 

Si tu ne connais pas le lisp, ça va être difficile...

 

Donne-moi tes "anciens blocs" et le "nouveau bloc"(ou les noms des blocs et les noms exacts de leurs attributs), je vais voir ce que je pourrai faire...

 

Sans ne rien te promettre...

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)

Lien vers le commentaire
Partager sur d’autres sites

Tu peux placer un lien WeTransfer dans le forum, comme-ça, d'autres pourront peut-être te venir en aide.

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)

Lien vers le commentaire
Partager sur d’autres sites

Donc, si je comprend bien, il faut récupérer les infos dans le bloc Info20 pour les placer dans Nom_Local_GHdC ?

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)

Lien vers le commentaire
Partager sur d’autres sites

Ok, voici un petit lisp qui devrait faire ta manipulation...

 

Tu enregistre ce code dans un fichier "texte" (avec le blocnote par exemple) et avec l’extension .lsp.

 

Puis, tu charges ce fichier dans AutoCAD (avec _appload)... La commande est : ChangAttribBlk

 

Voici le code :

;;;*******************************************************
;;; Attribuer certains attributs d'un bloc dans un autre  
;;;*******************************************************
(defun c:ChangAttribBlk (/ ent_bloc ent_att att_etiq Aire Perim Nouv_bloc)
 (setq ent_bloc (car (entsel "\nSélectionnez l'ancien bloc : ")))
 (setq ent_att (entnext ent_bloc))
 (while (/= (cdr (assoc 0 (entget ent_att))) "SEQEND")
   ;; nom étiquette
   (setq att_etiq (cdr (assoc 2 (entget ent_att))))
   ;; valeur du contenu de l'attribut
   (cond ((= att_etiq "Aire") (setq Aire (cdr (assoc 1 (entget ent_att))))))
   (cond ((= att_etiq "Périmètre") (setq Perim (cdr (assoc 1 (entget ent_att))))))
   (setq ent_att (entnext ent_att))
 ) ;_ Fin de while
;;;
 (setq Nouv_bloc (entsel "\nSélectionnez le nouveau bloc : "))
 (setq Nouv_bloc (car Nouv_bloc))
 (vl-catch-all-apply 'setpropertyvalue (list Nouv_bloc "AIRE" Aire))
 (vl-catch-all-apply 'setpropertyvalue (list Nouv_bloc "PERIMETRE" Perim))
 (princ)
) ;_ Fin de defun

 

Tiens moi au courant du bon fonctionnement du code...

 

Denis...

 

EDIT : Oops, j'avais oublié de déclarer mes variables... J'allais au devant de représailles par nos maîtres...

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)

Lien vers le commentaire
Partager sur d’autres sites

De rien...

 

Note bien ton premier message avec l'entête "[Résolu]".

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)

Lien vers le commentaire
Partager sur d’autres sites

DenisH,

 

Je vois que tu utilises setpropertyvalue pour affecter les valeurs des attributs du nouveau bloc. C'est une bonne idée, c'est la méthode la plus simple.

Pourquoi n'utilises-tu pas getpropertyvalue pour récupérer celles des attributs de l'ancien bloc ?

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Parceque je ne connais pas cette commande...

 

En faisant un truc dans ce genre ? (l'aide est vraiment très "lignt"...)

(defun c:ChangAttribBlk (/ ent_bloc ent_att att_etiq Aire Perim Nouv_bloc)

 (setq ent_bloc (car (entsel "\nSélectionnez l'ancien bloc : ")))
 (vl-catch-all-apply 'getpropertyvalue (list ent_bloc "Aire" Aire))
 (vl-catch-all-apply 'getpropertyvalue (list ent_bloc "Périmètre" Perim))

 (setq Nouv_bloc (car (entsel "\nSélectionnez le nouveau bloc : ")))
 (vl-catch-all-apply 'setpropertyvalue (list Nouv_bloc "AIRE" Aire))
 (vl-catch-all-apply 'setpropertyvalue (list Nouv_bloc "PERIMETRE" Perim))
 (princ)
)

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)

Lien vers le commentaire
Partager sur d’autres sites

Tu n'as pas dû tester dans la console de l'éditeur Visual LISP...

 

getpropertyvalue ne prends que deux arguments (le ename de l'objet et le nom de la propriété) et retourne la valeur, que tu aurais dû affecter à une variable.

 

En oubliant vl-catch-all-apply (qu'on peut utiliser plus subtilement ou tout simplement éviter en testant la validité des entrées utilisateur) on peut simplement faire :

 

(setpropertyvalue nouv_bloc "AIRE" (getpropertyvalue ent_bloc "Aire"))

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

en réponse au message #11

 

tu as testé ? ça fonctionne ?

je n'ai pas bien le temps mais je pense qu'il est problématique de chercher une valeur d'étiquette désignée par des caractères en minuscule

et pire encore des caractères accentués.

 

je parle de "Périmètre" en ligne 10 où je pense que "PERIMETRE" serait bienvenu.

 

tu peux nous tenir au courant si ça fonctionne en l'état ? ou bien suis-je trop tatillon ?

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

didier,

 

getpropertyvalue est insensible à la casse pour les noms de propriété, mais pas à l'accentuation : il faut bien chercher "Périmètre" ou "PÉRIMÈTRE" et pas "perimetre" ou "PERIMETRE".

 

Avec la méthode "classique" : (= att_etiq "Périmètre"), on fait une comparaison de chaîne qui sera donc forcément sensible à la casse et à l'accentuation.

 

Ceci dit, je suis absolument d'accord pour bannir tout accent et autre caractère spécial dans les noms de calque, de blocs, etc. et utiliser des majuscules (non accentuées bien sûr) pour les étiquettes d'attribut.

 

 

PS: On va dans le bon sens puisque le nouveau bloc de Jbrosteaux respecte cette "norme".

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

tu as testé ? ça fonctionne ?

 

Oui, j'ai tester mon code sur mon poste, et ça fonctionne très bien. Ceci dit, j'émet toujours une réserve pour un bon fonctionnement sur un autre poste.

 

Et oui, certains attributs du bloc d'origine ont bien des caractères accentués.

 

Amicalement aussi. ;)

 

(gile) : je retaperais mon code demain avec que du VLisp... Merci encore du conseil.

 

Denis...

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)

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

du coup j'ai pris le temps de tester, je parle bien du message #11

le code ne fonctionne pas.

je change la casse et ça passe

 

ça passe ou ça casse, c'est le cas de le dire.

 

toutefois je te remercie (gile) de tes explications qui m'inspirent de plus en plus à utiliser les vl... dans la vie de tous les jours

(tout en continuant le C# mais dans la vie privée, doucement)

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Héllo.

 

didier : je ne comprend pas, ce code (#11) fonctionne parfaitement chez moi... Où as-tu changer la casse ?

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)

Lien vers le commentaire
Partager sur d’autres sites

Re. donc, la même routine qu'en message 11 mais en VLisp :

;;;*******************************************************
;;; Attribuer certains attributs d'un bloc dans un autre  
;;;*******************************************************
(defun c:ChangAttribBlk (/ Anc_bloc Nouv_bloc) ;(setq Anc_bloc (car (entsel "\nSélectionnez l'ancien bloc : ")))
 (setq Anc_bloc (car (entsel "\nSélectionnez l'ancien bloc : ")))
 (setq Nouv_bloc (car (entsel "\nSélectionnez le nouveau bloc : ")))
 (setpropertyvalue nouv_bloc "AIRE" (getpropertyvalue Anc_bloc "Aire"))
 (setpropertyvalue nouv_bloc "PERIMETRE" (getpropertyvalue Anc_bloc "Périmètre"))
 (princ)
) ;_ Fin de defun

 

Merci (gile), c'est vrai que c'est bien plus joli comme-ça...

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)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ces fonctions ne sont pas ce que l'on a coutume d'appeler fonctions vlisp ou Visual LISP.

Ce sont des alternatives aux fonctions Visual LISP arrivées avec AutoCAD MAC 2012 pour palier au fait que l'interface COM/ActiveX est spécifique à Windows (voir ici).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Re.

 

Merci (gile) pour cette précision.

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)

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é