Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

AUTOCAD - Convertir noms blocs en texte (lisp)

5 RÉPONSES 5
RÉSOLU
Répondre
Message 1 sur 6
SET040
287 Visites, 5 Réponses

AUTOCAD - Convertir noms blocs en texte (lisp)

Bonjour à tous,

 

Je voudrais à partir d'une sélection de blocs à l'écran, extraire leurs noms, les concaténer et réinsérer le résultat sous forme de texte au niveau du premier bloc.

 

Comme ma demande n'est pas simple à comprendre, je joins un .dwg pour que cela soit plus clair.

 

Il s'agit une demande particulière d'un client qui ne souhaite plus voir des panneaux de signalisation empilés mais synthétisé en un seul avec leurs codes repris au format texte.

 

J'ai trouver un début de réponse avec ce lisp sur le forum anglais :

 

(defun C:blockn()

(setvar "cmdecho" 0)

(setq pt(cadr(entsel"\nSelect Block:")))

(setq e1(ssget pt))

(setq e2 (entget (ssname e1 0)))

(setq blname (cdr(assoc 2 e2)))

(setq pt1 (getpoint"\nSelect point for block title:"))

(command "texte" pt1 "" 0 blname)

)

 

 

Mais cela n'affiche que pour un seul bloc, j'ai bien l'impression que cela représente un vrai défi en terme de programmation.

 

Si quelqu'un aurait une piste à me proposer 🙂  ?

 

 

5 RÉPONSES 5
Message 2 sur 6
Y.AUBRY
en réponse à: SET040

Bonjour @SET040 ,

 

Peux-tu nous transmettre le fichier dwg dont tu nous parles dans ton premier post stp afin de pouvoir voir le travail attendu?

 

A+ Yoan

Yoan AUBRY

EESignature

Message 3 sur 6
SET040
en réponse à: Y.AUBRY

Oups, j'étais certain d'avoir attaché le .dwg 

 

C'est fait 😉

Message 4 sur 6
Y.AUBRY
en réponse à: SET040

Re,

 

Tes blocs seront toujours orientés comme dans l'exemple (pas de rotation, la première référence de bloc se trouve en bas, la dernière en haut?)

 

(Je ne suis pas assez doué en lisp pour faire ta demande mais je te pose en amont les questions qui seront nécessaires pour la réalisation de celui-ci)

 

Mais en combinant ton code avec celui-ci (en faisant un tri par rapport au position en Y des blocs) c'est réalisable

(defun c:blocknames ( / ss)
 (if (setq ss (ssget (list(cons 0 "INSERT"))))
   (mapcar '(lambda (x) (vla-get-name (vlax-ename->vla-object x))) (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
 ))

 

A+ Yoan

Yoan AUBRY

EESignature

Message 5 sur 6
_gile
en réponse à: SET040

Salut,

 

Quelque chose comme ça ?

(defun c:BLOCKN	(/ ss i str)
  (if
    (and
      (setq ss (ssget '((0 . "insert"))))
      (setq pt (getpoint "\nPoint d'insertion: "))
    )
     (progn
       (setq str "")
       (repeat (setq i (sslength ss))
	 (setq str (strcat str
			   (getpropertyvalue
			     (ssname ss (setq i (1- i)))
			     "BlockTableRecord/Name"
			   )
			   "-"
		   )
	 )
       )
       (command-s "_TEXT"
		  pt
		  0.25
		  0.0
		  (vl-string-right-trim "-" str)
		  ""
		  ""
       )
     )
  )
  (princ)
)

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 6 sur 6
SET040
en réponse à: _gile

 

Merci @_gile c'est quasiment ça ! Il faudrait juste qu'au moment du clic, mes 3 panneaux soit remplacés par le panneau standard "T365" dans mon .dwg (en plus du texte donc).

 

Ces panneaux ne sont pas toujours orienté à la verticale comme dans mon exemple par contre (le texte par contre peut rester à l'horizontale)

 

Si tu n'a pas le temps, je tenterai de bidouiller le code moi-même mais au moins j'ai une excellente base.

 

Merci d'avoir essayé @Y.AUBRY, ma demande n'était pas si simple effectivement. Quoique qu'avec @_gile tout semble si simple c'est parfois frustrant 😅

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report