Aller au contenu

supprimer les champs dynamique dans les attributs


kitto

Messages recommandés

Bonjour,

J'ai un bloc dynamique avec un attribut qui a un champs dynamique. Ce bloc est un carré que l'on peut agrandi en longueur et aussi en largeur.

Quand on régénère le dessin, le texte qui accompagne ce bloc se mette à jour et donne les longueurs et largeurs du carré.

j'aurai besoin supprimer les champs dynamique en gardant le texte telle qu'elle.

j'ai mis le bloc en question en pièce jointe.

Est-ce qu'il y aurai un lisp ou une commande autocad  pour pouvoir supprimer le champs dynamique et garder le texte telle qu'elle

en vous remerciant d'avance pour vos réponses.

carre.dwg

Lien vers le commentaire
Partager sur d’autres sites

Coucou,
Une autre solution serait de sélectionner le champ et de faire un clic droit > Convertir le champ en texte.
Cependant si le but est de modifier un ensemble de références de bloc, cela peut prendre un peu de temps car il te faut utiliser la commande ATTEDIT donc un par un.
Comme le suggère @lili2006, la commande BURST pourrait correspondre à ton besoin (seulement si tu acceptes de décomposer tes références de blocs), mais si tu veux uniquement convertir la valeur du champ dynamique sous forme de texte en conservant ton bloc alors il faudrait trouver autre chose.
Petite question : Si tu dois conserver ta référence de bloc intacte, quel est l'intérêt de convertir ton champ dynamique sous forme de texte exactement ? Est-ce parce que les valeurs du champs ne correspondent pas aux valeurs devant être affichées ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Il y a 6 heures, lili2006 a dit :

Bonjour à toutes et tous,

Burst des Express Tools ?

bonsoir,  merci pour l'info , car je ne connaissais pas la commande Burst sur autocad, ça fonctionne mais mon problème c'est que le bloc que j'ai réellement à plusieurs attribut avec des champs dynamique. du coup quand j'utilise la commande Burst , elle me fait apparaitre tout les textes des autres attributs

Lien vers le commentaire
Partager sur d’autres sites

Il y a 6 heures, lecrabe a dit :

Hello

 

As tu essaye  TXT2MTXT ?

Bye, lecrabe

 

bonsoir, j'avais déjà essayé cette commande , mais elle ne fonctionne que sur les champs dynamique qui ne sont pas dans des blocs 

Lien vers le commentaire
Partager sur d’autres sites

Il y a 6 heures, Luna a dit :

Coucou,
Une autre solution serait de sélectionner le champ et de faire un clic droit > Convertir le champ en texte.
Cependant si le but est de modifier un ensemble de références de bloc, cela peut prendre un peu de temps car il te faut utiliser la commande ATTEDIT donc un par un.
Comme le suggère @lili2006, la commande BURST pourrait correspondre à ton besoin (seulement si tu acceptes de décomposer tes références de blocs), mais si tu veux uniquement convertir la valeur du champ dynamique sous forme de texte en conservant ton bloc alors il faudrait trouver autre chose.
Petite question : Si tu dois conserver ta référence de bloc intacte, quel est l'intérêt de convertir ton champ dynamique sous forme de texte exactement ? Est-ce parce que les valeurs du champs ne correspondent pas aux valeurs devant être affichées ?

Bisous,
Luna

Bonsoir, 

en fait, le bloc que j'ai transmis était juste un exemple, comme je dessine des plans de bâtiments , j'ai crée plusieurs blocs dynamiques avec attributs personnels et que je ne voudrais pas transmettre à me clients. Du coup si je dois convertir tout les attribut en texte un à un , cela va me prendre un temps fou même si j'utilise la commande ATTEDIT. Par contre la commande BURST fait apparaitre tout les textes des attributs il faudrait que j'efface tout les autres textes. j'ai joint un autre bloc dynamique avec plusieurs attribut. 

je me demande s'il n'existe pas un lisp qui pourrait m'aider

niveau brut - fini - NGF.dwg

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'avoue que je ne comprend pas l'intérêt de la démarche. Hormis générer de la perte d'information et perdre en praticité ...

