Invité spartacuss Posté(e) le 11 mai 2011 Posté(e) le 11 mai 2011 BONJOUR voila mon programme ci-joint , dans la dernière partie de mon programme je veux que la distance ddd vérifie 4 conditions a la fois mais malheureusement elle ne vérifie que le premier mémé si j'ai met AND je sait pas pourquoi je suis crevé bien amicalement [(defun translate (ptins coordinate /) ; translate from WSC to OCS (mapcar'+ ptins coordinate))(defun c:smff()(setq ins (ssget))(setq len (sslength ins))(setq i 0)(setq j 0)(setq insname(list))(setq ptins (list)) (while (< i len) (setq insname (append insname (list(ssname ins i)))) (setq i (1+ i)) ) (while (< j len) (setq ptins (append ptins (list(cdr (assoc 10 (entget (nth j insname )))))))(setq j (1+ j))) (setq center (list)) (setq ent(tblobjname "BLOCK" "Ms")) (setq n -1) (while (< (setq n (1+ n)) len) (setq center nil) ( while (setq ent (entnext ent)) (if (eq "CIRCLE" (cdr (assoc 0 (entget ent)))) (progn (setq cor (cdr (assoc 10 (entget ent)))) ;(translate (cor ptins))) (setq center (append center (list cor))) ))) ; (setq cordi(cdr (nth n ptins))) (setq allc(append allc (list center))) ) ;=============================================================================================================== ;(setq n (1+ n)) (setq lcord (length center)) (setq lins (length ptins)) (setq sname1 (list)) (setq sname2 (list)) (setq sname3 (list)) (setq sname5 (list)) (setq distinter1 (list)) (setq distinter2 (list)) (setq k -1) (while (< (setq k (1+ k)) Lins) (setq s -1) (setq sname2 nil) (while (< (setq s (1+ s)) Lcord) (setq sname1 (translate (nth k ptins)(nth s center))) (setq sname2 (append sname2 (list sname1))) ) (setq sname3 (append sname3 (list sname2))) ) ;(princ sname3) (setq sname4 (list)) (setq q 0) (setq Lcor(1- Lcord)) (while (< q Lcor) (setq sname4 (distance (nth q (car allc)) (nth (setq q (1+ q)) (car allc)))) (setq distinter1(append distinter1(list sname4))) ) (princ distinter1) (setq x 0) (setq d5 500.0) (setq d7 707.107) (setq d10 1000.0) (setq d11 1118.03) ;(princ d5) (while (< x lcor) (setq ddd (nth x distinter1)) (cond ((and(/= ddd d5)(/= ddd d7)(/= ddd d10)(/= ddd d11)) ;(if (/= ddd d5) ;(progn (alert "une des bolle n'est pas a sa place") (command "cercle" (nth x (car sname3)) "280" 0.8) (setq x(1+ x))) ;(setq lc(1+ lcor))) ) (t (setq x(1+ x))) ) (princ) )] [/code]
Bred Posté(e) le 11 mai 2011 Posté(e) le 11 mai 2011 Salut,j'ai du mal à lire ton code, désolé.Mais à première vu, j'ai l’impression que tu n'utilises pas la fonction cond correctement.Si tu veux faire une condition sur 1 seul groupe d'élément, utilises (if...cond permet de passer plusieurs test, et s'arrête sur le premier T rencontré.Si je comprends ton code, tu fait un seul test, même si CE test contient 4 tests d'inégalité, ça n'est toujours qu'un test. Test ça à la place : (if (and (/= ddd d5 )(/= ddd d7) (/= ddd d10) (/= ddd d11)) (progn ... si T...) (progn ... si nil ...) ) ; end if [Edité le 11/5/2011 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité spartacuss Posté(e) le 12 mai 2011 Posté(e) le 12 mai 2011 BONJOUR merci pour ta réponse , j'ai remplacer cond avec le if comme vous avez dit mais je trouve les même résultats peut être que j'ai un autre problème dans le programme cordialement
Bred Posté(e) le 12 mai 2011 Posté(e) le 12 mai 2011 ... on est bien d'accord que tu veux faire cela : (setq ddd 1 d5 6 d7 3 d10 4 d11 4) (if (and (/= ddd d5 )(/= ddd d7) (/= ddd d10) (/= ddd d11)) (princ "Tout est différend !") (princ "au moins UNE Valeur égale") ) Si rien égale ddd, tu passes dans "Tout est différend !" Si au moins une variable = ddd, tu passe dans "au moins UNE Valeur égale". Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité spartacuss Posté(e) le 12 mai 2011 Posté(e) le 12 mai 2011 RE à peut prés ça,je veux qd mon programme détecte que la distance ddd et déférente de d5 ,d7;d10 et d11 trace une cercle et affiche une alerte merci d'avance cordialement
bonuscad Posté(e) le 12 mai 2011 Posté(e) le 12 mai 2011 Hum ! Déjà, si tu veux pouvoir déboguer un programme en lisp il te faut l'INDENTER correctement pour pouvoir le lire/l'interpréter plus facilement, et cela éviterait que quand tu mets en remarque une variable ou une fonction cela est une incidence sur l’appariement des parenthèses. J'ai pas bien compris la démarche de ton code, néanmoins le voici bien présenté et non bogué, par contre je ne sais pas s'il est fonctionnel par rapport à ton souhait obscur. (defun translate (ptins coordinate / ) ; translate from WSC to OCS (mapcar'+ ptins coordinate) ) (defun c:smff( / ins len i j insname ptins center ent n cor allc lcord lins sname1 sname2 sname3 sname4 sname5 distinter1 distinter2 k s q x d5 d7 d10 d11 ddd lc) (setq ins (ssget) len (sslength ins) i 0 j 0 insname(list) ptins (list) ) (while (< i len) (setq insname (append insname (list(ssname ins i))) i (1+ i) ) ) (while (< j len) (setq ptins (append ptins (list(cdr (assoc 10 (entget (nth j insname )))))) j (1+ j) ) ) (setq center (list)) (setq ent(tblobjname "BLOCK" "Ms") n -1 ) (while (< (setq n (1+ n)) len) (setq center nil) (while (setq ent (entnext ent)) (if (eq "CIRCLE" (cdr (assoc 0 (entget ent)))) (progn (setq cor (cdr (assoc 10 (entget ent)))) ;(translate (cor ptins)) (setq center (append center (list cor))) ) ) ) ;(setq cordi(cdr (nth n ptins))) (setq allc (append allc (list center)) ent(tblobjname "BLOCK" "Ms") ) ) ;=============================================================================================================== ;(setq n (1+ n)) (setq lcord (length center) lins (length ptins) sname1 (list) sname2 (list) sname3 (list) sname5 (list) distinter1 (list) distinter2 (list) k -1 ) (while (< (setq k (1+ k)) Lins) (setq s -1 sname2 nil ) (while (< (setq s (1+ s)) Lcord) (setq sname1 (translate (nth k ptins)(nth s center)) sname2 (append sname2 (list sname1)) ) ) (setq sname3 (append sname3 (list sname2))) ) ;(princ sname3) (setq sname4 (list) q 0 Lcor(1- Lcord) ) (while (< q Lcor) (setq sname4 (distance (nth q (car allc)) (nth (setq q (1+ q)) (car allc))) distinter1 (append distinter1 (list sname4)) ) ) (princ distinter1) (setq x 0 d5 500.0 d7 707.107 d10 1000.0 d11 1118.03 ) ;(princ d5) (while (< x lcor) (setq ddd (nth x distinter1)) (cond ((and(/= ddd d5)(/= ddd d7)(/= ddd d10)(/= ddd d11)) ;(if (/= ddd d5) ;(progn (alert "une des bolle n'est pas a sa place") ;(command "cercle" (nth x (car sname3)) "280" 0.8) ???? (command "_.circle" "_none" (nth x (car sname3)) 280.0) (setq x (1+ x)) ;) (setq lc (1+ lcor)) ;) ) (T (setq x (1+ x))) ) ) (princ) ) Je te laisse trouvé ce que j'ai pu ajusté dans ton code, j'ai déjà fais l'effort de le lire.Va pas tout faire... :exclam: [Edité le 12/5/2011 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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