Aller au contenu

AND ne fonctionne plus


Messages recommandés

Invité spartacuss
Posté(e)

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]

Posté(e)

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)

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

Posté(e)

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

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

Posté(e)

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

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é