Aller au contenu

bloc avec texte sans attribut


Messages recommandés

Posté(e)

Bonjour à toutes et a tous,

 

J'aurais besoin de votre aide et de vos conseils car je cherche à réalisé un lisp (si possible en autolisp) qui me permettrait de changer un texte qui appartiendrait à un bloc sans attribut.

Le problème c'est qu'en parcourant des code DXF pour modifier la valeur de mon texte, je n'ai que le code INSERT et rien d'autre (normal puisque je n'ai pas de code 66).

Y a t il un moyen de rentré au coeur du bloc pour y modifier un texte en passant par un lisp ou est ce tout simplement pas possible?

 

Merci pour conseil :)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Bonjour,

 

Un petit éclaircissement serait nécessaire.

 

Si le texte fait partie intégrante du bloc, donc sa valeur est la même pour tout les blocs insérés et que tu veux changer sa valeur ponctuellement pour chaque insertion, ce n'est pas possible.

Il te faut reconstruire ton bloc avec un attribut: explose ou édite ce dernier, modifies les entités constituante (passer le texte en attribut) et reconstitues ton bloc en le sauvegardant sous le même nom pour le redéfinir.

 

Si la modification est globale tu fais la même démarche que ci-dessus, mais la tu change simplement la valeur du texte (sans convertir en attribut...)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci pour ta réponse,

 

Le problème c'est que j'ai une serie de folio dont je ne suis pas l'auteur et donc je n'ai pas l'historique des blocs qui ont été créér. Il faudrait que j'ouvre tout mes folios pour faire un balayage pour savoir s'ils sont constitués d'attribut, de texte, ou des deux pour pouvoir les modifier selon le principe que tu a decris.

Je pensais que puisque ces données étaient accessible via la commande rechercher/remplacer ou via un éditeur de texte avec le DXF, il y avait peut être une astuce par lisp pour y avoir acces sans passer par une redefinition du bloc.

Vivement qu'autodesk crée une ligne de commande rechercher/remplacer sans passer par une fenetre!

 

En tout cas je te remercie beaucoup pour le partage de ton savoir :)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Je pensais que puisque ces données étaient accessible via la commande rechercher/remplacer.

Vivement qu'autodesk crée une ligne de commande rechercher/remplacer sans passer par une fenetre!

 

Si tu ne veux pas passer par une fenêtre de dialogue, j'avais écrit ça à une certaine occasion:

(defun my_replace_text (new_string old_string / js n ename first_blk l_blk n_blk)
 (vl-load-com)
 (defun xplore (l / ent cnt msg)
   (setq ent (entget (cdr (assoc -2 l))) cnt 0)
   (cond
     ((eq (cdr (assoc 0 ent)) "INSERT")
       (mapcar 
         '(lambda (att)
           (string-subst att)
         )
         (vlax-invoke (vlax-ename->vla-object (cdar ent)) 'GetAttributes)
       )
       (while (setq ent (entnext (cdar ent)))
         (setq ent (entget ent))
         (if (eq (cdr (assoc 0 ent)) "INSERT")
           (progn
             (setq cnt (1+ cnt))
             (repeat cnt
               (mapcar 
                 '(lambda (att)
                   (string-subst att)
                 )
                 (vlax-invoke (vlax-ename->vla-object (cdar ent)) 'GetAttributes)
               )
             )
           )
         )
       )
     )
   )
 )
 (defun string-subst (nam_obj / value_string nbs tmp_nbs)
   (setq value_string (vlax-get nam_obj 'TextString) nbs 0)
   (while nbs
     (if (setq nbs (vl-string-search old_string value_string (setq tmp_nbs nbs)))
       (setq
         value_string (vl-string-subst new_string old_string value_string tmp_nbs)
         nbs (1+ nbs)
       )
     )
   )
   (vlax-put nam_obj 'TextString value_string)
 )
 (defun tabl_subst (obj / eRows eColumns R C val nbs tmp_nbs)
   (setq
     eRows (vla-get-rows obj)
     eColumns (vla-get-columns obj)
     R 0
   )
   (repeat eRows
     (setq C 0)
     (repeat eColumns
       (setq val (vla-GetText obj R C) nbs 0 tmp_nbs nil)
       (while nbs
         (if (setq nbs (vl-string-search old_string val (setq tmp_nbs nbs)))
           (setq
             val (vl-string-subst new_string old_string val tmp_nbs)
             nbs (1+ nbs)
           )
         )
       )
       (vla-SetText obj R C val)
       (setq C (+ C 1))
     )
     (setq R (+ R 1))
   )
 )
 (setq first_blk (tblnext "BLOCK" T))
 (cond
   (first_blk
     (setq l_blk (list first_blk))
     (while (setq n_blk (tblnext "BLOCK"))
       (setq l_blk (cons n_blk l_blk))
     )
     (foreach n l_blk
       (if (/= (logand (cdr (assoc 70 n)) 4) 4)
         (if (/= (logand (cdr (assoc 70 n)) 16) 16)
           (xplore n)
         )
       )
     )
   )
 )
 (setq js
   (ssget "_X"
     '(
       (-4 . "<OR")
         (0 . "*TEXT,MULTILEADER,ATTDEF,ACAD_TABLE")
         (-4 . "<AND")
           (0 . "INSERT") (66 . 1)
         (-4 . "AND>")
       (-4 . "OR>")
     )
   )
 )
 (cond
   (js
     (repeat (setq n (sslength js))
       (setq ename (vlax-ename->vla-object (ssname js (setq n (1- n)))))
       (cond
         ((vlax-property-available-p ename 'TextString)
           (string-subst ename)
         )
         ((vlax-property-available-p ename 'Rows)
           (tabl_subst ename)
         )
         (T
           (mapcar 
             '(lambda (att)
               (string-subst att)
             )
             (vlax-invoke ename 'GetAttributes)
           )
         )
       )
     )
   )
 )
 (prin1)
)

 

Usage en ligne de commande: ( my_replace_text "nouvelle_chaine" "ancienne_chaine")

 

Si ça ne convient pas, je t'invite à regarder sur les routines de Lee Mac

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Oulà...ça c'est du lisp :(rires forts):

Je teste ce lisp dès demain matin et je te tiens au courant!

 

En tout cas mille merci pour ton aide precieuse!

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Le lisp marche à merveille :D

Je pense l'incorporer en sous programme pour modifier une liste de terme pré-établie grace a la fonction foreach B)

Merci au crabe pour le lien qui fait mention de la longueur des caracteres :)

 

Pour ma part j'avais bien trouvé la commande "BLOCK?" (j'ai autocad 2012) pour repondre a mon problème mais il n'y a apparemment pas d'équivalent en lisp

 

Encore merci pour l'aide apportée et merci encore a tout ceux qui prennent sur leur temps nous aider ;)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é