Aller au contenu

[Résolu] Cliquer un texte et insérer un bloc avec l'attribut du texte


Messages recommandés

Posté(e)

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)

Posté(e)

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.

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

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 :)

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

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)

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é