DECKER & CAD SOLUTIONS

 

Programmes Lisp -
Source du programme Ch_Attribut

 

(defun c:ch_attribut(/ ordre blocd etiquetted nouvelle ancienne filtre selection ptr nbrmod entite pripriete actuelle k a)

 (write-line "\nTéléchargé depuis le site Internet http://www.decker-cs.com")

 (write-line "Auteur : Christian Decker")

 ;

 (write-line "Changer la valeur d'un attribut.")

 ;

 (while              ;Attend la sélection d'une méthode.

  (and             

   (/= ordre "CHA")

   (/= ordre "SUB")

   (/= ordre "DWG")

   (/= ordre "PRE")

   (/= ordre "SUF")

  )

  (setq ordre(strcase(getstring "Méthode (CHAnger / SUBstituer / DWGname / PREfixe / SUFfixe) : ")))

  (if (> (strlen ordre) 3)             ;La chaîne contient au moins quatre caractères.

   (setq ordre(substr ordre 1 3))      ;Préserve uniquement les trois premiers caractères de la chaîne.

  )

 )

 (if

  (or

   (= ordre "CHA")

   (= ordre "PRE")

   (= ordre "DWG")

   (= ordre "SUF")

   (= ordre "SUB")

  )

  (progn

   (if (= ordre "CHA")                ;Saisie des données avec l'option Changer.

    (progn

     (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))

     (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1))) 

     (setq nouvelle(getstring "Nouvelle valeur : " 1))

    )

   )

   (if (= ordre "SUB")                ;Saisie des données avec l'option Substituer.

    (progn

     (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))

     (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))

     (setq ancienne "")

     (while (= ancienne "")              ;Attend une occurrence de texte non nulle.

      (setq ancienne(getstring "Ancienne chaîne de caractères : " 1))

      (if (= ancienne "")                   ;La chaîne est vide.

       (write-line "L'ancienne chaîne de caractères doit être non nulle.")

      )

     )

     (setq nouvelle(getstring "Nouvelle chaîne de caractères : " 1))

    )

   )

   (if (= ordre "DWG")                ;Saisie des données avec l'option Dwgname.

    (progn

     (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))

     (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))

    )

   )

   (if (= ordre "PRE")                ;Saisie des données avec l'option Préfixe.

    (progn

     (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))

     (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))

     (setq nouvelle(getstring "Préfixe : " 1))

    )

   )

   (if (= ordre "SUF")                ;Saisie des données avec l'option Suffixe.

    (progn

     (setq blocd(strcase(getstring "Nom du bloc contenant l'attribut à modifier : ")))

     (setq etiquetted(strcase(getstring "Etiquette de l'attribut à modifier : " 1)))

     (setq nouvelle(getstring "Suffixe : " 1))

    )

   )

   (if (/= (tblsearch "BLOCK" blocd) nil)  ;La définition du bloc recherché existe dans le dessin.

    (progn

     (setq filtre(list (cons '0 "INSERT") (cons '2 blocd)))

     (setq selection(ssget "X" filtre))       ;Crée un jeu de sélection.

     (if (/= selection nil)                   ;Au moins un bloc trouvé dans le dessin.

      (progn

       (setq ptr 0)

       (setq nbrmod 0)

       (while (< ptr (sslength selection))       ;Pour chaque bloc dans le jeu de sélection...

        (setq entite(entnext(ssname selection ptr)))  ;Extraction du bloc.

        (while (and (/= entite nil) (/= (cdr(assoc '0 (entget entite))) "SEQEND"))   ;Pour chaque attribut du bloc...

         (setq propriete(entget entite))                 ;Extraction des propriétés de l'attribut.

         (if (= (cdr(assoc '2 propriete)) etiquetted)    ;L'attribut doit être modifié.

          (progn                                                  

           (if (= ordre "CHA")                              ;Option Changer.

            (progn

             (setq propriete(subst(cons '1 nouvelle) (assoc '1 propriete) propriete))

             (entmod propriete)

             (entupd entite)

             (setq nbrmod(+ nbrmod 1))

            )

           )

           (if (= ordre "SUB")                              ;Option Substituer.

            (progn

             (setq actuelle(cdr(assoc '1 propriete)))          ;Extrait la valeur de l'attribut.

             (setq k 1)                                        ;Positionne le pointeur sur le 1er caractère de la valeur de l'attribut.

             (setq a 0)                                        ;Sera égal à 1 si l'attribut est modifié.

             (while (and (<= k (strlen actuelle)) (>= (- (strlen actuelle) (- k 1)) (strlen ancienne)))

              ;

              ;Tant que k est inférieure ou égale à la longueur de la chaîne actuelle, et tant que

              ;(la longueur de la chaîne actuelle - (la position du pointeur - 1)) est égale ou

              ;supérieure à la longueur de l'occurrence du texte à rechercher.

              ;

              (if (= (substr actuelle k (strlen ancienne)) ancienne)

               (progn

                ;       

                ;Le pointeur est sur le 1er caractère de l'occurrence du texte recherché.

                ;

                ;Remplace l'occurrence de texte par la nouvelle valeur :

                ;1) Récupère les caractères situés en amont du pointeur.

                ;2) Ajoute la nouvelle valeur.

                ;3) Récupère les caractères situés en aval de l'occurrence de texte.

                ;

                (setq actuelle

                 (strcat

                  (substr actuelle 1 (- k 1))

                  nouvelle

                  (substr actuelle (+ k (strlen ancienne)) (- (strlen actuelle) (+ (- k 1) (strlen ancienne))))

                 )

                )

                ;Ajuste la position du pointeur sur le dernier caractère de la nouvelle valeur insérée.

                (setq k(+ (- k 1) (strlen nouvelle)))  

                (setq a 1)           ;La valeur de l'attribut est modifiée.

               )

              )

              (setq k(+ k 1))     ;Incrémente l'index du pointeur.

             )

             (if (= a 1)

              (progn

               (setq propriete(subst(cons '1 actuelle) (assoc '1 propriete) propriete))

               (entmod propriete)

               (entupd entite)

               (setq nbrmod(+ nbrmod 1))

              )

             )

            )

           )

           (if (= ordre "DWG")                              ;Option Dwgname.

            (progn

             (setq propriete(subst(cons '1 (getvar "DWGNAME")) (assoc '1 propriete) propriete))

             (entmod propriete)

             (entupd entite)

             (setq nbrmod(+ nbrmod 1))

            )

           )

           (if (= ordre "PRE")                              ;Option Préfixe.

            (progn

             (setq propriete(subst(cons '1 (strcat nouvelle (cdr(assoc '1 propriete)))) (assoc '1 propriete) propriete))

             (entmod propriete)

             (entupd entite)

             (setq nbrmod(+ nbrmod 1))

            )

           )

           (if (= ordre "SUF")                              ;Option Suffixe.

            (progn

             (setq propriete(subst(cons '1 (strcat (cdr(assoc '1 propriete)) nouvelle)) (assoc '1 propriete) propriete))

             (entmod propriete)

             (entupd entite)

             (setq nbrmod(+ nbrmod 1))

            )

           )

          )

         )   

         (setq entite(entnext entite))      ;Sélectionne l'attribut suivant du bloc.

        )

        (setq ptr(+ ptr 1))              ;Incrémente l'index du jeu de sélection des blocs.

       )

       (write-line (strcat "Nombre de blocs trouvés : " (itoa (sslength selection))))

       (write-line (strcat "Nombre d'attributs modifiés : " (itoa nbrmod)))

       (princ)

      )

     )

    )

   )

  )

 )

)

 

Fermer la fenêtre 


© Copyright 2004 [DECKER CAD SOLUTIONS] Tous droits réservés.