DenisHen Posté(e) le 28 avril 2015 Posté(e) le 28 avril 2015 Bonjour à tous, Voilà, j'ai des plans de levé terrain qui m'arrivent avec des données dans tous les sens... Ce qui se résume en une multitude de point (des PTRL) avec, à coté, un texte de ce format :"(0.80) Zs=52.78". J'ai commencé une macro qui sélectionne ce text mais je ne sais pas le séparer en deux. Exemple la variable prf serait le texte entre parenthèses "0.80" et ZGs serait l'altitude indiquée "52.78" (ZGs pour Z Génératrice Supérieur). Une fois les textes séparés dans ces deux variables, je pourrais insérer un bloc "PTRL_PF_ZG.dwg" avec ses deux attributs à renseigner. J'ai un début, mais je ne trouve pas la suite...(defun c:TXTversPTRL () (setq Txt_ptrl (car (entsel "\nSélectionnez le texte du PTRL :"))) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_ptrl)))) "*TEXT") (setq txt (cdr (assoc 1 elst))) (setq prf (??)) (setq ZGs (??)) ) Merci de m'aider... 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)
bonuscad Posté(e) le 28 avril 2015 Posté(e) le 28 avril 2015 Bonjour, Pour la manipulation des chaines, regarde:strlen et substr en mode vanilla lisp Autrement tu as aussi les fonctions vl-string-**** qui peuvent simplifier les choses. 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 28 avril 2015 Posté(e) le 28 avril 2015 Slt, Rapidement pour le principe une solution parmi d'autres, en s'appuyant sur la routine gc:str2lst de (gile), une routine très confortable d'utilisation lorsqu'il s'agit de "briser" des chaînes de caractères en fonction de caractères identifiables.La routine:;; gc:str2lst ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaîne ;; sep : le séparateur (defun gc:str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)) (list str) ) ) L'application à ton cas:;; Chaîne de texte de départ (setq txt "(0.80) Zs=52.78") ; "(0.80) Zs=52.78" ;; Séparation de la chaîne de caractères en une liste de 2 chaînes (setq txt (gc:str2lst txt " ")) ; ("(0.80)" "Zs=52.78") ;; prf = Supression du 1er et dernier caractère de la 1ère chaîne de caractères (setq prf (substr (car txt) 2 (- (strlen (car txt)) 2))) ; "0.80" ;; ZGs = Séparation de la seconde chaîne de caractères, en gardant le 2ème élèment (setq ZGs (cadr (gc:str2lst (cadr txt) "="))); "52.78" Edit: Réponse rapide mais visiblement pas assez, BonusCAD est en grande forme à ce que je vois :) 1 Apprendre => Prendre => Rendre
DenisHen Posté(e) le 28 avril 2015 Auteur Posté(e) le 28 avril 2015 Bonjour à tous, Merci à vous, j'ai donc ma macro ainsi et ça fonctionne à merveille :(defun c:TXTversPTRL () (setq Txt_ptrl (car (entsel "\nSélectionnez le texte du PTRL :"))) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_ptrl)))) "*TEXT") (setq txt (cdr (assoc 1 elst))) ;; Séparation de la chaîne de caractères en une liste de 2 chaînes (setq txt (gc:str2lst txt " ")) ; ("(0.80)" "Zs=52.78") ;; prf = Supression du 1er et dernier caractère de la 1ère chaîne de caractères (setq prf (substr (car txt) 2 (- (strlen (car txt)) 2))) ; "0.80" ;; ZGs = Séparation de la seconde chaîne de caractères, en gardant le 2ème élèment (setq ZGs (cadr (gc:str2lst (cadr txt) "="))) ; "52.78" ;(princ (strcat "\nProfondeur :" prf)) ;(princ (strcat "\nAltitude :" ZGs)) (setq pt_ins (getpoint "\nPoint d'insertion du PTRL : ")) (setvar "attdia" 0) (command "inserer" "PTRL_PF_ZG" pt_ins "1" "1" "0" prf ZGs ) (setvar "attdia" 1) (princ) ) ;_ Fin de defun ;; gc:str2lst ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaîne ;; sep : le séparateur (defun gc:str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)) (list str) ) ;_ Fin de if ) ;_ Fin de defun ;|«Visual LISP© Format Options» (99 2 2 1 T "Fin de " 100 99 0 0 nil nil T nil T) ;*** NE PAS AJOUTER de texte au-dessous du commentaire! ***|; 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)
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