DenisHen Posté(e) le 17 octobre 2006 Posté(e) le 17 octobre 2006 Bonsoir à tous... Beaucoup de mes calques se terminent par l'échelle des entité qu'ils contiennent :"Poteaux EDF 200""Poteaux EDF 500""Cadastre adresse 200""Cadastre adresse 500""...... .... ...1250"".... ... .. .. .. 25000""... ........ ...." Mais j'ai aussi des calques où les entités n'on pas d'échelle :"Cadastre limite""Bâtiment contour""Bordure de trottoir""....." Pour, biensur, les geler ou les libérer dans une fenêtre de l'espace papier qui elle a une échelle J'ai déjà fais cette routine pour cherché la dernière chaine du calque : (defun FinChaine (chaine /) (setq pos (strlen chaine)) (while (not (equal (substr chaine pos 1) " ")) (setq pos (- pos 1)) ) ;_ Fin de while (setq Result (substr chaine (+ pos 1) (- (strlen chaine) pos))) (princ) ) ;_ Fin de defun J'aimerai maintenant savoir si Result est une chaine ("contour", "limite"...) ou une valeur ("200", "500"...) Je chercherai après la variable du zoom de la fenêtre... Voilà, bonne nuit, 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 17 octobre 2006 Posté(e) le 17 octobre 2006 Salut, Il existe des fonctions LISP très pratiques pour le traitement des chaines de caractères : les fonctions vl-string-... par exemple vl-string-position : (vl-string-position char-codestr [start-pos [from-end-p]]) où : - char-codestr est le code ascii du caractère recherché- start-pos la position de départ de la recherche, le premier caractère est 0 (0 si omis)- from-end-p si T est spécifié, la recherche démarre à partir de la fin Ta fonction FinChaine pourrait être : (defun FinChaine (chaine / pos) (setq pos (vl-string-position (ascii " ") chaine 0 T)) (substr chaine (+ 2 pos)) ) Ensuite, pour savoir si la fin de la chaine est un nombre essaye : (numberp (read (FinChaine "Cadastre adresse 200"))) -> ? (numberp (read (FinChaine "Cadastre limite"))) -> ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 17 octobre 2006 Auteur Posté(e) le 17 octobre 2006 Bonsoir (gile), Merci mille fois... (defun c:phTest (chaine) (FinChaine chaine) (if (= (numberp (read Result)) T) (princ (strcat "\n " Result " est un nombre")) (princ (strcat "\n " Result " est une chaine")) ) ;_ Fin de if (princ) ) ;_ Fin de defun (defun FinChaine (chaine /) (setq pos (strlen chaine)) (while (not (equal (substr chaine pos 1) " ")) (setq pos (- pos 1)) ) ;_ Fin de while (setq Result (substr chaine (+ pos 1) (- (strlen chaine) pos))) (princ) ) ;_ Fin de defun Et avec (c:phtest "Blabla patati patata")J'ai bien : patata est une chaine Et avec (c:phtest "Blabla patati patata 200")J'ai bien : 200 est un nombre Vraiment merci... (Tiens ? Je ne sais pas comment mon truc va réagir s'il n'y a pas d'espace dans mon nom de calque, comme "0" ou "Defpoints"... Je m'en occupe) Me reste plus qu'à savoir comment obtenir la liste des calques du dwg... Merci encore à toi (gile), Denis... (qui est très content cette semaine...) 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 17 octobre 2006 Posté(e) le 17 octobre 2006 Attention Denis, tu ne déclares pas tes variables, ce qui te permet de récupérer leurs valeurs d'une routine à l'autre, cette façon de faire n'est pas rigoureuse.Tu risque d'avoir de mauvaises surprises si la valeur d'une variable est modifiée par une autre routine. Dans l'exemple que je t'ai donné, FinChaine retourne la fin de la chaine sans l'attribuer à une variable (pas de (princ) à la fin) tu peux donc faire, dans la routine où tu as besoin de cette valeur : (setq result (FinChaine "Cadastre adresse 200"))(numberp (read result)) ou plus directement : (numberp (read (FinChaine "Cadastre adresse 200"))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 17 octobre 2006 Auteur Posté(e) le 17 octobre 2006 Bien m'sieur... J'aurais donc ça ? (defun c:phTest (chaine /) (if (= (numberp (read (FinChaine chaine))) T) (princ (strcat "\n " chaine " se fini par un nombre")) (princ (strcat "\n " chaine " se fini par une chaine")) ) ;_ Fin de if (princ) ) ;_ Fin de defun (defun FinChaine (chaine / pos) (setq pos (strlen chaine)) (while (and (not (equal (substr chaine pos 1) " ")) (> pos 1)) (setq pos (- pos 1)) ) ;_ Fin de while (setq chaine (substr chaine (+ pos 1) (- (strlen chaine) pos))) ) ;_ Fin de defun Merci encore... Désolé de ne pas suivre ton idée avec (vl-string.... mais pour l'instant, je préfere m'en tenir à ce que je comprend, j'ai déjà assez de mal avec le Lisp, le VLisp sera pour plus tard... Tu ne penses pas ? 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 17 octobre 2006 Posté(e) le 17 octobre 2006 tu peux écrire plus simplement : (if (numberp (read (FinChaine chaine))) ...) (= (numberp (read (FinChaine chaine))) T) retourne T si (numberp (read (FinChaine chaine))) retourne T, ou retourne nil si (numberp (read (FinChaine chaine))) retourne nil. VLisp sera pour plus tard... Tu ne penses pas ? Il ne s'agit là que des fonctions vl-... pas des fonctions vla-... vlax... ou vlr-... La plupart de ces fonctions vl-... sont simples à comprendre, fort utiles et permettent d'alléger les codes en évitant des boucles ou des fonctions récursives. J'en avais redéfinies plusieurs en "pur" AutoLISP pour les logiciels Intellidesk, Intellicad ou LT Extender qui ne reconnaisent pas les fonctions vl-...Tu peux les trouver ici [Edité le 17/10/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 18 octobre 2006 Auteur Posté(e) le 18 octobre 2006 Merci beaucoup (gile) pour ce lien, que je lirais demain... Il est 2h50... Là, et las, je vais me coucher... ;) 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)
DenisHen Posté(e) le 18 octobre 2006 Auteur Posté(e) le 18 octobre 2006 Merci encore (gile) pour ce lien très précieux... Tellement que j'en ai fais un gile.lsp... Il m'aidera surement à comprendre mieux le 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)
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