SUBST

SUBST

Remplacer dans une liste
(list)

 

Cette fonction recherche un élément dans une liste (list) et renvoie une liste transformée après en avoir remplacé chaque occurrence de  l'item donné en premier argument par l'item donné en deuxième argument.

 

Syntaxe (subst nouvel-item ancien-item liste)
Arguments nouvel-item, un élément (atom) ou une liste (list)

ancien-item, un élément (atom) ou une liste (list)

liste, une chaîne de caractères (list)

Valeur renvoyée la liste (list) transformée si ancien-item a été trouvé

la liste (list) d'origine si ancien-item n'a pas été trouvé

 

Exemples :

Syntaxe Valeur renvoyée
1
2
(setq lst '( "un" "deux"))
(subst "un" "deux" lst)
("un" "deux") variable lst
("un" "un") nouvelle liste
 (subst '1 'a '(a b c))
(1 B C)
 (subst '1 'a '(abc))
(ABC)

Le dernier exemple ne fonctionne pas car (ABC) est considéré comme une liste complète et non une liste contenant une succession d'éléments.


Il est possible de changer un élément qui est lui-même une liste (list) incluse dans une autre liste (list)
Exemple :

1
(setq lst '(("A") ("B") ("C")))

le contenu de la variable "lst" est donc : (("A") ("B") ("C")) qui est une liste qui contient des listes.

1
(setq nouv-lst ((subst '("1") '("B") lst))

le contenu de la variable "nouv-lst" est dorénavant : (("A") ("1") ("C"))

 


(subst) est une fonction très utile pour changer des éléments dans une liste de définition d'entité, avec (assoc),(cons) et (entmod) on change une entité de calque (ou autre qualité) sans passer par la fonction (command).


Exemple :

1
2
3
4
(setq ent (car 
          (entsel"\nChoix d'une entité à changer de calque : \n")
          )
)

Initialisation de la variable "ent" en choisissant une entité à l'écran

(setq entlis (entget ent))

Création de la liste de définition de l'entité qui stocke une liste (list) composée de paires pointées (dotted pair) :
((-1 . <Nom d'entité: 7ffffb10be0>) (0 . "LINE") (330 . <Nom d'entité: 7ffffb039f0>) (5 . "AA6") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 2.32061 3.35743 0.0) (11 5.06458 6.37434 0.0) (210 0.0 0.0 1.0))

La ligne qui suit va changer l'entité de calque en cherchant dans "entlis" la paire pointée qui contient le nom du calque de l'entité ( 8 . "0"), si elle est dans le calque 0 (zéro),  puis remplace par une autre paire pointée ( 8 . "Nouveau Calque") et renvoie la liste transformée : (voir la zone en bleu) :

(setq entlis (subst (cons 8 "Nouveau Calque") (assoc 8 entlis) entlis))

La variable entlist contient désormais : ((-1 . <Nom d'entité: 7ffffb10be0>) (0 . "LINE") (330 . <Nom d'entité: 7ffffb039f0>) (5 . "AA6") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Nouveau Calque") (100 . "AcDbLine") (10 2.32061 3.35743 0.0) (11 5.06458 6.37434 0.0) (210 0.0 0.0 1.0))

(entmod entlis)

Pour terminer, on traite l'entité avec (entmod) et voilà ! l'entité est passée dans le calque choisi, c'est une bonne alternative au lancement de la fonction "command" en appelant la commande native d'AutoCAD CHPROP comme on le ferait dans l'interface graphique.

Sans compter l'énorme avantage suivant :

Si le calque "Nouveau Calque" n'existe pas au moment de lancer ces lignes de codes il va être AUTOMATIQUEMENT créé par AutoLISP.


il faut être prévenu de faire attention au fait que (subst) va modifier toutes les occurrences de ancien-item trouvées dans liste.

Exemple :
définition de la variable "lst" :

1
(setq lst '("A" "B" "C" "B" "C"))

le contenu de la variable "lst" est donc : ("A" "B" "C" "B" "C")

1
(setq nouv-lst (subst "1" "B" lst))

le contenu de la nouvelle variable "nouv-lst" est celui-ci : ("A" "1" "C" "1" "C")

 


Haut de page

retour au menu LISTES


3 décembre 2017,
mise à jour 18 avril 2018
complément le 25 octobre 2018