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 🙂 ?
Résolu ! Accéder à la solution.
Résolu par _gile. Accéder à la solution.
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
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)
)
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.