(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 ----------
;
)
)
)