mi1 Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Bonjours à tous!Désolé de poster un sujet aussi courant mais je n'arrive pas à trouver une solution. Voila, je veux une routine demandant à l'utilisateur de tracer un polygone puis récuperer les block (avec un filtre) contenu dans ce polygone. Il me semble que j'y suis presque mais le code si dessous me renvoie toujours "nil"...Pourriez vous m'aider s'il vous plait(comme vous avez pu vous en douter je débute en Lisp!!!!) (setq pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : ") lp pnt1 pntlst (list pnt1) ) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: ")) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2) ) (redraw) (if (setq ss (ssget "CP" pntlst '((0 . "INSERT")(2 . "ED10")))) (and (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) (setq n -1 ) ) )
Patrick_35 Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Salut (ssget "_WP" pntlst '((0 . "INSERT"))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Salut et bienvenue, Je ne pense pas que le problème vienne du fait d'utiliser "_WP" (fenêtre) ou "_CP" (capture) mais plutôt du fait que n n'est initialisé qu'après la boucle while. (if (setq ss (ssget "CP" pntlst '((0 . "INSERT") (2 . "ED10")))) (progn (setq n -1) (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) ) ) PS : Quand tu postes du code, pour le rendre plus lisible utilise les bbcodes : [surligneur][[/surligneur][surligneur]code[/surligneur][surligneur]][/surligneur] ici le code [surligneur][[/surligneur][surligneur]/code[/surligneur][surligneur]][/surligneur] donne : ici le code Accessible via l'icône [#] : http://img94.imageshack.us/img94/8380/bbcode.png Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Salut!Merci pour cette réponse rapide!Alors, oui effectivement c'est _WP que j'avais, une petite ereur de transmisssion. Mais mon probleme reste intact! En fait ma routine fonctionnait avec ssget "X" mais maintenant il semblerait que mon code ne "trouve" rien à l'interieur du polygone tracé par l'utilisateur... Ou que le polygone n'en ai pas un? Je suis perdu j'avoue, je tourne en rond! Je remet le bout de code corrigé : (setq pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : ") lp pnt1 pntlst (list pnt1) ) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: ")) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2) ) (redraw) (if (setq ss (ssget "_WP" pntlst '((0 . "INSERT")(2 . "ED10")))) (and (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) (setq n -1 ) ) )
Titifonky Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Bonjour,Ca fonctionne bien chez moi si j'initialise ma variable avant le "while".Je ne pense pas que l'utilisation du "and" dans le bloc soit la meilleur solution. La fonction "progn" permet de regrouper des fonctions dans un même bloc et de retourner la valeur de la dernière expression évaluée. (if (setq ss (ssget "CP" pntlst '((0 . "INSERT") (2 . "ED10")))) ([surligneur]progn (setq n -1) [/surligneur] (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst))))) www.le-metal.net, sur la métallerie
Titifonky Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 mince, trop tard :) www.le-metal.net, sur la métallerie
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Merci pour la précision de présentation. Je poste pour la premiere fois même si ca fait un moment que votre forum m'aide!Pour l'initialisation de n je ne vois pas où je pourrait la faire d'autre, ni ce que ca changerait... Ca fonctionnait très bien quand j'utilisais ssget"X"... Seule le mode de sélection à changé... Enfin je crois.
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Aîe!! Ca se croise les message!! Merci à tous, j'ai matière à réfléchir et Titifonky viens de m'apprendre ce a quoi "progn" sert!!! Je test de suite!!!
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Rhaaaaaaaaaaaaa!Il me renvoie toujours Nil!!Quelqu'un aurait-il une autre idée? Je sèche... Peut etre du coté de la saisie des points? De la "reconnaissance" du polygone? (defun C:RB30 (/ rot n ss ent elst pt1) (if (and (setq n -1) (setq pt1(getpoint "\nSélectionnez le premier point: ")) (setq rot(getangle pt1 "\n \n \nSélectionnez le deuxième point: ")) (setq pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : ") lp pnt1 pntlst (list pnt1) ) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: ")) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2) ) (redraw) ) ( (if (setq ss (ssget "_WP" pntlst '((0 . "INSERT")(2 . "ED10")))) (progn(setq n -1) (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) (setq n -1 ) ) ) ) ) )
Titifonky Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Comme écrit dans l'aide Autocad, la fonction "getangle" renvoie un angle en radian. Il faut donc le transformer en degré ( x 180 / PI) www.le-metal.net, sur la métallerie
(gile) Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Re, Attention à l'utilisation de (if (and ...) ...)Si une des conditions dans le (and .. ) retourne nil l'expression ne sera pas exécutée.Or (redraw) retourne toujours nil. Ton code corrigé (defun C:RB30 (/ rot n ss ent elst pt1 pnt1 lp pntlst) (if (and (setq n -1) (setq rot (getangle pt1 "\n \n \nSélectionnez le deuxième point: ") ) (setq pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : " ) lp pnt1 pntlst (list pnt1) ) ) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: " ) ) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2 ) ) ) (redraw) (if (setq ss (ssget "_WP" pntlst '((0 . "INSERT") (2 . "ED10")))) (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) ) ) Et en cadeau de bienvenue une fonction pour faire une sélection par fenêtre, capture ou trajet avec un filtre et qui permet les zooms pendant la saisie des points. (c'est pas vraiment niveau débutant, mais tu peux l'utiliser et avec le temps essayer de la déchiffrer) Exemples d'utilisation :- sélection par capture de blocs : (grsel "_CP" '((0 . "INSERT"))) - sélection par trajet sur le calque 0 : (grsel "_F" '((8 . "0"))) - pour ta commande :(defun C:RB30 (/ rot ss ent elst) (if (and (setq rot (getangle "\nSpécifiez la rotation: ")) (setq ss (grsel "_WP" '((0 . "INSERT") (2 . "bloc")))) (setq n -1) ) (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst)) ) ) (princ) ) La fonction grsel (qui doit être chargée pour pouvoir être utilisée);; GrSel (gile) ;; Invite l'utilisateur à spécifier des points pour une sélection ;; par fenêtre polygonale, capture polygonale ou trajet ;; Retourne un jeu de sélection (ou nil) ;; ;; Arguments ;; mode: le mode de sélection ("_CP", "_WP" ou "_F") ;; fltr: un filtre de sélection ou nil (defun grsel (mode fltr / *error* pt ptlst gr loop) (defun *error* (msg) (or (= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (redraw) (princ) ) (setq pt (getpoint "\nSpécifiez le premier point: " ) ptlst (list pt) loop T ) (princ "\nSpécifiez le point suivant ou : ") (while (and (and (setq gr (grread T 12 0)) loop)) (redraw) (grvecs (cons -8 (apply 'append (mapcar 'list ptlst (cdr ptlst)))) ) (cond ((= (car gr) 5) (grdraw (car ptlst) (cadr gr) 8 1)) ((= (car gr) 3) (setq ptlst (cons (cadr gr) ptlst)) (princ "\nSpécifiez le point suivant ou : ") ) (T (redraw) (setq loop nil)) ) ) (ssget mode ptlst fltr) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Non, ca ca me va, mes blocs se tourne dans la direction décrite par les deux points cliqués par l'uilisateur. Et tout ca marchait avec ssget"X".. Je pense vraiment que je rate quelque chose au niveau du polygone. Soit je ne récupère pas ce qui est à l'interieur soit il est mal dessiné (probleme de systeme de coordonnées? ou probleme de fermeture du polygone?) et donc vide..J'ai peut etre mal renseigné la fonction ssget? ssget[mode][points][liste de point][filtre]?
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Merci Gille!J'ai pas encore testé mais l'explication me plait! Effectivement je ne suis pas encore sensible à certaines suptilités des fonctions que j'utilise un peu à tatons!Je m'y met!
Titifonky Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Tu écrit : (and [surligneur](setq n -1) ;c'est en trop[/surligneur] (setq pt1 (getpoint "\nSélectionnez le premier point: ")) (setq rot (getangle pt1 "\n \n \nSélectionnez le deuxième point: ")); (setq pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : ") lp pnt1 pntlst (list pnt1)) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: ")) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2)) [surligneur](redraw);cette fonction renvoie toujours 'nil donc ta condition n'est pas validée[/surligneur] ) J'ai dis une bêtise pour la fonction "getangle", on a besoin d'un angle en radians Le code nettoyé : (defun C:RB30 (/ rot n ss ent elst pt1) (if (and (setq pt1 (getpoint "\nSélectionnez le premier point: ") rot (getangle pt1 "\nSélectionnez le deuxième point: ") pnt1 (getpoint "\nSélection des blocs : Sélectionnez le premier coin : ") lp pnt1 pntlst (list pnt1)) (while (setq pnt2 (getpoint lp "\nSélectionner le point suivant ou taper ENTRER pour valider: ")) (grdraw lp pnt2 8 1) (setq pntlst (cons pnt2 pntlst) lp pnt2))) (if (setq ss (ssget "_WP" pntlst '((0 . "INSERT")))) (progn (setq n -1) (while (setq ent (ssname ss (setq n (1+ n)))) (setq elst (entget ent)) (entmod (subst (cons 50 rot) (assoc 50 elst) elst))))))) www.le-metal.net, sur la métallerie
Titifonky Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Encore trop tard www.le-metal.net, sur la métallerie
mi1 Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Ouf! Ca y est ! Un grand merci! J'aurais jamais compris seul!!Bonne journée et à bientôt peut etre.
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