Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous...

 

Voilà, j'ai besoin de changer la casse de plusieurs textes (des noms de rue, de parc...).

 

Mon client préfère (et moi aussi) la casse traditionnelle, c'est à dire les prénoms n'ont que leur première lettre en majuscule et les noms sont en majuscule.

 

Par exemple : Jean-Baptiste POQUELIN

 

Jusqu'à présent, j'utilisais la routine de (gile), nommée "NomPropre", mais je dois maintenant faire la mienne.

 

J'avais pensé à utiliser NomPropre pour tout puis passer en majuscule le dernier mot du texte complet...

Je cherche donc comment supprimer la dernière occurrence d'une liste, qui est mon texte complet.

 

Exemple : Texte=NomPropre(ma chaine sauf dernière occurrence) + strcase(dernière occurrence)

 

Si quelqu'un a une astuce ou un conseil, je suis preneur...

 

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 capde06 pour ta précieuse aide... ;)

 

J'ai commencé à écrire un truc, mais ça plante... :

;;;****************************************
;;; Transforme un text en casse Prénon NOM 
;;;****************************************
(defun c:PrenonNOM ()
 (setq Select (car (entsel "\t\tChoisissez votre texte :")))
 (wcmatch (cdr (assoc 0 (setq Texte (entget Select)))) "*")
 (setq Texte (cdr (assoc 1 Texte)))
 (princ Texte)
 (setq Texte (str2lst (Texte " ")))
 (princ Texte)
 (setq DebTxt (reverse (cdr (reverse Texte))))
 (princ DebTxt)
 (setq FinTxt (last Texte))
 (princ FinTxt)
 (setq Texte (strcat DebTxt " " FinTxt))
 (princ Texte)
 (princ)
) ;_ Fin de defun

;; STR2LST (de (gile))
;; Transforme un chaine avec séparateur en liste de chaines
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   ) ;_ Fin de cons
   (list str)
 ) ;_ Fin de if
) ;_ Fin de defun
;;

 

Et AutoCAD me répond :

Commande: PRENONNOM Choisissez votre texte :RUE DE COULOMMES; erreur: fonction incorrecte: "RUE DE COULOMMES"

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)

Bon, j'ai fais évoluer le bidule, mais ça plante toujours...

(defun c:PrenonNOM ()
 (setq Select (car (entsel "\nChoisissez votre texte :")))
 (wcmatch (cdr (assoc 0 (setq Texte (entget Select)))) "*")
 (setq Texte (cdr (assoc 1 Texte)))
 (princ (strcat "\nDrapeau 00" Texte))
 (setq Texte (str2lst Texte " "))
 (princ (strcat "\nDrapeau 01" Texte))
 (setq DebTxt (Nompropre (reverse (cdr (reverse Texte)))))
 (princ (strcat "\nDrapeau 02" DebTxt))
 (setq FinTxt (strcase (last Texte)))
 (princ (strcat "\nDrapeau 03" FinTxt))
 (setq Texte (strcat DebTxt " " FinTxt))
 (princ (strcat "\nDrapeau 04" Texte))
 (princ)
) ;_ Fin de defun

 

Et AutoCAD me répond :

Commande: PRENONNOM

Choisissez votre texte :

Drapeau 00RUE DE COULOMMES; erreur: type d'argument incorrect: stringp ("RUE" "DE" "COULOMMES")

; redéfinir après erreur

 

Et je ne comprend pas, car dans la Console, tout a l'air bon...

_$ Texte

("RUE" "DE" "COULOMMES")

_$ DebTxt

("RUE" "DE")

_$ FinTxt

"COULOMMES"

_$

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)

Au temps pour moi... C'était les princ qui déconnaient, voilà qui est mieux :

(defun c:PrenonNOM ()
 (setq Select (car (entsel "\nChoisissez votre texte :")))
 (wcmatch (cdr (assoc 0 (setq Texte (entget Select)))) "*")
 (setq Texte (cdr (assoc 1 Texte)))
 (setq Texte (str2lst Texte " "))
 (setq DebTxt (Nompropre (lst2str (reverse (cdr (reverse Texte))) " ")))
 (setq FinTxt (strcase (last Texte)))
 (setq Texte (strcat DebTxt " " FinTxt))
 (princ Texte)
 (princ)
)

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)

