Aller au contenu

Messages recommandés

Posté(e)

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 )
          )
)

 

Posté(e)

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

Posté(e)

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 )
          )
)

 

Posté(e)

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
Posté(e)

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.

Posté(e)

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!!!

Posté(e)

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 )
          )
)
   )

 )

)

Posté(e)

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

Posté(e)

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]?

Posté(e)

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!

Posté(e)

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

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é