Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 15/03/2024 dans toutes les zones

  1. Salut, Tu peux essayer le LISP ci-dessous, il traite toutes les définitions de bloc du dessin et remplace tous les textes et textes multilignes dans ces blocs par un attribut (Invite = "Attrib_n" étiquette = ATTRIB_n avec incrémentation par bloc au cas où il y ait plusieurs textes). (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (defun ReplaceTextByAttDef (blockDef / i objName attrib just) (setq i 0) (vlax-for obj blockDef (setq objName (vla-get-ObjectName obj)) (cond ((= objName "AcDbMText") (setq attrib (vla-AddAttribute blockdef (vla-get-Height obj) acAttributeModeMultipleLine (strcat "Attrib_" (itoa (setq i (1+ i))) ": ") (vla-get-InsertionPoint obj) (strcat "ATTRIB_" (itoa i)) (vla-get-TextString obj) ) ) (vla-put-Alignment attrib (+ (vla-get-AttachmentPoint obj) 5)) (vla-put-TextAlignmentPoint attrib (vla-get-InsertionPoint obj)) (vla-Delete obj) ) ((= objName "AcDbText") (setq attrib (vla-AddAttribute blockdef (vla-get-Height obj) 0 (strcat "Attrib_" (itoa (setq i (1+ i))) ": ") (vla-get-InsertionPoint obj) (strcat "ATTRIB_" (itoa i)) (vla-get-TextString obj) ) ) (if (/= (vla-get-Alignment obj) acAlignmentLeft) (progn (vla-put-Alignment attrib (vla-get-Alignment obj)) (vla-put-TextAlignmentPoint attrib (vla-get-TextAlignmentPoint obj) ) ) ) (vla-Delete obj) ) ) ) (command-s "_.ATTSYNC" "_Name" (vla-get-Name blockDef)) (princ) ) (defun c:Steven () (vlax-for blockDef *blocks* (if (and (= (vla-get-Islayout blockDef) :vlax-false) (= (vla-get-IsXRef blockDef) :vlax-false) ) (ReplaceTextByAttDef blockDef) ) ) (princ) )
    2 points
  2. Bonjour, Une autre solution : Filtrer les chaines "Fe :" avec la sélection rapide et de les placer dans un calque spécifique, puis avec un lisp ajouter la chaine "Fe : " à gauche des chaines numériques. J'ai réécrit mon programme pour qu'il filtre la sélection des textuels (calque et type d'objets TEXT ou MTEXT) et qu'il fasse la concaténation uniquement sur les valeurs numériques. Fabcad, Le Rennais Métropolitain. FD_prefixe_v003.lsp
    1 point
  3. Coucou, Désolée pour le délai, je n'ai pas pu trouver de temps libre plus tôt. J'ai testé sur ton DWG et cela semble être bon : (defun c:JVC_ASSOTXT (/ *error* foo e fuzz layer cmdecho jsel i name lst tmp err) ;; PARAMETRAGE UTILISATEUR !!! (setq layer "TOU_EU_ALTI_FE" ;; --> Calque défini pour le filtre de sélection (si plusieurs, séparer par une virgule sans espace!) e 0.952993 ;; --> Distance à prendre en compte entre les 2 textes à associer fuzz 1E-4 ;; --> Précision sur l'écart entre la distance à considérer pour associer les textes et la distance réelle entre 2 textes ) ;; FIN DU PARAMETRAGE UTILISATEUR !!! (defun *error* (msg) (setvar "CMDECHO" cmdecho) (princ msg) ) (defun foo (lst / name pt tmp ent) (if (and (setq name (car lst) pt (cdr (assoc 10 (entget name))) tmp (cdr lst) ) (not (while (not (equal (distance pt (cdr (assoc 10 (entget (car tmp))))) e fuzz)) (setq tmp (cdr tmp)) ) ) (setq ent (car tmp)) ) (progn (setq lst (cdr lst)) (setq lst (vl-remove ent lst)) (setq tmp (ssadd name)) (ssadd ent tmp) (command "TXT2MTXT" tmp "") (setq name (entlast)) (entmod (subst '(41 . 3) (assoc 41 (entget name)) (entget name))) lst ) name ) ) (sssetfirst) (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object))) (and (setq cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq err (ssadd)) (setq jsel (ssget "_X" (list '(0 . "TEXT") (cons 8 layer)))) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) lst (cons name lst) ) ) (not (while lst (if (not (listp (setq tmp (foo lst)))) (progn (ssadd tmp err) (setq lst (cdr lst)) ) (setq lst tmp) ) ) ) (sssetfirst nil err) (setvar "CMDECHO" cmdecho) (princ (strcat "\nUn total de " (itoa (sslength jsel)) " blocs ont été traités." (if (< 0 (sslength err)) (strcat "\n /!\\ " (itoa (sslength err)) "/" (itoa (sslength jsel)) " blocs ont échoués dans le traitement...") "" ) ) ) ) (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object))) (princ) ) Je n'ai pas émis l'hypothèse que tu puisses changer les paramètres au cours de la commande mais je les ai tout de même regroupé en début de programme pour modifier les calques (pour filtrer la sélection), la distance à considérer et la tolérance. En espérant que c'est OK pour toi 🙂 Bisous, Luna
    1 point
×
×
  • 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é