Aller au contenu

[Résolu] Sélection d'un texte OU saisi d'un texte.


Messages recommandés

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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)

Posté(e)

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)

Posté(e)

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 message

On ne s'y retrouve plus

S'il le faut, refais un nouveau message et explique le changement, merci.

 

Amicalement

Posté(e)

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érique

Je 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 Dernier

Choix de l'objet: 42

nil

 

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

Posté(e)

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

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é