Aller au contenu

C\'est une chaine ou une valeur ?


Messages recommandés

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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)

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é