Aller au contenu

manipulation de chaîne de caractères


hardaxe08

Messages recommandés

Bonjour à toi lispienne / lispien,

 

J'ai une chaîne de caractères qui contient une phrase. Ce que je fais c'est écrire sur autoCAD, avec la commande texte, la chaîne de caractères. De plus si cette chaîne contient plus de 42 caractères je la sépare en deux pour l'écrire sur deux lignes. Jusque là tout va bien.

 

MAIS ce que je voudrais c'est éviter de couper un mot en deux ! Eh oui si le 42ème caractère est au milieu d'un mot et ben mon programme ne se pose pas de question ( ilne peut pas en fait :D ) il coupe le mot en deux. J'en suis là :

 

(setq cpt 42)

(if (> (strlen element) cpt) ; si le contenu de element est supérieur à 42 caractères alors ...

(progn

(setq PART1 (substr element 1 cpt)) ;Part1 est égal aux 42 premiers caractères de element

(setq PART2 (substr element (+ cpt 1)));Part2 est égal aux caractères restant de element

(command "texte" displign1 "0" PART1); on écrit le contenu de PART1

(command "texte" displign2 "0" PART2);on écrit le contenu de PART2

)

(command "texte" pt4 "0" element); sinon on écrit le contenu de element

)

 

J'avais pensé à faire quelque chose comme : si le caractère 42 est différent de " " alors on décale vers la gauche jusqu’à trouver un espace. on compte le nombre de fois qu'on a bougé vers la gauche et on soustrait cette valeur à cpt). Le truc c'est que je n'arrive pas à décaler vers la gauche comme je veux.

 

Donc je viens vers vous pour m'aider à trouver une solution pour mon problème s'il vous plaît.

 

P.S. : J'aimerai autant que possible éviter d'avoir des réponses à base de fonctions vla- vlax- vl- car je ne maîtrise pas du tout et j'aimerai, si on me le demande, pouvoir expliquer à autrui ce que fait le programme plutôt que de dire "ah ça je ne sais pas j'ai vu ça sur internet".

 

Axel

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Je te propose un code dans le message suivant...

Je pense que ça fonctionne, j'ai fait deux/trois tests et ça a l'air de correspondre mais dis-moi si c'est bien le cas.

Je n'ai pas travaillé sur l'écriture du texte, juste la découpe des parties le cas échéant,

Écrire "part1" et part2" tu sais faire ?

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

(setq ch "mot1 mot2 mot3 mot4 mot5 mot5 mot7 mot8 mot9 mot10 mot11 mot12 mot13")
(setq part1 nil part2 nil)
(setq *const 42	  n *const)
(setq lon (strlen ch))
(if (> (strlen ch) *const)
 (progn
(setq part1 (substr ch 1 n))
(while (and (< n lon)(/= " " (substr part1 n 1)))
  (setq n (1+ n))
  (setq part1 (substr ch 1 n))
  (setq part2 (substr ch n (- (strlen ch ) *const)))
  )
)
 (setq part1 (substr ch 1 n))
 )
(while
 (and
(> (strlen part1) *const)
(= " " (substr part1 (strlen part1) 1))
)
 (setq part1 (substr part1 1 (- (strlen part1)1)))
 )
(if part2
 (while
(= " " (substr part2 1 1))
(setq part2 (substr part2 2 (strlen part2)))
)
 )

Lien vers le commentaire
Partager sur d’autres sites

P.S. : J'aimerai autant que possible éviter d'avoir des réponses à base de fonctions vla- vlax- vl- car je ne maîtrise pas du tout et j'aimerai, si on me le demande, pouvoir expliquer à autrui ce que fait le programme plutôt que de dire "ah ça je ne sais pas j'ai vu ça sur internet".

Je suis entièrement d'accord avec toi (faire ce qu'on sait, ainsi, on le maitrise), mais il y a certains truc qu'on ne peut éviter (mais ca peut être parfois "limitatif" de se "limiter" à cette "limite" (ouuuu, que de répétition...), il faut donc aller plus loin, parfois), et les vla, vlx, et autres fonctions "VLiSP" sont parfois plus facile à comprendre et à utiliser que les "old" fonctions...

 

