Aller au contenu

Petit problème avec les chaines de caractères


DenisHen

Messages recommandés

Bonjour à tous,

 

Voilà, j'ai fais un LiSP (avec l'aides des CadXPiens) qui fais un petit calcul en sélectionnant une profondeur (un TEXT) et alimente divers attribut d'un bloc sélectionné. Jusque là, tout va bien.

 

Mais maintenant, je traite un autre fichier qui n'est pas "construit" pareil, en effet, les Profondeurs (des entités TEXT) ne sont plus des nombres (ex: "1.20") mais des "string" (ex: "p1.20m") et parfois même, ils ont des espaces en fin de chaine (ex: "p1.20m ")...

 

Mais attention, je ne peut pas supprimer tous les espaces car j'ai aussi des textes qui sont des commentaires (ex: "Puisard aveugle"). Donc, je dois supprimer les espaces qui sont uniquement en fin de chaine...

 

Si quelqu'un a une astuce ou un bout de LiSP déjà fait, je suis preneur...

 

Voici un petit bout de code issu de mon LiSP :

  (if (/= (atof Prof) 0)
   (progn (princ "\nCalculs")
          (setq Prof (atof Prof))
          (setq ZProf (- ZTn Prof))
          (setq ZProf (rtos ZProf 2 2))
          (setq Prof (rtos Prof 2 2))
          (Modatt hd "PROFONDEUR" (strcat "F.E. :" Prof))
          (Modatt hd "Z-PROF" ZProf)
   ) ;_ Fin de progn
   (progn (princ "\nObservations") (Modatt hd "OBSERVATIONS" Prof))
 ) ;_ Fin de if

 

En gros :

1. Comment supprimer les espaces en fin de chaine,

2. Comment sortir le "nombre" si le permier caractère de la variable est un "p" et le dernier un "m"...

 

Denis...

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

Ouais, pour le 1, en VB ça donnerait un truc comme ça :

Do While left(Variable,1)=" "
 Variable = right(Variable,len(Variable)-1)
Loop

 

Et pour le 2 :

If Left(Variable,1)="p" and right(Variable,1)="m" then
 Variable=mid$(Variable,2,len(Variable)-2)
End if

 

Oui, je sais qu'on est dans le forum LISP, mais ce sont juste deux petits exemples pour aider à la compréhension de mon problème, car toutes mes macros sont en LiSP et j'aimerais continuer dans ce langage...

 

Mais je n'arrive à rien pour ce qui est de manipuler des chaines...

 

Denis...

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

Merci (gile), mais je ne trouve de l'aide qu'en anglais, et dans ton formidable "Introduction_a_AutoLISP.pdf", c'est juste survolé...

 

Enfin, j'ai fais çà :

  (while (= (substr Prof (- (strlen Prof) 1) 1) " ")
   (setq Prof (substr Prof 1 (- (strlen Prof) 1)))
   (princ (strcat "\n-" Prof "-"))
 ) ;_ Fin de while
 (princ (strcat "\n-" Prof "-"))

 

Mais il me reste un dernier espace en fin de chaine "Prof"...

 

Denis...

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

Salut,

 

trim -> ajusté

right -> droite

left -> gauche

 

donc

(vl-string-right-trim "m" (vl-string-left-trim "p" "p1.20m"))

Je n'ai pourtant quasiment pas fait d'anglais de ma vie (4ème et 3ème il y a 28 ans..)

 

Sinon ma variante

(read (vl-string-translate "pm" "  " "p1.20m"))

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci VDH-Bruno,

 

Trim, Left et Right ne me posaient pas de problèmes, c'était les définitions et l'aide en générale qui, en anglais, me posent quelques problème...

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

Bon, j'ai réussi à comprendre un peu truc...

 

J'ai maintenant çà :

  (while (= (substr Prof (- (strlen Prof) 1) 1) " ")
   (setq Prof (vl-string-right-trim " " Prof))
   ;;(princ (strcat "\n-" Prof "-"))
 ) ;_ Fin de while
     (setq Prof (vl-string-right-trim "m" (vl-string-left-trim "p" Prof)))

 