Je n'arrive pas à comprendre pourquoi le ssname bloque, c'est la même structure qu'une autre routine qui fonctionne correctement :

(defun c:PrenonNOM ()
 (setq Select (entsel "\nChoisissez votre texte :"))
 (wcmatch (cdr (assoc 0 (setq Texte (entget (car Select))))) "*")
 (setq Texte (cdr (assoc 1 Texte)))
 (setq Texte (str2lst Texte " "))
 (setq
   DebTxt (Nompropre (lst2str (reverse (cdr (reverse Texte))) " "))
 ) ;_ Fin de setq
 (setq FinTxt (strcase (last Texte)))
 (setq Texte (strcat DebTxt " " FinTxt))
 (princ Texte)
 (princ "\nDrapeau 01")
;;;
 (princ "\nDrapeau 02")
 (setq elst  (ssname Select 0) ;C'est ici que ça déconne ********************
       Coord (cdr (assoc 10 elst))
       Haut  (cdr (assoc 40 elst))
       Rot   (cdr (assoc 50 elst))
 ) ;_ Fin de setq
 (princ "\nDrapeau 03")
 (setvar "clayer" (cdr (assoc 8 elst)))
 (command "_erase" ent "")
 (setq
   Coord (strcat (rtos (car Coord) 2 3) "," (rtos (cadr Coord) 2 3))
 ) ;_ Fin de setq
 (setq Rot (+ Rot (/ pi 2)))
 (command "texte" "j" "mc" Coord Haut (angtos Rot 2 3) Texte) ;_ Fin de command
 (command "_move" "_last" "" "_non" Coord pause)
;;;
;;;
;;;
 (princ)
) ;_ Fin de defun

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)

Et ceci (peut être a améliorer..., pas trop testé)

 

