Aller au contenu

Gestion *error* / nil et entsel


Messages recommandés

Posté(e)

Bonjour,

Je cherche une solution pour gérer entsel qui retourne nil.

Mon lisp doit insérer un bloc sur une ligne :

 

1) Je sélection une ligne avec entsel et place la valeur dans ENT1

2) Normalement je teste ENT1 pour savoir si une ligne a été sélectionnée

3) Je récupère dans IP le point d’insertion

4) ……

 

Je voudrais qu’au point 2) si je n’ai pas choisi une ligne, (donc retourne nil) le lisp insérer mon bloc au point ou j’ai cliqué, et sans continuer vers 3) . Comment récupérer un point d’insertion autrement qu’avec entsel ?

 

Mais le problème c’est que j’ai besoin des informations retournée par entsel (point, calque, angle… de la ligne) si l'utilisateur à bien sélectionnée une ligne.

 

Une partie du code

(defun c:SNC_L6 ( / *error* oldsnap bname ip ent1 ent2 ep1 ep2 ang edata ip1 ip2)

(setq SNC_err 0)
;**** gestion des erreurs
(defun *error* (errmsg)
	(setvar "OSMODE" 544)
	(setvar "OSMODE" oldsnap)
	(setvar "BLIPMODE" 1)
	(setvar "CMDECHO" 1)
(if (= SNC_err 1) (alert "N'est pas un réseau : "))
(if errmsg  (print errmsg) )
(princ)
)
;****
(setq oldsnap (getvar "OSMODE"))
(setvar "OSMODE" 544)
(setvar "BLIPMODE" 0)
(setvar "CMDECHO" 0)

(setq bname "CV_Vanney.dwg"); pour essai nom du bloc


(setq ENT1 (entsel "\nChoix du point sur le réseau :")) ;ENT1

 ;gestion erreur si pas de ligne selectionnée
 ;(if (= ENT1 nil) <---- ici gestion de nil

(setq IP (osnap (cadr ENT1) "_nea")) ;point insertion


(setq entity (car ENT1))
(setq name (entget entity))
(setq SNC_CAL (cdr (assoc 8 name))) ; nom du calque
(setq SNC_COUL (cdr (assoc 62 (entget (tblobjname "LAYER" SNC_CAL))))) ; couleur du calque

;* verifier le nom du calque (si il exite)
(setq LTexte (strlen SNC_CAL)) ; longueur de la chaine
(setq Fin_tx (substr SNC_CAL (- LTexte  5) 5))
(if (or (= Fin_tx "_Equi") (= Fin_tx "_Text"))
(progn 
	(setq SNC_err 1)
	(exit)

)
)	
;*
(setq SNC_CAL (strcat SNC_CAL "_Equip")) ; calque equipement pour le réseau

Posté(e)

Bonjour ASTERIXII,

 

Tu peux le faire en insérant la sélection dans une boucle WHILE, comme ceci par exemple :

 

(while (not (and (/= ent1 nil)
    (= (cdr (assoc 0 (entget (car ent1)))) "LINE")))
 (setq ENT1 (entsel "\nChoix du point sur le réseau :"))
 )

 

Tant que la sélection est vide ou que l'objet sélectionné n'est pas une ligne, aors le progamme repose la demande.

 

Olivier

Posté(e)

Bonjour Olivier,

Ton idée est bonne, mais si je veux derouter le lisp pour qu'il insert le bloc sans trouver de ligne ?

 

J’ai pensé éventuellement à utiliser la gestion des erreurs avec nil, et de faire getpoint puis insérer le bloc.

 

Mais je voulais savoir si il y avait le moyen d’éviter de reposer la question getpoint et d’utiliser ma première action entsel. Car j’ai bien fait une action à l’écran avec entsel.

Posté(e)

Salut,

 

Si je comprends bien ce que tu veux faire, tu peux utiliser getpoint pour obtenir un point, puis nentselp pour tester si le point cliqué est sur une entité.

 

(if (setq pt (getpoint "\nChoix du point sur le réseau: "))
 (if (setq nent (nentselp pt))
   (progn
     ;; ici le code pour traiter l'entité sélectionnée
   )
   (progn
     ;; ici le code pour insérer le bloc sur pt
   )
 )
)

 

PS: Attention la liste retournée par nentselp est différente suivant que l'entité sélectionnée est une entité complexe (bloc, polyligne 2d ou 3d, maillage) ou une entité simple.

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

Posté(e)

Bonjour Gile,

 

Toujours aussi efficace.

 

J'ai fait un petit test avec une partie du code, et cela fonctionne bien

  (setq pt (getpoint "\nChoix du point sur le réseau: "))
 (setq sel (nentselp pt))

 

Pourquoi une partie me diras-tu, parce-que entre temps j'ai modifier mon code.

Je ne recupere plus la selection de l'entité dans cette routine, mais dans une autre, qui elle même permet d'insert des blocs.

Il ne faut pas que je me trompe dans les fermetures de )

 

Question: Pourquoi la selection avec une condition if ? c'est juste pour être sur d'avoir un point ?

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é