DenisHen Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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)
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
(gile) Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 Salut, Regarde les fonctions vl-string-trim, vl-string-left-trim et vl-string-right-trim. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 Salut, trim -> ajustéright -> droiteleft -> 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
GJulien Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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,
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
GJulien Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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,
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
x_all Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 je ne remettrai pas en question l’inestimable valeur ajouter de l'introduction de (Gile), mais il est indispensable d'avoir les ref sous la main http://docs.autodesk...rence_guide.pdf ExamplesCommand: (strcase "Sample")"SAMPLE"Command: (strcase "Sample" T)"sample" quelques trucs sur autocad
(gile) Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 Denis, essaye... (strcase "Puisard") ; <- absent (strcase "Puisard" T) ; <- non nil (strcase "Puisard" nil) <- nil (strcase "Puisard" 42) ; <- non nil Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
VDH-Bruno Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 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
DenisHen Posté(e) le 4 août 2015 Auteur Posté(e) le 4 août 2015 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)
GJulien Posté(e) le 4 août 2015 Posté(e) le 4 août 2015 (setq Test (strcat (strcase (substr test 1 1)) (strcase (substr test 2) T))) Comme ça quelle que soit la longueur de ton mot, tu auras toujours la première lettre en majuscule et le reste en minuscule. Cordialement,
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant