Aller au contenu

Transformation de Champ en Texte dans plusieurs présentation.


Akkroma

Messages recommandés

Bonjour , j'ai un souci avec des passages de plan dans un logiciel de contrôle.

image.thumb.png.74d9f140ea95bf06aa05d28b0183e04c.png

Actuellement j'utilise le champ Ctab dans les variable système pour l'indication du numéro de plan. 

mais le logiciel de contrôle ne reconnait pas le format.

du coup je cherche un moyen de transformée tous les champs en texte.

j'ai sur ce dossier 55 plans avec tous un cartouche ayant le même Nom de bloc .

le problème du Gate étant de revenir 1 a 1 sur les cartouche.

j'ai testé un lisp mais converti tous les champs du ctab en texte du premier champ trouvée "01"

Champ-texte .lsp

 avez vous une solution pour ce petit souci ?

 

PS : je ne maitrise pas les lisp ='( 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Le problème est lié au fait que ton champs CTAB correspond à la présentation active.

Le Lisp ne change pas de présentation, et encore moins quand on traite un dossier.

Je n'avais pas envisagé ce champs. 

Je pense pouvoir modifier le code afin de récupérer le nom de la présentation autrement si CTAB utilisé.

Par contre cela sera dans la soirée.

Lien vers le commentaire
Partager sur d’autres sites

Yop,

En attendant que je trouve une solution plus rapide voici celle qui change de présentation au fur et à mesure.

C'est long mais fait le travail. 

Attention, pas en choisissant un dossier, mais seulement dans un dessin ouvert.

;;;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)
        (vla-put-ActiveLayout acdc layout)
        (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))

Tu charge et tape f2t, et tu attend ...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai trouvé une solution plus rapide et qui fonctionne avec odbx permettant de traiter tout un dossier,

mais qui fonctionneras uniquement avec des dessins contenant ce cartouche.

Je n'ai pas réussi à écrire un code générique traitant la variable CTAB particulièrement.

La formule des champs est difficile à attraper dans les attributs. Je continu à chercher quand même, cela m'intéresse.

;;;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
;;;taper 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 layoutname / objname objlay lays dic ind atts lconst ctc ctr lver tag)
        (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
                    (setq tag (vla-get-TagString att))
                    (and (vl-catch-all-apply 'vla-item (list (vla-getextensiondictionary att) "ACAD_FIELD"))
                         (not (member tag lconst))
                         (setq ind (vla-get-textstring att))
                         (progn
                            (if (eq tag "NO") (setq ind layoutname))
                            (if (eq tag "REF_DSP")(setq ind (strcat (substr ind 1 (1+ (vl-string-position (ascii "_") ind nil T))) layoutname)))
                            (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 (vla-get-name layout))
        )
    )
    (princ)
);fin field2txt
;Commande pour dessin courant
(defun c:f2t (/ ac) (setvar 'ctab "Model") (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
     )
)

Taper f2t, pour le dessin courant, ou f2tindir pour traiter un dossier.

Lien vers le commentaire
Partager sur d’autres sites

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é