Aller au contenu

Messages recommandés

Posté(e)

Salut ! Suite à ce message, je pose la même question ici, au cas où des gens sauraient faire...

Est-ce possible de donner le choix à l'utilisateur de :

- Cliquer sur une entité

- Entrer le nom de l'entité

?

Bien sur, sans avoir à faire un entrée pour entrer le nom....

 

Exemple :

(car (entsel "\nCliquer sur une entité ou entrer le nom du calque : "))

 

Avec (initget 128) avant, ça fonctionne, mais les espaces sont considérés comme des entrées....

 

Voilà !

Je vois pas...

 

A bientot !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Salut,

une manière détourné :

(setq Q (getstring t "\n Entrer le nom du calque < Cliquer sur une entité >  : "))
(if (Equal Q "")
 (while (not ent)
   (setq ent (car (entsel "\n Cliquer sur une entité :")))
   )
 )

 

[Edité le 18/12/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Ah ok pas mal ! Mais c'est pas tout à fait ça que je veux...

 

J'avais donné ça, mais ça n'est pas tout à fait ça, encore :

(INITGET 128)
(setq q (entsel "\nSelect object or tape name of layer: "))
(cond
((= (type q) 'STR) (setq layer q))
((= (type q) 'LIST) (setq layer (cdr (assoc 8 (entget (car q))))))
)

 

EDIT : J'avais pas vu la réponse du type sur le forum autocad...

J'ai pas compris grand chose à sa réponse, mais je trouve que le problème de l'espace est plus important... Et je ne sais pas du tout comment faire...

 

Pour ta routine, il faut quand même passer par une entrée pour sélectionner l'entité...

Donc ça ne fonctionne pas..

 

[Edité le 18/12/2007 par Matt666]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Zut !

Je pensais y arriver comme ça, mais ça plante si il y a des espaces dans le nom du calque (ce sui revient à ton problème...)

(setq calq "")
(vlax-for i (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
 (setq calq (strcat (vla-get-Name i) " " calq)))

(initget calq)
(setq ent (entsel "\nCliquer sur une entité ou entrer le nom du calque : "))

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Peut être avec (grread)

 

(defun Entsel_Getstring ( / ent key kstr)
(setq kstr nil ent "")
(princ "\nSelectionner un objet / Chaine de caractère: ")
(while (and (not (equal (setq key (grread T 4 2)) '(2 13))) (/= (car key) 3))
	(if (eq (car key) 2)
		(progn
			(setq kstr (cons (cadr key) kstr))
			(princ (chr (cadr key)))
		)
	)
)
(if (eq (car key) 3)
	(if (setq ent (nentselp (cadr key)))
		(setq ent (entget (car ent)))
		(progn (princ "\nAucune sélection") (setq ent nil))
	)
	(foreach n kstr (setq ent (strcat (chr n) ent)))
)
)

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

Posté(e)

Ah ah ! Mister grread !

 

Très intéressant, j'ai essayé d'améliorer la routine en lui adjoignant un truc que j'avais pour récupérer les saisies au clavier et qui prend en compte la touche "Retour/effacer".

 

La routine, renommée GetEntStr, requiet un argument (le message d'invite ou nil) et retourne un nom d'entité (ename), une chaine non vide ou nil.

 

;; GetEntStr (d'après Bonuscad)
;; Demande à l'utilisateur de sélectionner un objet ou
;; d'entrer une chaîne de caractères
;;
;; Argument
;; msg : un message d'invite ou nil
;; (défaut : "Sélectionnez un objet ou entrez chaîne de caractère: ")
;;
;; Retour
;; un nom d'entité, une chaîne non vide ou nil

(defun GetEntStr	(msg / loop key pt ent str)
 (setq loop T)
 (princ (strcat "\n" msg))
 (while (and (setq key (grread T 4 2)) (/= (car key) 3) loop)
   (cond
     ((= 5 (car key))
      (setq pt (cadr key))
     )
     ((equal key '(2 13))
      (setq loop nil)
     )
     (T
      (if (= (cadr key) 8) ;_ 8 = retour/effacer
 (or
   (and	str
	(/= str "")
	(setq str (substr str 1 (1- (strlen str))))
	(princ (chr 8))
	(princ (chr 32))
   )
   (setq str nil)
 )
 (or
   (and str (setq str (strcat str (chr (cadr key)))))
   (setq str (chr (cadr key)))
 )
      )
      (and str (princ (chr (cadr key)))) ;_ affichage sur la ligne de commande
     )
   )
 )
 (cond
   ((and (listp (cadr key)) (setq ent (ssget pt))) (ssname ent 0))
   ((and str (/= str "")) str)
   (T nil)
 )
)


;; Exemple d'utilisation pour obtenir un nom de calque
(defun getlay (/ lay)
 (while (not
   (and	(setq lay (GetEntOrString
		    "Spécifiez le calque ou sélectionnez un objet: "
		  )
	)
	(or (= (type lay) 'ENAME)
	    (tblsearch "LAYER" lay)
	)
   )
 )
   (if	lay
     (princ (strcat "\nLe calque \"" lay "\" n'existe pas."))
     (princ "\Aucun objet sélectionné.")
   )
 )
 (if (= (type lay) 'STR)
   lay
   (cdr (assoc 8 (entget lay)))
 )
) 

 

[Edité le 19/12/2007 par (gile)]

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

Posté(e)

Grread... Ah bah oui !!!

 

Merci à vous deux, cette bout de code risque d'être bien pratique, dans beacoups de routines !!!

 

Dément...

 

A bientot !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

J'ai apporté une petite amélioration (la possibilité de spécifier un message d'invite) et j'ai ajouté un exemple d'utilisation pour récupérer un nom de calque valide.

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

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é