ASTERIXII Posté(e) le 18 mai 2013 Posté(e) le 18 mai 2013 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 ENT12) Normalement je teste ENT1 pour savoir si une ligne a été sélectionnée3) 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
-Olivier- Posté(e) le 18 mai 2013 Posté(e) le 18 mai 2013 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
ASTERIXII Posté(e) le 18 mai 2013 Auteur Posté(e) le 18 mai 2013 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.
(gile) Posté(e) le 18 mai 2013 Posté(e) le 18 mai 2013 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
ASTERIXII Posté(e) le 18 mai 2013 Auteur Posté(e) le 18 mai 2013 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 ?
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