Mais je ne pense pas avoir besoin du (while... Non ?

 

Merci encore à tous...

 

Denis...

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

Merci VDH-Bruno,

 

Trim, Left et Right ne me posaient pas de problèmes, c'était les définitions et l'aide en générale qui, en anglais, me posent quelques problème...

J'ai appris en testant avec la console et les exemples de la guerre des étoiles fautes de comprendre les définitions, effectivement la courbe de progression est plus lente mais du coup les fonctions sont peut être mieux intégré sur le long terme...

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, le (while était inutile...

 

Denis...

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

Re,

 

Il subsiste toujours un petit problème, lorsque mon texte est égale à "pas ouvert" par exemple, ma routine supprime le premier "p" et je me retrouve avec un commentaire égale à "as ouvert", ce qui est bourde de ma part...

 

Donc, j'en reviens à mon (if :

Si le premier caractère de Prof = "p" ET si le dernier caractère de Prof = "m"
Alors : (setq Prof (vl-string-right-trim "m" (vl-string-left-trim "p" Prof))) 

 

C'est ca que je n'arrive pas à développer en LiSP...

 

Denis...

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

Il subsiste toujours un petit problème, lorsque mon texte est égale à "pas ouvert" par exemple, ma routine supprime le premier "p" et je me retrouve avec un commentaire égale à "as ouvert", ce qui est bourde de ma part...

 

Oui mais si tu fait un test pour vérifier que n'a pas une valeur décimal, dans ce cas tu ne change pas ton "pas ouvert" en "as ouvert" dans ton texte.

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci VDH-Bruno, Tu entends par là que je devrais chercher un "." dans la variable "Prof" avec un vl-string-search ?

 

Mais à mesure que j'évolu dans le dessin, je me rend compte que mes collègues n'ont pas été constant dans leur levé, j'ai des profondeurs notées "p1.20m", mais aussi "P1.20" ou encore "P1.20m"... Sans compter les "Puisard", "pas ouvert", "bloqué"...

 

En gros, (et après les quelques sushis de ce midi) j'ai plutôt envie de laisser tomber, la routine fonctionne comme ça et ça ne servira à rien que je passe des heures à la faire évoluer si c'est pour me faire gagner quelques minutes...

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 DenisH,

 

Est-ce que ça peut t'aider ? :

 

(setq test "p1,25m")

(if (= T (wcmatch test "p*m"))
   (setq test (vl-string-left-trim "p" (vl-string-right-trim "m" test)))
)

 

Je ne sais pas comment rendre les comparaisons insensibles à la casse mais si tu sais que ton texte sera toujours su style p1,20m par exemple, tu peux modifier ton WCMATCH.

 

(wcmatch test "@#.##@")

 

plusieures possibilités existent, je te renvoie sur le tutoriel de (gile), les détails du wcmatch sont expliqués à la page 24 en bas.

 

Sinon ceci marche bien aussi apparement

(substr test 2 4)

 

En espérant avoir pu t'aider :)

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Merci Gjulien,

 

Mais comme je l'ai dis plus haut, mes collègues n'ont pas toujours levé de la même façons.

 

J'ai donc, en variable possible, Prof qui peut être égal à "P1.20", "P1.20M", "p1.20", "p1.20m", "puisard", "pas ouvert", "bloqué"...

 

J'ai donc laissé tomber, je ne passerais pas des heures à programmer une routine qui me fera gagner quelques minutes...

 

Mais merci pour ton aide...

 

Denis...

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

Dans ce cas, tu peux mettre ton wcmatch comme ceci :

 

(if (= T (wcmatch Prof "*#*"))
   (setq Prof (vl-string-left-trim "p" (vl-string-right-trim "m" Prof)))
   (princ Prof)
)

 

Si tu as du caractère numérique quel qu'il soit p1,25m ou P2,20m, p1,34M comme tu dis il te rabottera d'office le premier symbole au début et à la fin pour ne te laisser que ton nombre.

Tandis que si tu n'as pas de caractère numérique il te gardera le nom en entier.

 

Si pour les dimensions tu as d'autres lettres que "p" et "m", tu peux simplement utiliser

(substr Prof 2 4)

au lieu de

(setq Prof (vl-string-left-trim "p" (vl-string-right-trim "m" Prof)))

 

Si ce n'est pas ce que tu espérais, je ne saurais pas aller plus loin je pense. Mes connaissances restent malgré tout très basiques ^^'

Mais j'aime à penser que je puisse rendre un jour l'aide qu'on m'a déjà apportée sur ce forum :)

 

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

J'ai donc, en variable possible, Prof qui peut être égal à "P1.20", "P1.20M", "p1.20", "p1.20m", "puisard", "pas ouvert", "bloqué"...

 

Il y a peu de problèmes qui ne puissent trouver de solution, un exemple qui retourne systématiquement la valeur numérique de la chaîne sinon nil, avec tes qq exemples.

_$ (mapcar '(lambda (txt / nbr)
          (if (numberp (setq nbr (read (vl-string-translate "pmPM" "    " txt))))
            nbr
          )
        )
       '("P1.20" "P1.20M" "p1.20" "p1.20m" "puisard" "pas ouvert" "bloqué")
)