Pour faire ce que tu demande, je passerais par du ATTOUT / ATTIN, et entre les deux, je viderais dans mon dessin les attributs des blocs (par sélection similaire).

Pas besoin de faire de LISP pour ça

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

il y a 35 minutes, Vincent P. a dit :

Pour faire ce que tu demande, je passerais par du ATTOUT / ATTIN, et entre les deux, je viderais dans mon dessin les attributs des blocs (par sélection similaire).

Ça ne serait pas suffisant. Si @kitto veut priver ses clients des formules de champ, il faut aussi supprimer ces formules dans les définitions de bloc.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, j'avais pas vue que c'était des champs appliqué dans la définition des blocs.

ça ajoute une étape.

 

Encore plus simple, envoyer des plans papier, on y perd toute notion de champs au moins.

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Il y a 22 heures, (gile) a dit :

Salut,

Pour résumer, tu voudrais que quelqu'un te fournisse gracieusement un programme LISP relativement complexe parce que tu ne veux pas partager quelques formules de champ dynamique.

Bonsoir Gile,

Je ne demandes surtout pas que l'on me fasse un programme LISP à ma place , mais juste savoir si cela existait déjà ou pas . après je ne suis pas contre de partager mes formules ou même mes blocs dynamiques sur ce forum. 

 

Pour information, j'ai déjà réalisé une formation LISP au Greta de LYON, mais j'en suis encore qu'au début de mon apprentissage.

Lien vers le commentaire
Partager sur d’autres sites

Il y a 9 heures, Vincent P. a dit :

Effectivement, j'avais pas vue que c'était des champs appliqué dans la définition des blocs.

ça ajoute une étape.

 

Encore plus simple, envoyer des plans papier, on y perd toute notion de champs au moins.

Bonsoir Vincent,

Alors pour information, je suis dessinateur projeteur en bâtiment indépendant, je réalise des plans de coffrage et d'armatures en sous-traitance pour des bureaux d'études structures.

Bien sur quand je termines un plan, je l'envois en format PDF au bureau d'étude (pour qui je travailles) . Mais quand je termine la réalisations de toutes les plans , je dois envoyer toutes les fichiers PDF et aussi les fichiers DWG.

Et comme j'ai passé énormément de temps pour dessiner (et à créer les blocs dynamiques) de toutes mes fichiers pour la réalisations des plans d'armatures, cela m'ennuierai de les donner à un bureau d'études qui pourrait s'en servir à sa guise.

Comme on m'a appris qu'un dessin valait mieux qu'un long discours, j'ai mis en pièce jointe un fichier d'armature pour des semelles filants (fondations) que j'ai réalisé. c'est bloc dynamique qui permet de me calculer le nombre barres pour une longueur linaire, et me donne en plus sont poids . 

C'est pour cela que je me suis demandé s'il existait une commande autocad ou un lisp pour supprimer toutes les formules et les champes dynamiques des blocs.

bloc dynamique - armature semelles filantes.dwg

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Pour supprimer les dynamismes (à faire en premier)

