Annonces

Les forums de la communauté Autodesk ont un nouveau look. Pour en savoir plus sur ce qui a changé, consultez le tableau des annonces de la communauté.

lisp for set value attribute auto

lewis185
Advocate

lisp for set value attribute auto

lewis185
Advocate
Advocate

Bonjour,
Je souhaiterais créer un lisp permettant en un clic d'attribuer une valeur à un attribut spécifique d'un block précis.
Pour ceci mon lisp suivant fonctionne très bien:

(defun C:test ()
(command "-attedit" "y" "TBM_DISTR_FN" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1178" "")
(princ)
)

Là où je coince c'est lorsque je modifie mon lisp comme ceci:

(defun C:test ()
(command "-attedit" "y" "TBM_DISTR_F" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1178" "")
(command "-attedit" "y" "TBM_DISTR_FN" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1178" "")
(command "-attedit" "y" "TBM_DISTR_N" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1177" "")
(command "-attedit" "y" "TBM_DISTR_NF" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1177" "")
(princ)
)

Dans mes dwg, soit j'ai le block TBM_DISTR_F ou TBM_DISTR_FN ou TBM_DISTR_N ou TBM_DISTR_NF
Je n'en ai jamais deux différents dans un même dwg.

 

Je ne sais pas comment détecter les noms de mes blocks.
J'aimerais donc arriver à quelque chose comme ceci:

 

(defun C:test ()
;if block TBM_DISTR_F alors value = 1178
(command "-attedit" "y" "TBM_DISTR_F" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1178" "")
;if block TBM_DISTR_FN alors value = 1178
(command "-attedit" "y" "TBM_DISTR_FN" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1178" "")
;if block TBM_DISTR_N alors value = 1177
(command "-attedit" "y" "TBM_DISTR_N" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1177" "")
;if block TBM_DISTR_NF alors value = 1177
(command "-attedit" "y" "TBM_DISTR_NF" "AT_DISTR" "" "-999999,-999999" "999999,999999" "" "v" "r" "1177" "")
(princ)
)

Est ce que l'un d'entre-vous pourrait m'aider ?


D'avance merci,

 

Lewis185

0 J'aime
Répondre
Solutions acceptées (1)
578 Visites
10 Réponses
Replies (10)

patrick_35
Collaborator
Collaborator

Salut

 

Déjà, tu créés un jeu de sélection des blocs (code dxf 0), en filtrant les noms (code dxf 2) et ayant un/des attribut(s) (code dxf 66)

(setq js (ssget '((0 . "INSERT") (2 . "TBM_DISTR_F,TBM_DISTR_FN,TBM_DISTR_N,TBM_DISTR_NF") (66 . 1))))

 

Ensuite tu parcours ce jeu de sélection (boucle)

(setq boucle 0)
(while (setq bloc (ssname js boucle))
  (setq boucle (1+ boucle))
)

 

Dans la boucle, pour récupérer les codes dxf d'un élément choisis

(setq dxf (entget bloc))

 

Et ainsi connaitre son nom

(cdr (assoc 2 dxf))

 

@+

0 J'aime

lewis185
Advocate
Advocate

Merci de la prompte réponse.

Je débute à peine (10-15jours) dans les lisp, je dois t'avouer que ta réponse est du chinois pour moi.

Je ne comprends pas l'intéret d'une boucle dans une détection de bloc.
Je ne comprends pas non plus comment intégrer tes éléments dans mon début de lisp.

Je suis vraiment nul, je m'en excuse.

0 J'aime

patrick_35
Collaborator
Collaborator

L'intérêt d'une boucle est de pouvoir choisir plusieurs éléments et les traiter ensemble, quelque soit leurs noms.
Maintenant, si tu ne vois pas l'utilité, cela veut dire que tu choisis tes blocs un par un ?

 

Je n'ai pas donné de lisp tout prêt mais avec suffisament d'éléments afin de t'aider à comprendre.

 

@+

 

ps : on a tous commencé comme toi

0 J'aime

lewis185
Advocate
Advocate

En effet, j'étais parti à l'idée de détecter l'existance d'un des 4 blocs, puis de savoir duquel il s'agissait et d'exécuter les commandes par des if.

Je vais continuer à chercher de mon côté et essayer ta technique, si je n'y arrive pas, je reviendrai vers ce sujet.
Merci d'avance de tes réponses.

Cordialement,

Lewis185

0 J'aime

lewis185
Advocate
Advocate

Bonjour,
D'habitude j'arrive à me débrouiller quand on me donne les éléments comme tu l'as fait, mais là, j'y arrive vraiment pas.
Je n'arrive vraiment pas à comprendre la logique de la recherche de block en boucle, et je n'arrive pas à faire fonctionner au conditionnel "if".

Même en m'aidant de cet aide : autolisp_reference_guide.pdf


Te serait-il possible de me le coder ?

Merci d'avance si tu le fait, sinon pas grâve, je ferai sans.
Cordialement,

 

Lewis185

0 J'aime

patrick_35
Collaborator
Collaborator
Solution acceptée

Salut

 

(defun c:test(/ bloc boucle dxf js nom)
  (setq boucle 0)
  (if (setq js (ssget '((0 . "INSERT") (2 . "TBM_DISTR_F,TBM_DISTR_FN,TBM_DISTR_N,TBM_DISTR_NF") (66 . 1))))
    (while (setq bloc (ssname js boucle))
      (setq dxf (entget bloc)
	    nom (cdr (assoc 2 dxf))
      )
      (cond
	((= nom "TBM_DISTR_F")
	  (setpropertyvalue bloc "AT_DISTR" "1178")
	)
	((= nom "TBM_DISTR_FN")
	  (setpropertyvalue bloc "AT_DISTR" "1178")
	)
	((= nom "TBM_DISTR_N")
	  (setpropertyvalue bloc "AT_DISTR" "1177")
	)
	((= nom "TBM_DISTR_NF")
	  (setpropertyvalue bloc "AT_DISTR" "1177")
	)
      )
      (setq boucle (1+ boucle))
    )
  )
)

 

@+

0 J'aime

lewis185
Advocate
Advocate

Merci beaucoup 🙂

 

J'ai remarqué qu'avec ton lsp, il détecte bien de quel bloc il s'agit, toutefois il me demande de sélectionner les blocs en question.

Là où cela me pose problème c'est que j'ignore parfois où ils se situent tant dans le model que dans les layouts, y a t'il un moyen de ne pas devoir sélectionner les blocs (qu'il cherche tout seul dans tout le dwg) ?

Bien à toi,

Lewis185

0 J'aime

patrick_35
Collaborator
Collaborator

Soit on laisse le lisp tel quel et lors de la sélection, tu tapes directement au clavier tout (_all), ce qui laisse le choix.

Sinon, on ajoute "x" dans le jeu de sélection pour tout sélectionner sans rien demander à l'utilisateur.

 

(setq js (ssget "x" '((0 . "INSERT") (2 . "TBM_DISTR_F,TBM_DISTR_FN,TBM_DISTR_N,TBM_DISTR_NF") (66 . 1))))

 

@+

0 J'aime

lewis185
Advocate
Advocate

bah là c'est parfait, merci beaucoup 🙂

0 J'aime

lewis185
Advocate
Advocate

Bonjour/Bonsoir,

En partant sur la même base, j'ai adapté pour une autre utilisation, toutefois, je me heurte à un message d'erreur, que je n'arrive pas à comprendre :
; error: ADS request error

Quelqu'un pourrait-il m'aider à savoir ce que c'est ?

 

Merci d'avance,

Lewis185

0 J'aime