(defun nomprenom (nom / l flag)
(setq l (vl-string->list nom))
(vl-list->string (mapcar '(lambda (x) (if (eq x 32) (setq flag T)) (if (and (or flag (eq x (car l))) (> x 90)) (- x 32) x)) l))
)

(nomprenom "denis hache")-> "Denis HACHE"

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

Posté(e)

Bonjour,

 

ssname à besoin d'un jeu de sélection.

Hors dans ton code tu lui fourni (entsel) soit la positon du point cliqué + l'ename.

Dans ton cas le ssname ne sert à rien, un simple (car (entsel)) suffit.

 

Olivier

Posté(e)

Bonjour Olivier, et merci de ton aide.

 

je pense que là où ça déconne, c'est justement dans attribution de elst, car ma sélection existe déjà à la première ligne...

 

Je n'arrive pas à faire la même chose plus bas...

 

merci encore de m'aider...

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)

Là je ne te suis pas.

 

(setq Select (entsel "\nChoisissez votre texte :"))

 

te renvoi quelques chose devant ressembler à ceci :

 

(<Nom d'entité: 7ffffb05aa0> (2073.86 1553.79 0.0))

Soit la position du point cliqué et l'ename de ton objet.

 

ssname lui à besoin d'un jeu de sélection du type :

 

<Selection set: 619>

contenant un ou plusieurs objet et renvoi l'ename de l'objet n-1.

 

ce que tu as déjà dans la réponse à (entsel)

 

Donc remplace :

 

(setq elst  (ssname Select 0)

 

Par :

 

(setq elst (car (Select))

 

Olivier

  • Upvote 1
Posté(e)

Bonjour à tous, et merci pour votre aide.

 

Olivier : effectivement, tu avais raison, c'est la ligne suivante qui déconne. Mais comme le setq avait plusieurs variables, c'est le tout qu'il a refusé. Pour voir d'où venait l'erreur, j'ai codé ainsi :

   .......
 (princ "\nDrapeau 02")
 (setq elst (car Select))
 (princ "\nDrapeau 03")
 (setq Coord (cdr (assoc 10 elst)))
 ......

Et c'est la variable Coord qui ne veut pas de (cdr (assoc 10 elst)) Et je ne vois pas pourquoi...

 

fabcad : merci pour ces fonctions, mais elles sont un peu trop complexes pour moi...

 

Encore merci à vous...

 

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,

 

Et c'est la variable Coord qui ne veut pas de (cdr (assoc 10 elst)) Et je ne vois pas pourquoi...

Que dit le message d'erreur ? (les messages d'erreur renseignent souvent sur la nature des erreurs)

Qu'y a-t-il dans elst ?

 

Il me semble que Patrick_35 t'avait conseillé d'exécuter ton code 'pas à pas' pour déboguer plutôt que de mettre des drapeaux.

Tu peux le faire en mettant un point d'arrêt au début du code et en faisant le 'pas à pas' avec la touche F8 ou, tout simplement, en exécutant les expressions une par une dans la console. Dans les deux cas, tu peux à tout moment interroger la valeur des variables dans la console.

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci (gile) de t'ajouter à la liste...

 

Oui, Patrick_35 m'a bien conseillé le mode pas à pas, mais je ne sais pas m'en servir avec Visual LISP (je l'utilise pourtant systématiquement en VBA). Alors j'ai palié avec la méthode à papa, les drapeaux... :huh:

 

Voici mon bout de code :

  (princ "\nDrapeau 03")
 (setq Coord (cdr (assoc 10 elst)))
 (princ "\nDrapeau 04")

Voici mon message d'erreur :

Drapeau 03; erreur: type d'argument incorrect: listp <Nom d'entité: 7ffffb9d0a0>

 

Et voici ce que contient elst dans la Console :

_1$ elst

<Nom d'entité: 7ffffb9d0a0>

_1$

 

Ce que je ne comprend pas, c'est que ça fonctionne dans une autre routine... Mais avec des blocs...

 

Merci encore pour votre aide messieurs...

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)

Pfff ! ! ! !

 

Je viens de trouver ! !

(setq elst (entget (car Select)))

 

Forcément, mon elst n'était pas complet ! !

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)
Ce que je ne comprend pas, c'est que ça fonctionne dans une autre routine

Certainement pas.

 

_1$ elst
<Nom d'entité: 7ffffb9d0a0>
_1$

Ceci veut dire que elst est un nom d'entité (type ENAME)

 

erreur: type d'argument incorrect: listp

Veut dire (c'est écrit clairement) que le type d'argument est incorrect parce que là où le type d'argument devrait être une liste (listp) tu lui passe un ENAME ().

 

La fonction assoc requiert deux arguments : une clé (qui peut être de n'importe quel type) et une liste d'association (c-à-d une liste de sous-listes ou de paires pointées).

Tu lui passes bien une clé comme premier argument avec 10 mais en second argument tu lui passe un ENAME et c'est ce qui provoque l'erreur.

 

En fait, ce que tu cherches à faire c'est récupérer la valeur du groupe 10 d'une liste DXF (qui est bien une liste d'association), il faut donc d'abord récupérer cette liste avec la fonction entget et ton entité.

 

PS: on tache aussi que les symboles (noms de variables) correspondent à leur contenu. C'est pourquoi elst est souvent utilisé pour une liste DXF (entity list).

Utiliser ce symbole pour un ENAME (pour lequel on utilise plutôt le symbole ent) prête à confusion...

 

(setq ent (car (entsel))) ; ent est de type ENAME
(setq elst (entget ent)) ; elst est de type LIST
(setq coord (cdr (assoc 10 elst)))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci, c'est plus clair maintenant...

 

J'ai toujours le même problème, je ne suis "jamais" sûr à 100% de ce que j'utilise...

 

Mais ça commence à venir, grâce à tes explications (et celles des autres "pro" du site).

 

Le problème, c'est que je n'ai jamais le temps de bien développer mes routines...

 

Pour la direction, quand on ne produit pas, on ne fait rien...

 

Merci encore de ton aide (gile)...

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é