Je le sais, car je suis comme toi, novice en LiSP et j'avais peur, comme toi, de cette forme de V-Lisp, mais à bien y regarder, certaines restent très "simple" d'accès, Fais un tour sur ce site : da-code, qui te prouvera que ces fonctions, qui paraissent compliquées d'un premier abord, sont en fait simples... Surtout que Maître didier te propose un code sans V-LiSP...

 

En plus, ce site est fait par celui qui te propose ce dit code... Je renomme Maître didier... ;)

 

Il m'a sauvé plusieurs fois (avec d'autres bien-sur) et je consulte son site plusieurs fois par semaine, ou jour (on ne va pas parler d'heure quand même)... ;)

 

Et si tu sais expliquer son code, le V-Lisp ne devrait pas te faire peur...

  • Upvote 1

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

une autre approche serait de transformer cette phrase en liste de mot, puis de recoller les mots un par un jusqu'à 42 caractères maxi.

Gilles propose des fonctions de manipulations de liste à la fin de son 1er message ICI

Il y a notamment cette fonction :


;; STR2LST
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur

;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
 	(str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

Même si tu ne comprends pas tout dans cette fonction, tu peux l'utiliser dans ton programme.

"Pas besoin de savoir concevoir et construire une voiture pour être un bon pilote", il faut juste savoir utiliser le plus intelligemment possible les meilleurs outils disponibles.

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Didier je te remercie pour ta réponse et le code que m'a proposé !

 

Au début j'ai copié-collé ton programme dans le mien et ça ne fonctionnait pas. Mais grâce à ton code j'ai compris le raisonnement et comment procéder pour décaler vers gauche jusqu’à avoir un espace. J'ai pu compléter le mien et ça fonctionne. Vraiment c'est cool ! Je te met les modifications que j'ai effectuées :

 

(setq cpt 42)

(if (> (strlen element) cpt) ; si le contneu de element est supérieur à 42 caracteres alors ...

(progn

(if (/= (substr element cpt 1) " ") ;si le "cptième" caractere est différent d'un espace alors ...

(progn

(while (/= (substr element cpt 1) " ") ; tant que le cptième caracteres est différent d'un espace alors ...

(setq cpt (- cpt 1)) ;cpt = cpt - 1 ; c'est le décalage à gauche !

)

(setq PART1 (substr element 1 cpt)) ;Part1 est égal aux cpt premiers caractéres de element

(setq PART2 (substr element (+ cpt 1)));Part2 est égal aux caracteres restant de element

(command "texte" displign1 "0" PART1); on écrit le contenu de PART1

(command "texte" displign2 "0" PART2); on écrit le contenu de PART2

)

)

)

(command "texte" pt4 "0" element); sinon on écrit le contenu de element

)

 

DenisHen merci de m'avoir donné le lien du site da-code ! C'est bien plus clair que l'aide sur AutoCAD.

 

 

Axel

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Mis à part que tu décales sur la gauche et moi sur la droite je ne vois pas de différences

Mais puisque tu en es content, soit !

 

Je pense que je vais me servir de ta question et de ma réponse pour faire une page d'exemple sur mon site

Merci de m'avoir fait réfléchir à autre chose que mon quotidien car je manque d'idées d'exemples.

 

Amicalement

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Ce qui me surprend ! Pourquoi écrire un code; en natif on peut faire cela sans difficulté?

 

On écrit sa phrase en mode texte multi-ligne (TEXTMULT), il gère très bien les retours de ligne sans couper les mots suivant la largeur définie (que l'on peut faire varier comme on veut avec les poignées par exemple)

 

Après si l'on veut des textes simples en plusieurs lignes, il suffit de décomposer ce dernier pour les obtenir.

 

La seule chose à faire attention est le style de police utilisé ET surtout à ne pas forcer celui-ci dans l'éditeur car lors de la décomposition le résultat risque d'être différent.

 

Ça me semble très souple comme utilisation...

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é