; Chargement des fonctions VLA/Activex.
(vl-load-com)
;;;Supprime le dynamisme des blocs
(defun c:ddn (/ nom)
    (vlax-for blk (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
        (vlax-for obj blk
            (if  (and (= (vla-get-ObjectName obj) "AcDbBlockReference")(= (vla-get-IsDynamicBlock obj) :vlax-true))
                (progn
                  (setq nom (strcat(vla-get-effectivename obj)"_ND"))
                  (vla-ConvertToAnonymousBlock obj)
                  (vla-converttostaticblock obj nom)
                )
            )
        )
    )
    (princ)
)

Pour supprimer les champs

;;;field2txt Conversion des champs en textes
;;;Supprime les champs et les remplace par leurs valeurs
;;;acdc, (vla-get-activedocument (vlax-get-acad-object)) ou ObjectDBX
;;;tapper f2t pour traiter le dessin courant ou f2tindir pour traiter un dossier
;;;Converti les Textes, Mtextes, repères, repères multiples, cotations, Attributs et tableaux
;;;dans chaques présentations et les blocks
(defun field2txt ( acdc / delfield getconstantatt)
    (defun delfield (ob / objname objlay lays dic ind atts lconst ctc ctr lver)
        (setq objname (vla-get-objectname ob) 
              objlay (vla-get-layer ob) 
              lays (vla-get-layers acdc)
        )
        (and (= (vla-get-freeze (vla-item lays objlay)) :vlax-false)
             (= (vla-get-lock (vla-item lays objlay)) :vlax-false)
             ;(not (member objlay '("0" "EXCLU")));option d'exclusion de calques
            (progn
            (and (wcmatch objname "*Text,AcDbMLeader");Texte, Mtextes, repères et repères multiples
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) 
                 (setq ind (vla-get-textstring ob))
                 (progn
                    (vla-put-textstring ob " ")
                    (vla-put-textstring ob ind)
                 )
            )
            (and (wcmatch objname "*Dimension");Cotations
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) 
                 (setq ind (vla-get-textoverride ob))
                 (progn
                    (vla-put-textoverride ob " ")
                    (vla-put-textoverride ob ind)
                 )
            )
            (and (eq objname "AcDbBlockReference");Attributs
                 (setq atts (vlax-invoke ob 'GetAttributes) lconst (getconstantatt ob))
                 (foreach att atts
                    (and (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary att) "ACAD_FIELD"))
                         (not (member (vla-get-TagString att) lconst))
                         (setq ind (vla-get-textstring att))
                         (progn
                            (vla-put-textstring att " ")
                            (vla-put-textstring att ind)
                         )
                     )
                 )
            )
            (and (eq objname "AcDbTable");Tableaux
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD"))
                 (setq ctr 0 ctc 0 )
                 (while (< ctr (vla-get-rows ob)) 
                    (while (< ctc (vla-get-columns ob))
                        (and (/= (vla-GetCellState ob ctr ctc) 1)
                             (/= (vla-GetCellState ob ctr ctc) 17)
                             (setq ind (vlax-invoke ob 'getcellvalue ctr ctc))
                             (progn
                                (vlax-invoke ob 'setcellvalue ctr ctc " ")
                                (vlax-invoke ob 'setcellvalue ctr ctc ind)
                             )
                        )
                        (setq ctc (1+ ctc))
                    )
                    (setq ctc 0 ctr (1+ ctr))
                 )
            )
          )
        )
    );fin delfield
    
    ;;;getconstantatt
    ;;;bl, vla objet (block) 
    ;;;Retourne la liste des étiquettes des attributs constants
    (defun getconstantatt ( bl / lc)
        (setq lc '())
        (vlax-for bls  (vla-get-blocks acdc)
            (if (eq (vlax-get bls 'Name)(vlax-get bl 'Name))
                (vlax-for obj bls
                    (and (= (vla-get-ObjectName obj) "AcDbAttributeDefinition")
                         (= (vla-get-Constant obj) :vlax-true)
                         (setq lc (cons (vla-get-TagString obj) lc))
                    )
                )
            )
        )
        lc 
    ) 
    
    ;Définitions de blocks
    (vlax-for bl  (vla-get-blocks acdc)
        (and (= (vla-get-islayout bl) :vlax-false)
             (= (vla-get-IsXRef bl) :vlax-false)
             (= (vla-get-IsDynamicBlock bl) :vlax-false)
             (not (wcmatch (vla-get-name bl) "`*T*"))
             (vlax-for obj  bl 
                    (delfield obj)
             )
        )
    )
    ;Chaque présentations
    (vlax-for layout  (vlax-get-property acdc 'layouts)
        (vlax-for obj  (vlax-get-property layout 'block)
                (delfield obj)
        )
    )
    (princ)
);fin field2txt
;Commande pour dessin courant
(defun c:f2t (/ ac) (field2txt (setq ac (vla-get-activedocument (vlax-get-acad-object)))) (vla-Regen ac acAllViewports)(princ))
;Commande pour dossier (non récursif)
(defun c:f2tindir ( / dir lf axdbdoc) 
    (and (setq dir (getdir))
         (setq lf (vl-directory-files dir "*.dwg" 1))
         (foreach f lf
            (if (setq axdbdoc (getaxdbdoc (strcat dir f)))
                (field2txt axdbdoc)
            )
            (vla-saveas axdbdoc (strcat dir f))
            (vlax-release-object axdbdoc)
         )
    )
    (princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getdir( / shell rep)
     (setq shell (vlax-create-object "Shell.Application")
            rep (vlax-invoke shell 'browseforfolder 0 "Sélectionnez le dossier" 512 "")
     )
     (vlax-release-object shell)
     (strcat (vlax-get-property (vlax-get-property rep 'self) 'path) "\\")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getaxdbdoc (filename / axdbdoc release)
     (setq axdbdoc
        (vlax-create-object
          (if (< (setq release (atoi (getvar "ACADVER"))) 16)
            "ObjectDBX.AxDbDocument"
            (strcat "ObjectDBX.AxDbDocument." (itoa release))
          )
        )
     )
     (if (vl-catch-all-apply 'vla-open (list axdbdoc filename))
       (not (vlax-release-object axdbdoc))
       axdbdoc
     )
)

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...
Le 07/03/2024 à 10:49, Fraid a dit :

Bonjour,

Pour supprimer les dynamismes (à faire en premier)

;;;Supprime le dynamisme des blocs
(defun c:ddn (/ nom)
    (vlax-for blk (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
        (vlax-for obj blk
            (if  (and (= (vla-get-ObjectName obj) "AcDbBlockReference")(= (vla-get-IsDynamicBlock obj) :vlax-true))
                (progn
                  (setq nom (strcat(vla-get-effectivename obj)"_ND"))
                  (vla-ConvertToAnonymousBlock obj)
                  (vla-converttostaticblock obj nom)
                )
            )
        )
    )
    (princ)
)

Pour supprimer les champs

;;;field2txt Conversion des champs en textes
;;;Supprime les champs et les remplace par leurs valeurs
;;;acdc, (vla-get-activedocument (vlax-get-acad-object)) ou ObjectDBX
;;;tapper f2t pour traiter le dessin courant ou f2tindir pour traiter un dossier
;;;Converti les Textes, Mtextes, repères, repères multiples, cotations, Attributs et tableaux
;;;dans chaques présentations et les blocks
(defun field2txt ( acdc / delfield getconstantatt)
    (defun delfield (ob / objname objlay lays dic ind atts lconst ctc ctr lver)
        (setq objname (vla-get-objectname ob) 
              objlay (vla-get-layer ob) 
              lays (vla-get-layers acdc)
        )
        (and (= (vla-get-freeze (vla-item lays objlay)) :vlax-false)
             (= (vla-get-lock (vla-item lays objlay)) :vlax-false)
             ;(not (member objlay '("0" "EXCLU")));option d'exclusion de calques
            (progn
            (and (wcmatch objname "*Text,AcDbMLeader");Texte, Mtextes, repères et repères multiples
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) 
                 (setq ind (vla-get-textstring ob))
                 (progn
                    (vla-put-textstring ob " ")
                    (vla-put-textstring ob ind)
                 )
            )
            (and (wcmatch objname "*Dimension");Cotations
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD")) 
                 (setq ind (vla-get-textoverride ob))
                 (progn
                    (vla-put-textoverride ob " ")
                    (vla-put-textoverride ob ind)
                 )
            )
            (and (eq objname "AcDbBlockReference");Attributs
                 (setq atts (vlax-invoke ob 'GetAttributes) lconst (getconstantatt ob))
                 (foreach att atts
                    (and (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary att) "ACAD_FIELD"))
                         (not (member (vla-get-TagString att) lconst))
                         (setq ind (vla-get-textstring att))
                         (progn
                            (vla-put-textstring att " ")
                            (vla-put-textstring att ind)
                         )
                     )
                 )
            )
            (and (eq objname "AcDbTable");Tableaux
                 (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary ob) "ACAD_FIELD"))
                 (setq ctr 0 ctc 0 )
                 (while (< ctr (vla-get-rows ob)) 
                    (while (< ctc (vla-get-columns ob))
                        (and (/= (vla-GetCellState ob ctr ctc) 1)
                             (/= (vla-GetCellState ob ctr ctc) 17)
                             (setq ind (vlax-invoke ob 'getcellvalue ctr ctc))
                             (progn
                                (vlax-invoke ob 'setcellvalue ctr ctc " ")
                                (vlax-invoke ob 'setcellvalue ctr ctc ind)
                             )
                        )
                        (setq ctc (1+ ctc))
                    )
                    (setq ctc 0 ctr (1+ ctr))
                 )
            )
          )
        )
    );fin delfield
    
    ;;;getconstantatt
    ;;;bl, vla objet (block) 
    ;;;Retourne la liste des étiquettes des attributs constants
    (defun getconstantatt ( bl / lc)
        (setq lc '())
        (vlax-for bls  (vla-get-blocks acdc)
            (if (eq (vlax-get bls 'Name)(vlax-get bl 'Name))
                (vlax-for obj bls
                    (and (= (vla-get-ObjectName obj) "AcDbAttributeDefinition")
                         (= (vla-get-Constant obj) :vlax-true)
                         (setq lc (cons (vla-get-TagString obj) lc))
                    )
                )
            )
        )
        lc 
    ) 
    
    ;Définitions de blocks
    (vlax-for bl  (vla-get-blocks acdc)
        (and (= (vla-get-islayout bl) :vlax-false)
             (= (vla-get-IsXRef bl) :vlax-false)
             (= (vla-get-IsDynamicBlock bl) :vlax-false)
             (not (wcmatch (vla-get-name bl) "`*T*"))
             (vlax-for obj  bl 
                    (delfield obj)
             )
        )
    )
    ;Chaque présentations
    (vlax-for layout  (vlax-get-property acdc 'layouts)
        (vlax-for obj  (vlax-get-property layout 'block)
                (delfield obj)
        )
    )
    (princ)
);fin field2txt
;Commande pour dessin courant
(defun c:f2t (/ ac) (field2txt (setq ac (vla-get-activedocument (vlax-get-acad-object)))) (vla-Regen ac acAllViewports)(princ))
;Commande pour dossier (non récursif)
(defun c:f2tindir ( / dir lf axdbdoc) 
    (and (setq dir (getdir))
         (setq lf (vl-directory-files dir "*.dwg" 1))
         (foreach f lf
            (if (setq axdbdoc (getaxdbdoc (strcat dir f)))
                (field2txt axdbdoc)
            )
            (vla-saveas axdbdoc (strcat dir f))
            (vlax-release-object axdbdoc)
         )
    )
    (princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getdir( / shell rep)
     (setq shell (vlax-create-object "Shell.Application")
            rep (vlax-invoke shell 'browseforfolder 0 "Sélectionnez le dossier" 512 "")
     )
     (vlax-release-object shell)
     (strcat (vlax-get-property (vlax-get-property rep 'self) 'path) "\\")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getaxdbdoc (filename / axdbdoc release)
     (setq axdbdoc
        (vlax-create-object
          (if (< (setq release (atoi (getvar "ACADVER"))) 16)
            "ObjectDBX.AxDbDocument"
            (strcat "ObjectDBX.AxDbDocument." (itoa release))
          )
        )
     )
     (if (vl-catch-all-apply 'vla-open (list axdbdoc filename))
       (not (vlax-release-object axdbdoc))
       axdbdoc
     )
)

 

 

 

Bonjour,

tout d'abord merci pour Les deux programmes lisp. 

pourriez-vous me dire s'il a une procédure à suivre ?

car quand je lance le 1 er lisp (defun c:ddn (/ nom)  autocad me mets "erreur: Erreur Automation clé dupliquée"

et pour le 2eme lisp autocad me mets Commande inconnue "FIELD2TXT

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai rajouté, le chargement des fonctions VLA/Activex.
(vl-load-com)

si cdd ne fonctionne toujours pas, donne moi un exemple de bloc, car avec les bloc dynamique que j'ai sous la main, cela fonctionne.

Pour la deuxième routine, c'est f2t qu'il faut taper dans Autocad.

C'est indiqué en clair dans le code.

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é