DenisHen Posté(e) le 4 avril 2017 Posté(e) le 4 avril 2017 Bonjour à la communauté. Aujourd'hui, et pour les besoins d'une vieille routine, je dois :- soit cliquer sur un texte (qui est un nombre),- soit taper ce nombre en ligne de commande. J'ai donc modifier mon Lisp d'origine, mais je rame. J'ai donc fais un petit bout de Lisp test mais toujours rien. Voici mon code :;;;********************************************************** ;;; Teste de sélection d'une profondeur OU saisi de celle-ci ;;;********************************************************** (defun c:TestProf (/) (setq Prof (vlax-ldata-get "DenisH" "EtiqPRD_OldProf" "")) (if (= Prof "") (setq Phrase (strcat "\nSélectionnez la profondeur : ")) (setq Phrase (strcat "\nSélectionnez la profondeur <" Prof "> : ")) ) ;_ Fin de if (princ "\nType Txt_Prof = ") (setq Txt_Prof (car (entsel Phrase))) (if (= (type Txt_Prof) 'ENAME) ;; Si Txt_Prof est une sélection (princ (type Txt_Prof)) ) ;_ Fin de if (if (= (type Txt_Prof) 'STR) ;; Si Txt_Prof est un string (princ (type Txt_Prof)) ) ;_ Fin de if (princ) ) ;_ Fin de defun Lorsque je clique sur une entité, (type Txt_Prof est bien ENAME. Mais si je tape un texte, (type Txt_Prof n'est pas un string... Je pense que ça vient du (entsel... Si quelqu'un a une astuce, un conseil ou même la solution, 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)
bonuscad Posté(e) le 4 avril 2017 Posté(e) le 4 avril 2017 Bonjour, Un membre m'avait demandé en mp une fonction un peu similaire.Je te poste le code complet en te suggérant de t'inspirer de la fonction nentsel-getreal du code, qui je pense pourrait répondre à ton besoin. (vl-load-com) (defun nentsel-getreal ( / ent key n nbr) (setq nbr "") (princ (strcat "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z <" (rtos (caddr (getvar "LASTPOINT")) 2 2) ">: ")) (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25) (/= (car key) 3)) (cond ((eq (car key) 2) (if (member (cadr key) '(8 46 48 49 50 51 52 53 54 55 56 57)) (if (eq (cadr key) 8) (progn (princ (chr 8)) (princ (chr 32)) (princ (chr 8)) (setq nbr (substr nbr 1 (1- (strlen nbr)))) ) (progn (setq n (chr (cadr key))) (princ n) (setq nbr (strcat nbr n)) ) ) ) ) ) ) (if (eq (car key) 3) (if (setq ent (nentselp (cadr key))) (progn (setq ent (entget (car ent))) (if (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT" "ATTRIB")) (progn (setq ent (read (cdr (assoc 1 ent)))) (if (or (eq (type ent) 'INT) (eq (type ent) 'REAL)) (progn (princ (strcat "\nZ = " (rtos ent 2 2))) ent) (progn (princ "\nLe texte n'est pas valide!") (nentsel-getreal)) ) ) (progn (princ "\nObjet n'est pas un Texte!") (nentsel-getreal)) ) ) (progn (princ "\nSélection vide!") (setq ent nil) (nentsel-getreal)) ) (if (/= nbr "") (progn (princ (strcat "\nZ = " nbr)) (atof nbr)) (progn (princ (strcat "\nZ = " (rtos (caddr (getvar "LASTPOINT"))2 2))) (caddr (getvar "LASTPOINT"))) ) ) ) (defun c:3dpoly_xy ( / AcDoc Space msg_f msg_n n pt_f lst_pt lst_tmp pt_n nw_pl) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (eq (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: " msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: " n 0 ) (while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de "))) (princ "\nPoint incorrect.") ) (setq pt_f (trans pt_f 1 0) lst_pt (list (list (car pt_f) (cadr pt_f) (nentsel-getreal))) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (initget "U ANNUler _Undo UNDO") (while (and (setq pt_n (getpoint (trans pt_f 0 1) (if (< n 2) msg_f msg_n))) (/= pt_n "Close")) (if (listp pt_n) (progn (setq pt_n (trans pt_n 1 0) lst_pt (cons (list (car pt_n) (cadr pt_n) (nentsel-getreal)) lst_pt) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (setq n (1+ n) pt_f pt_n) ) (if (zerop n) (princ "\nTous les segments sont déjà annulés.") (progn (setq lst_pt (cdr lst_pt) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (setq n (1- n) pt_f (getvar "lastpoint")) ) ) ) (if (< n 1) (initget "U ANNUler _Undo UNDO") (initget "U ANNUler Clore _Undo UNDO Close") ) (redraw) (while (cdr lst_tmp) (grdraw (trans (car lst_tmp) 0 1) (trans (cadr lst_tmp) 0 1) 7) (setq lst_tmp (cdr lst_tmp))) ) (redraw) (setq nw_pl (vlax-invoke Space 'Add3DPoly (apply 'append (reverse lst_pt)))) (if (eq pt_n "Close") (vlax-put nw_pl 'Closed 1) ) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
DenisHen Posté(e) le 4 avril 2017 Auteur Posté(e) le 4 avril 2017 Salut BonusCad, et merci pour ton aide, je vais de ce pas jeter un œil dessus... 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 4 avril 2017 Auteur Posté(e) le 4 avril 2017 Forcément, je viens d'intégré ton code au mien, mais rien ne se passe, le voici :;;;********************************************************** ;;; Teste de sélection d'une profondeur OU saisi de celle-ci ;;;********************************************************** (defun c:TestProf (/) (defun nentsel-getreal (/ ent key n nbr) (setq Prof (vlax-ldata-get "DenisH" "EtiqPRD_OldProf" "")) (if (= Prof "") (princ (strcat "\nSélectionnez la profondeur : ")) (princ (strcat "\nSélectionnez la profondeur <" Prof "> : ")) ) ;_ Fin de if ;;; (setq Txt_Prof "") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25) (/= (car key) 3)) (cond ((eq (car key) 2) (if (member (cadr key) '(8 46 48 49 50 51 52 53 54 55 56 57)) (if (eq (cadr key) 8) (progn (princ (chr 8)) (princ (chr 32)) (princ (chr 8)) (setq Txt_Prof (substr Txt_Prof 1 (1- (strlen nbr)))) ) ;_ Fin de progn (progn (setq n (chr (cadr key))) (princ n) (setq Txt_Prof (strcat Txt_Prof n))) ) ;_ Fin de if ) ;_ Fin de if ) ) ;_ Fin de cond ) ;_ Fin de while (if (eq (car key) 3) (if (setq ent (nentselp (cadr key))) (progn (setq ent (entget (car ent))) (if (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT" "ATTRIB")) (progn (setq ent (read (cdr (assoc 1 ent)))) (if (or (eq (type ent) 'INT) (eq (type ent) 'REAL)) (progn (vlax-ldata-put "DenisH" "EtiqPRD_OldProf" (rtos ent 2 2)) ent) (progn (princ "\nLe texte n'est pas valide!") (nentsel-getreal)) ) ;_ Fin de if ) ;_ Fin de progn (progn (princ "\nObjet n'est pas un Texte!") (nentsel-getreal)) ) ;_ Fin de if ) ;_ Fin de progn (progn (princ "\nSélection vide!") (setq ent nil) (nentsel-getreal)) ) ;_ Fin de if (if (/= Txt_Prof "") (progn (princ (strcat "\nProf = " Txt_Prof)) (atof Txt_Prof) (vlax-ldata-put "DenisH" "EtiqPRD_OldProf" Txt_Prof) ) ;_ Fin de progn ) ;_ Fin de if ) ;_ Fin de if ) ;_ Fin de defun ;;; (nentsel-getreal) (princ) ) ;_ Fin de defun PS : j'ai modifier le code posté, ça fonctionne nickel... Encore merci BonusCAD... 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 4 avril 2017 Posté(e) le 4 avril 2017 Salut, Sous forme de fonction séparée (je savais bien que j'avais aussi quelque chose dans ce style...) ;; GetOrSelectString ;; Entrer un texte ou sélectionner une entité *TEXT ou ATTRIB ;; Retourne le texte (STR) ou nil ;; ;; Arguments ;; space : si non nil, autorise les espaces dans la saisie du texte ;; msg : message d'invite (defun GetOrSelectString (space msg / break gr pt txt elst str) (prompt msg) (while (and (setq gr (grread T 12 2)) (not break)) (cond ;; récupère les coordonnées du curseur ((= (car gr) 5) (setq pt (cadr gr)) ) ;; point cliqué ((= 3 (car gr)) (if (setq txt (nentselp pt)) (if (wcmatch (cdr (assoc 0 (setq elst (entget (car txt))))) "*TEXT,ATTRIB" ) (setq str (cdr (assoc 1 elst)) break T ) (prompt "\nL'object sélectionné n'est pas un texte ou un attribut.") ) (setq str nil break T ) ) ) ;; Clic droit ((member (car gr) '(12 25)) (setq str nil break T ) ) ;; Entrée ou Espace si 'space' = nil ((or (equal gr '(2 13)) (and (equal gr '(2 32)) (not space)) ) (if (and str (= (vl-string-trim " \t" str) "")) (setq str nil) ) (setq break T) ) ;; Récupérer les entrées au clavier (T (if (= (cadr gr) 8) ;_ 8 = retour/effacer (or (and str (/= str "") (setq str (substr str 1 (1- (strlen str)))) (princ (chr 8)) ; "\010" (princ (chr 32)) ; " " ) (setq str nil) ) (or (and str (setq str (strcat str (chr (cadr gr))))) (setq str (chr (cadr gr))) ) ) (and str (princ (chr (cadr gr)))) ;_ affichage sur la ligne de commande ) ) ) str ) Exemple d'utilisation : ;;;********************************************************** ;;; Teste de sélection d'une profondeur OU saisi de celle-ci ;;;********************************************************** (defun c:TestProf (/ Prof Phrase Txt_Prof) (setq Prof (vlax-ldata-get "DenisH" "EtiqPRD_OldProf" "")) (if (= Prof "") (setq Phrase (strcat "\nSélectionnez la profondeur : ")) (setq Phrase (strcat "\nSélectionnez la profondeur <" Prof "> : ")) ) (if (not (setq Txt_prof (GetOrSelectString nil Phrase))) (setq Txt_prof Prof) ) (alert (strcat "Txt_prof = " txt_prof)) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 4 avril 2017 Auteur Posté(e) le 4 avril 2017 Salut (gile), et merci pour ton aide... Et que c'est joli tout ça... J'intègre immédiatement ce code qui va me permettre de ne pas trop toucher mon ancien code... 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)
DenisHen Posté(e) le 4 avril 2017 Auteur Posté(e) le 4 avril 2017 Wouaouw... En fait, tu passes par le clique de la souris ? ! ? Alors ça, c'est vicueux... Mais diablement efficace... ;) 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 4 avril 2017 Auteur Posté(e) le 4 avril 2017 Arg... Je tombe forcément sur une c***lle... Dans la sélection du texte contenant ma valeur Prof (profondeur), j'ai parfois des mises en forme déjà faites, comme "Pf:55cm", ou "Prof = 0.69m". Raison pour laquelle, j'avais ça dans mon ancien code... :(setq Prof (vl-string-left-trim "Pf:" (vl-string-right-trim "m" Prof))) (setq Prof (vl-string-left-trim "Prof = " (vl-string-right-trim "M" Prof))) (setq Prof (vl-string-left-trim "P:" (vl-string-right-trim "M" Prof))) (setq Prof (vl-string-left-trim "P" (vl-string-right-trim "CM" Prof))) (setq Prof (vl-string-left-trim "p" (vl-string-right-trim "cm" Prof))) (setq Prof (vl-string-left-trim "(" (vl-string-right-trim ")" Prof))) Et là, je rame encore plus... :( Car je n'arrive pas à voir la valeur str au moment ou je devrais trier cette mise en forme... :huh: PS du lendemain : j'ai trouvé la solution... Encore merci à tous... 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)
didier Posté(e) le 5 avril 2017 Posté(e) le 5 avril 2017 Coucou S'il te plaît DenisHen pour que les gens arrivent à te suivre, évite de mettre DANS le même message que ça ne fonctionne pas au début du message puis à la fin que tout marche et merci car entre-temps tu as édité le messageOn ne s'y retrouve plusS'il le faut, refais un nouveau message et explique le changement, merci. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
VDH-Bruno Posté(e) le 5 avril 2017 Posté(e) le 5 avril 2017 Bonjour Aujourd'hui, et pour les besoins d'une vieille routine, je dois :- soit cliquer sur un texte (qui est un nombre),- soit taper ce nombre en ligne de commande. Consernant l'écriture d'une fonction spécifique pour la une sélection d'un texte ou une saisie numériqueJe profite de l'occasion pour faire remarquer que les fonctions entsel, nentsel et nentselp permettant la saisie de coordonnées, elles ne réagissent pas de la même manière sur la ligne de commande en fonction d'une saisie numérique ou d'une saisie alphanumérique Commande: (entsel)Choix de l'objet: saisiealéatoire*Sélection non valable*Attend un point ou DernierChoix de l'objet: 42nil Je pense qu'au moyen de la variable lastprompt on peut se servir de cette particularités pour filtrer la saisie, ma proposition de code: ;; SelGetNum ;; Saisie numérique ou sélectionnez une entitée *TEXT ou ATTRIB ;; Retourne un texte (STR) ou nil ;; ;; Exemple: ;; (SelGetNum "\nEntrez un nombre ou sélectionnez un texte: ") (defun SelGetNum (msg / ent rep) (cond ((and (setq ent (car (nentsel msg))) (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT,ATTRIB")) (cdr (assoc 1 (entget ent))) ) ((numberp (read (setq rep (vl-string-left-trim msg (getvar 'lastprompt))))) rep) ) ) A+ Apprendre => Prendre => Rendre
bonuscad Posté(e) le 5 avril 2017 Posté(e) le 5 avril 2017 Waoou! Très subtile l'usage de LASTPROMPT, fallait y penser... En plus cette variable est difficile à tester au pas à pas. Bien visé, merci pour cette proposition. ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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