DECKER & CAD SOLUTIONS

 

Programmes Lisp -
Source du programme Du_TextesFichier

 

(defun c:Du_textesfichier(/ fichier modsel c1 c2 jeu entite index sens ligneav ligneap identificateur propriete valeur position nbrtextes f positionactu ptr1 ptr2 a indexinvalide indexposition)

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

 (write-line "Auteur : Christian Decker")

 ;

 ;----------- SAISIE UTILISATEUR ----------

 ;

 (write-line "Dupliquer une colonne de textes dans un fichier.")

 ;

 (setq fichier(getstring "Fichier à renseigner : "))

 (setq jeu(ssget))

 (if (= jeu nil)

  (progn

   (write-line "Aucun objet sélectionné.")

   (princ)

  )

 )

 (while              ;Prend les paramètres, même sans objet sélectionné, pour utilisation

  (and               ;avec un générateur de script (évite le plantage du script).

   (/= sens "H")

   (/= sens "V")

  )

  (setq sens(strcase(getstring "Sens de lecture (Horizontal / Vertical) : ")))

  (if (> (strlen sens) 0)              ;La chaîne contient au moins un caractère.

   (setq sens(substr sens 1 1))        ;Préserve uniquement le premier caractère de la chaîne.

  )

 )

 (while

  (and

   (/= ligneav "O")

   (/= ligneav "N")

  )

  (setq ligneav(strcase(getstring "Générer une ligne vide dans le fichier avant écriture (Oui / Non) : ")))

  (if (> (strlen ligneav) 0)              ;La chaîne contient au moins un caractère.

   (setq ligneav(substr ligneav 1 1))     ;Préserve uniquement le premier caractère de la chaîne.

  )

 )

 (while

  (and

   (/= ligneap "O")

   (/= ligneap "N")

  )

  (setq ligneap(strcase(getstring "Générer une ligne vide dans le fichier après écriture (Oui / Non) : ")))

  (if (> (strlen ligneap) 0)              ;La chaîne contient au moins un caractère.

   (setq ligneap(substr ligneap 1 1))     ;Préserve uniquement le premier caractère de la chaîne.

  )

 )

 (while

  (and

   (/= identificateur "O")

   (/= identificateur "N")

  )

  (setq identificateur(strcase(getstring "Ajouter une colonne pour l'identification des données (Oui / Non) : ")))

  (if (> (strlen identificateur) 0)                     ;La chaîne contient au moins un caractère.

   (setq identificateur(substr identificateur 1 1))     ;Préserve uniquement le premier caractère de la chaîne.

  )

 )

 (if (= identificateur "O")

  (setq identificateur(getstring t "Identificateur : " ))

  (setq identificateur nil)

 )

 ;

 ;----------- FIN SAISIE UTILISATEUR ----------

 ;

 ;

 ;----- SELECTION DES TEXTES ET MISE EN LISTE DES POSITIONS ET DES VALEURS -----

 ;

 (if (/= jeu nil)

  (progn

   (setq index 0)

   (setq nbrtextes 0)

   (repeat (sslength jeu)                                          ;Scrute le jeu de sélection.

    (setq entite(ssname jeu index))

    (if (= (cdr(assoc '0(entget entite))) "TEXT")                     ;L'entité est un texte.

     (progn

      (setq propriete(entget entite))

      (setq valeur(cons (cdr(assoc '1 propriete)) valeur))               ;Ajoute la valeur dans la liste "valeur".

      (if (= sens "H")

       (setq position(cons (car(cdr(assoc '10 propriete))) position))       ;Ajoute X dans la liste "position" dans le sens horizontal.

       (setq position(cons (car(cdr(cdr(assoc '10 propriete)))) position))  ;Ajoute Y dans la liste "position" dans le sens vertical.

      )

      (setq nbrtextes(+ nbrtextes 1))                                    ;Compte le nombre de textes sélectionnés.

     )

    )

    (setq index(+ index 1))                                           ;Cible la prochaine entité dans le jeu de sélection.

   )

   (if (= nbrtextes 0)

    (progn

     (write-line "Aucun texte sélectionné.")

     (princ)

    )

   )

  )

 )

 ;

 ;--- FIN SELECTION DES TEXTES ET MISE EN LISTE DES POSITIONS ET DES VALEURS ---

 ;

 ;

 ;---------- ECRITURE DES VALEURS DANS LE FICHIER ----------

 ;

 (if (/= jeu nil)

  (progn

   (setq index 0)

   (setq f(open fichier "a"))            ;Crée le fichier s'il n'existe pas, ou, ajoute les données à la fin du fichier.

   (if (= ligneav "O")                   ;Adjonction d'une ligne vide avant écriture.

    (progn

     (princ (chr 13) f)

     (princ (chr 10) f)

    )

   )

   (repeat (length valeur)              ;Cherche les valeurs sélectionnées suivant l'ordre de tri demandé par l'utilisateur.

    ;

    ;---------- RECHERCHE LA PROCHAINE VALEUR A ECRIRE DANS LE FICHIER ----------

    ;

    (setq positionactu nil)                ;Cible la position la plus petite.

    (setq ptr1 0)                          ;Pointeur de la liste valeur.

    (repeat (length valeur)                ;Cherche la position (X ou Y) la moins élevée parmi les valeurs non sauvegardées.

     (setq ptr2 0)                            ;Pointeur de la liste "indexinvalide".

     (setq a 0)                               ;Initialisation de l'état de la recherche.

     (while

      (and

       (= a 0)

       (< ptr2 (length indexinvalide))

      )

      (if (= (nth ptr2 indexinvalide) ptr1)      ;La valeur stockée à l'index courant est déjà sauvegardée.

       (setq a 1)

      )

      (setq ptr2(+ ptr2 1))                   ;Incrémente l'index de la liste "indexinvalide".

     )

     (if (= a 0)                                              ;La valeur stockée à l'index courant n'est pas encore sauvegardée.

      (progn

       (if (= positionactu nil)                                  ;Première position valide (démarrage).

        (progn

         (setq positionactu(nth ptr1 position))

         (setq indexposition ptr1)

        )

        (progn                                                   ;Position valide à comparer avec la position actuelle.

         (if (= sens "H")

          (progn                                                    ;Sens horizontal demandé (de gauche à droite).

           (if (< (nth ptr1 position) positionactu)                    ;La nouvelle position valide est plus petite

            (progn                                                     ;que la position actuelle.

             (setq positionactu(nth ptr1 position))

             (setq indexposition ptr1)

            )

           )

          )

          (progn                                                    ;Sens vertical demandé (de haut en bas).

           (if (> (nth ptr1 position) positionactu)                    ;La nouvelle position valide est plus grande

            (progn                                                     ;que la position actuelle.

             (setq positionactu(nth ptr1 position))

             (setq indexposition ptr1)

            )

           )

          )

         )

        )

       )

      )

     )

     (setq ptr1(+ ptr1 1))

    )

    (setq indexinvalide(cons indexposition indexinvalide))          ;Sauvegarde l'index.

    ;                                                     

    ;---------- FIN RECHERCHE LA PROCHAINE VALEUR A ECRIRE DANS LE FICHIER ----------

    ;

    ;---------- ECRITURE DE LA VALEUR DANS LE FICHIER ----------

    ;

    (if (= identificateur nil)                            ;Ne pas ajouter l'identificateur de données.

     (princ (nth indexposition valeur) f)                    ;Ecriture de la valeur dans le fichier.

     (progn                                               ;Ajouter l'identificateur de données.

      (princ (nth indexposition valeur) f)                   ;Ecrit la valeur dans le fichier.

      (princ (chr 9) f)                                      ;Ajoute le séparateur de colonnes.

      (princ identificateur f)                               ;Ajoute l'identificateur de données.

     )

    )

    (princ (chr 13) f)

    (princ (chr 10) f)

    ;

    ;---------- FIN ECRITURE DE LA VALEUR DANS LE FICHIER ----------

    ;

   )

   (if (= ligneap "O")        ;Demande d'une ligne vide après écriture.

    (progn

     (princ (chr 13) f)

     (princ (chr 10) f)

    )

   )

   (close f)

   (princ)

   ;

   ;--------- FIN ECRITURE DES VALEURS DANS LE FICHIER ----------

   ;

  )   

 )

)

 

Fermer la fenêtre 


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