(1.2 1.2 1.2 1.2 nil nil nil)
_$ 

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci Gjulien, ta première proposition fonctionne parfaitement...

 

Merci aussi à VDH-Bruno... Mais je n'ai jamais compris le fonctionnement de (mapcar, tout comme celui de (lambda...

C'est pour cette raison que j'hésite beaucoup à les utiliser en faisant un copier/coller des fractions de routines issues d'autre macros dans mes propres LiSP (waouw, elle n'est pas super claire cette phrase...).

Car si je dois retourner trifouiller dans mes macros, je n'y comprendrais plus rien.

 

En tous cas, merci à tous pour vos aides...

 

Denis...

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

Merci Gjulien, ta première proposition fonctionne parfaitement...

 

Merci aussi à VDH-Bruno... Mais je n'ai jamais compris le fonctionnement de (mapcar, tout comme celui de (lambda...

C'est pour cette raison que j'hésite beaucoup à les utiliser en faisant un copier/coller des fractions de routines issues d'autre macros dans mes propres LiSP (waouw, elle n'est pas super claire cette phrase...).

Car si je dois retourner trifouiller dans mes macros, je n'y comprendrais plus rien.

 

En tous cas, merci à tous pour vos aides...

 

Denis...

 

L'expression suivante te retournera la valeur numérique de ta chaine sinon nil

(if (numberp (setq nbr (read (vl-string-translate "pmPM" "    " Prof))))
 nbr
)

A+

(Ps: Le mapcar était à titre d'exemple pour les combinaisons que tu avais énuméré)

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Par contre, et c'est juste pour jouer à SuperChipotte, comment faire pour que "PUISARD" ou "puisard" se transforment en "Puisard", parceque, il n'est jamais écrit de la même façon, les majuscules se bousculent et ne gagnent pas toutes...

 

Et je n'ai pas saisi la démonstration dans "Introduction_a_AutoLISP.pdf" du grand (gile), chapitre 14.1

 

strcase (strcase str [bas])

retourne une chaîne dont tous les caractères sont passée en majuscules (si bas est absent ou nil) ou en minuscules (si bas est présent et non nil).

Je ne sais pas quoi placer dans [bas]...

 

Sachant que j'ai une dizaine de textes différents, comme "bloqué" ou encore "pas ouvert"...

 

Denis...

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

Mille mercis x_all,

 

C'est vrai, le guide de référence, malgré qu'il soit en anglais, aide aussi pas mal...

 

J'ai donc une petite formule pour mettre le premier caractère d'une variable en majuscule et le reste en minuscule...

 

Su ça peut servir à quelqu'un :

(setq NomPropre (strcat (strcase (substr Text 1 1)) (strcase (substr Text 2 (- (strlen Text) 1)) T)))

 

(gile), je n'avais pas vu ton poste, merci encore...

 

Denis...

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

Sous forme de fonction ça fait plus lispien ;)

_$ (defun casse (str) (strcat (strcase (substr str 1 1)) (strcase (substr str 2) T)))
CASSE
_$ (casse "pUiSaRd")
"Puisard"

 

(ps: tu peux économiser strlen dans substr il y a des arguments optionnel noté entre crochet dans l'aide [...])

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Toujours ce souci de perfection chez les Lispiens...

 

Mais une bonne idée reste une bonne idée... Je créé ma petite fonction tout de suite...

(ps: tu peux économiser strlen dans substr il y a des arguments optionnel noté entre crochet dans l'aide [...])

J'en ai fais un peu trop, mais c'est pour être sûr de bien tout comprendre, et de ne rien oublier...

 

A toutes fins utiles, j'ai donc :

(defun NomPropre (Text /)
 (setq NomPropre
        (strcat (strcase (substr Text 1 1)) (strcase (substr Text 2 (- (strlen Text) 1)) T))
 ) ;_ Fin de setq
)

Qu'on appel comme ça :

(setq TextEnForme (NomPropre TextBrut))

Merci encore à tous...

 

Denis...

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

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é